分类广告


推荐文章

  • 没有找到任何内容!
您当前的位置:中国站长下载网络编程PHP专区 → 文章内容

用PHP实现一个文本型小论坛的源码(二)

  • 作者:佚名    来源:不详    发布时间:2006-2-26 2:03:51
  • 字体大小:
这节要谈的是如何显示文章与评论。

这部分只用了一个文件来实现show
.php3内含了一个发表评论的表单。



可以接受外部调用时传来的一个参数
:

$id 文件
不含扩展名



同时本程序也可接受自身传递来的四个参数




$id 隐含类型
就是外部传来的$id再传一遍 :)

$name 文本
评论者大名

$email 文本
评论者的email可为空

$content 多行文本
评论内容



程序如下




<?php



//打开.info文件和.body文件

$r1=file("../page/".$id.".info"); //还记得我的目录和文件结构吧。

$r2=file("../page/".$id.".body");



//取info文件建立时间,格式化成字串

$dd=date("Y-m-j",filemtime("../page/".$id.".info"));



//取点击数,加1,注意这里要加一个回车!!!

//因为PHP是弱类型的语言,你给它+1,它就变成数值了,所以再给个回车变 //回字串好写入文件

$r1[4]=($r1[4]+1)."n";



//如果是自身调用,则说明有评论,那就写入吧…

if(!empty($name) and !empty($content)) {



//我说过用r0、r1…作评论的扩展名

$fn="../reply/".$id.".r".chop($r1[5]);



$r1[5]=($r1[5]+1); //回复数加1



$c=nl2br($content);

$d=date("Y-m-j H:i:s");

$fp=fopen($fn,"w");



fputs($fp,$name."n"); fputs($fp,$emailadd."n");

fputs($fp,$d."n"); fputs($fp,$c."n");

fclose($fp);



}



//先看一下有没有相应的info文件

if(!file_exists("../page/".$id.".info"))

{ echo "没有找到文件!";exit;}



//先把改动了的点击数与回复数写回到文件

$fp=fopen("../page/".$id.".info","w");

for($i=0;$i<6;$i++){

fputs($fp,$r1[$i]);

}

fclose($fp);



//打开每个评论文件,读入一个二维数组

for($i=0;$i<$r1[5];$i++){

$f="../reply/".$id.".r".$i;

if(!file_exists($f))continue;

$r3[]=file($f);

}



?>



现在我们得到三个数组


$r1
文章标题、作者、email、点击数、回复数

$r2
文章内容

$r3
[]这是一个二维数组

评论数 X 每个评论的信息
(作者、email、时间、内容)

$dd
这是文章发表的时间我们取出来的记得吧。



显示这三个数组了
应该很容易做到了就看你想要的格式了。



显示作者及时间代码如下




<?php

echo "[<a href=mailto:".$r1[2].">".$r1[1]."</a> ".$dd."]<br> 本文被阅 ".$r1[4]." 次";

?>



显示评论的代码如下




<?php

$k
=count($r3);

if($k>0){

for($i=0;$i<$k;$i++) {

echo "<p><img src="../images/dot.gif" width="12" height="12"><i><a href=mailto:".$r3[$i][1].">".$r3[$i][0]."</a> 于 ".$r3[$i][2]." 评论说:</i><br>";

for($j=3;$j<count($r3[$i]);$j++){

echo $r3[$i][$j];

}

echo "</p>";

}

}

?>



本节开始要讨论的是这个论坛的关键了
就是如何分页显示记录。



如果是数据库
又是怎样做分页显示的不知大家对此有没有经验。这方面的文章还是比较多的你完全可以找一个来参考一下。



我在这里所采用的方式
与用数据库的方法其实是大同小异而已。



1、两个函数



<?php



// 分页显示记录

// $item 栏目

// $offset 从哪个记录开始显示

// $number 要显示的记录个数



function view_page($item,$offset,$number){

$dire="page/";

$hd=opendir($dire);

while($fl=readdir($hd)) {

if($fl=="." or $fl=="..") continue;



if(strpos($fl,".info")){ //只找info文件

$fc=file($dire.$fl);

if(chop($fc[3])==$item){ //是不是所要的那个专栏的文章

$tmp=explode(".",$fl);

$ft=$tmp[0];

$list[$ft]=filemtime($dire.$fl); //按时间来排序

}

}

}



if(count($list)==0) return $list;

arsort($list);



for($i=0;$i<$offset;$i++) { //移指针到要显示的第一个记录上!!!

next($list);

}

for($i=0;$i<$number;$i++){ //开始读number个记录到数组中

$k=key($list);

if($k=="")break;

$v=file($dire.$k.".info");

$re_var[$k]=$v;



next($list);

}



return $re_var;



}





//计算某个栏目所发表文章篇数

//这比上一个函数简单多了,只是做个统计罢了



function count_page($item){

$dire="page/";

$hd=opendir($dire);

$re_var=0;



while($fl=readdir($hd)) {

if($fl=="." or $fl=="..") continue;

if(strpos($fl,".info")){

$fc=file($dire.$fl);

if($fc[3]!=$item)continue;

else $re_var++;

}

}



return $re_var;

}



?>



好了
这两个函数介绍完了如何用呢



就以“感悟生活”的页面文件life
.php3为例吧。



文件可以从外部调用
不用参数显示就从第一条记录开始。



如果是翻页
则发生了自身的调用那可接受参数$nr和$offset

分别表示本栏目总文章篇数以及要从第几篇文章开始显示
回忆一下上节我介绍的那两个分页显示函数再往下看吧。





先把这两个函数包含进来吧。

<?php



include("phtml/viewpage.php3");



//用$nr来贮存本栏目的记录数,就是有多少篇文章

//如果在参数中没有传递,则调用函数count_page()给个初始值。



if(empty($nr)){

$nr =count_page(2);

}

if( empty($offset) ) $offset=0;

//如果没有传递,给个初始值0表示从头开始显示



?>





我是用表格来显示每篇文章的标题、作者、时间、阅、评。

具体显示代码如下




<table width="100%" border="0" cellspacing="2" cellpadding="2" vspace="0" hspace="0">



<?php



//就是这句了!! 2表示第二个栏目,从$offset开始每页显示12条记录!!

$tmp=view_page(2,$offset,12);



//先判断一下是不是有值返回,下面的代码不用解释了吧。

if(is_array($tmp)){

for($j=0;$j<count($tmp);$j++){

$i=key($tmp);

echo "<tr bgcolor="#EBEBEB">";

echo "<td width="65%" height="20">"."<a href="phtml/show.php3?id=".$i."" target="_blank">".$tmp[$i][0]."</a></td>";

echo "<td width="10%" height="20"><a href=mailto:".$tmp[$i][2].">".$tmp[$i][1]."</a></td>";

echo "<td width="15%" height="20">".date("Y-m-j",filemtime("page/".$i.".info"))."</td>";

echo "<td width="5%" height="20">".$tmp[$i][4]."</td>";

echo "<td width="5%" height="20">".$tmp[$i][5]."</td>";

echo "</tr>";

next($tmp);

}

}

?>

</table>





以下语句用来显示翻页的一些按钮




<?php

$pages
=ceil($nr/12); //页数

$cpage=$offset/12+1; //当前页

echo "<td height="20" align="left">第".$cpage."页/共".$pages."页</td>";



echo "<td height="20" colspan="5" align="right">";



//第2页以后,允许直接翻到首页

if($cpage>=2) {

echo "<a href="".$PHP_SELF."?nr=".$nr."&offset=0"> 首页 </a>"; }



//除了第1页以外,都允许往前翻一页

if($offset) {

$preoffset=$offset-12; //记录往前移12条

echo "<a href="".$PHP_SELF."?nr=".$nr."&offset=".$preoffset.""> 前一页 </a>";

}



//除了最后一页,都可以往后翻一页

if($pages!=0 and $cpage!=$pages){

$newoffset=$cpage*12; //记录后移12!!注意$offset=0时,$cpage=1

echo "<a href="".$PHP_SELF."?nr=".$nr."&offset=".$newoffset.""> 下一页 </a>";

}



//可以往后翻,当然也可以直接翻到未页了

if($pages!=0 and $cpage<$pages){

$newoffset = ($pages-1)*12;

echo "<a href="".$PHP_SELF."?nr=".$nr."&offset=".$newoffset.""> 未页 </a>"; }



?>



在上面这些条件句中
调用自身时都给出了参数$nr and $offset。



这样就在文本论坛中
实现了翻页显示记录的功能。



好了
快写完了最后一节了。

把一些小功能也做个介绍吧。大家如果想下课了的
可以先走了。



1、搜索功能

我们只打开info文件
所以只能在标题中搜索关键字了。代码如下



<?php



function search_key($key) {

$dire
="../page/";

$hd
=opendir($dire);

while($fl=readdir($hd)) {

if($fl=="." or $fl=="..") continue;

if(strpos($fl,".info")){

$fc
=file($dire.$fl);

if(strstr($fc[0],$key)==FALSE)continue;

$tmp
=explode(".",$fl);

$ft
=$tmp[0];

$re_var
[$ft]=$fc;

}

}

return $re_var;

}



$r1
=search_key($key);



?>



2、发信给我

其实就是从表单中接收一些参数
然后调用了mail()函数而已。



<?php



require("err.php3"); //还记得这两个文件吧。

require("isemail.php3");



if($name =="" or $emailadd =="" or $title ==""){

show_err("朋友,有什么不可以说的呢?请填写完整吧。");

exit;

}

else {

if(!is_valid_email_addr($emailadd)) {

show_err("别玩我了,朋友!给个真的email吧。");

exit;

}



$subject = $name."从自由岛给你发来留言";

$message = $name."提出建议=> ".$title."n 联系信箱".$emailadd."n具体内容:n ".$content;

$endmail = "From: sharetop nReply-To: ".$emailadd."nX-Mailer: PHP/".phpversion();

$r=mail("ycshowtop@263.net",$subject,$message,$endmail);

if(!$r){

show_err("不能发送邮件!");

exit;

}



}



?>



3、岛主管理

对一些不太雅观的文章
我可不想每次都用FTP连上去删除所以也写了一个函数来在线删除文件



<?php



if($password!="123456789"){ //就我一个人,密码干脆放在程序中了。

echo "对不起,你不是老土人,不给你这个权利。";

exit;

}



//以下找出所有info文件,读出标题

$dire="../page/";

$hd=opendir($dire);

while($fl=readdir($hd)) {

if($fl=="." or $fl=="..") continue;

if(strpos($fl,".info")){

$tmp=explode(".",$fl);

$ft=$tmp[0];

$fc=file($dire.$fl);

$res[$ft]=$fc[0];

}

}

if(count($res)==0) {echo "现在还没有帖子,无须管理。";exit;}



?>



然后把读出的标题放入一个列表框中
值 。



<?php

while( list($key,$var)=each($res) ) {

echo "<option value="".$key."">".$var."</option>";

}

?>



对于选择的文件
删除它。



<?php



if($pw!="9111019"){echo "你无权访问本页!";exit;}



for($i=0;$i<count($select);$i++){

unlink
("../page/".$select[$i].".info");

unlink
("../page/".$select[$i].".body");

}



echo "已完成删除操作!";



?>



到此结束。



总算把这个论坛的源码一点点地招供出来。只是想与大家交流一下编程经验
我学PHP时间也不长所以有什么不妥的地方(我想肯定有很多地方是可以优化的)请务必要告诉我!!!!



我的联系地址是
ycshowtop@21cn.com

OICQ
= 11783627



个人主页




http
://www.sbiotech.onchina.net

生物技术快报
(用PHP+文本实现动态新闻更新)



http
://www.hnnubbs.onchina.net

湖南师大校友空间
(用php+mysql实现的虚拟社区)



http
://www.sharetop.onchina.net

自由岛
(用PHP+Mysql做的)



http
://sharetop.e-chome.net

自由岛II
(用PHP+文本做的)
<