用PHP实现一个文本型小论坛的源码(二) |
|||||||||||
这节要谈的是如何显示文章与评论。 这部分只用了一个文件来实现show.php3,内含了一个发表评论的表单。 可以接受外部调用时传来的一个参数: $id 文件名,不含扩展名 同时本程序也可接受自身传递来的四个参数: $id 隐含类型,就是外部传来的$id再传一遍 :) $name 文本,评论者大名 $email 文本,评论者的email,可为空 $content 多行文本,评论内容 源程序如下: //打开.info文件和.body文件 $r1=file("http://www.zhujiangroad.com/page/".$id.".info"); //还记得我的目录和文件结构吧。 $r2=file("http://www.zhujiangroad.com/page/".$id.".body"); //取info文件建立时间,格式化成字串 $dd=date("Y-m-j",filemtime("http://www.zhujiangroad.com/page/".$id.".info")); //取点击数,加1,注意这里要加一个回车!!! //因为PHP是弱类型的语言,你给它+1,它就变成数值了,所以再给个回车变 //回字串好写入文件。 $r1[4]=($r1[4]+1)."n"; //如果是自身调用,则说明有评论,那就写入吧… if(!empty($name) and !empty($content)) { //我说过用r0、r1…作评论的扩展名 $fn="http://www.zhujiangroad.com/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("http://www.zhujiangroad.com/page/".$id.".info")) { echo "没有找到文件!";exit;} //先把改动了的点击数与回复数写回到文件中 $fp=fopen("http://www.zhujiangroad.com/page/".$id.".info","w"); for($i=0;$i<6;$i++){ fputs($fp,$r1[$i]); } fclose($fp); //打开每个评论文件,读入一个二维数组 for($i=0;$i<$r1[5];$i++){ $f="http://www.zhujiangroad.com/reply/".$id.".r".$i; if(!file_exists($f))continue; $r3[]=file($f); } ?> 现在我们得到三个数组: $r1:文章标题、作者、email、点击数、回复数 $r2:文章内容 $r3[]:这是一个二维数组: 评论数 X 每个评论的信息(作者、email、时间、内容) $dd:这是文章发表的时间,我们取出来的,记得吧。 显示这三个数组了,应该很容易做到了,就看你想要的格式了。 显示作者及时间代码如下: echo "[".$r1[1]." ".$dd."] 本文被阅 ".$r1[4]." 次"; ?> 显示评论的代码如下: $k=count($r3); if($k>0){ for($i=0;$i<$k;$i++) { echo "
} } ?> 本节开始要讨论的是这个论坛的关键了,就是如何分页显示记录。 如果是数据库,又是怎样做分页显示的,不知大家对此有没有经验。这方面的文章还是比较多的,你完全可以找一个来参考一下。 我在这里所采用的方式,与用数据库的方法其实是大同小异而已。 1、两个函数 // 分页显示记录 // $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, 分别表示本栏目总文章篇数以及要从第几篇文章开始显示,回忆一下上节我介绍的那两个分页显示函数,再往下看吧。 先把这两个函数包含进来吧。 include("phtml/viewpage.php3"); //用$nr来贮存本栏目的记录数,就是有多少篇文章 //如果在参数中没有传递,则调用函数count_page()给个初始值。 if(empty($nr)){ $nr =count_page(2); } if( empty($offset) ) $offset=0; //如果没有传递,给个初始值0表示从头开始显示 ?> 我是用表格来显示每篇文章的标题、作者、时间、阅、评。 具体显示代码如下:
以下语句用来显示翻页的一些按钮: $pages=ceil($nr/12); //页数 $cpage=$offset/12+1; //当前页 echo " | 第".$cpage."页/共".$pages."页 | ";"; //第2页以后,允许直接翻到首页 if($cpage>=2) { echo " 首页 "; } //除了第1页以外,都允许往前翻一页 if($offset) { $preoffset=$offset-12; //记录往前移12条 echo " 前一页 "; } //除了最后一页,都可以往后翻一页 if($pages!=0 and $cpage!=$pages){ $newoffset=$cpage*12; //记录后移12!!注意$offset=0时,$cpage=1 echo " 下一页 "; } //可以往后翻,当然也可以直接翻到未页了 if($pages!=0 and $cpage<$pages){ $newoffset = ($pages-1)*12; echo " 未页 "; } ?> 在上面这些条件句中,调用自身时都给出了参数$nr and $offset。 这样就在文本论坛中,实现了翻页显示记录的功能。 好了,快写完了,最后一节了。 把一些小功能也做个介绍吧。大家如果想下课了的,可以先走了。 1、搜索功能 我们只打开info文件,所以只能在标题中搜索关键字了。代码如下: function search_key($key) { $dire="http://www.zhujiangroad.com/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()函数而已。 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连上去删除,所以也写了一个函数来在线删除文件。 if($password!="123456789"){ //就我一个人,密码干脆放在程序中了。 echo "对不起,你不是老土人,不给你这个权利。"; exit; } //以下找出所有info文件,读出标题 $dire="http://www.zhujiangroad.com/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;} ?> 然后把读出的标题放入一个列表框中,值 。 while( list($key,$var)=each($res) ) { echo ""; } ?> 对于选择的文件,删除它。 if($pw!="9111019"){echo "你无权访问本页!";exit;} for($i=0;$i unlink("http://www.zhujiangroad.com/page/".$select[$i].".info"); unlink("http://www.zhujiangroad.com/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+文本做的) |
![]() |
百度中 用PHP实现一个文本型小论坛的源码(二) 相关内容 |
![]() |
Google搜索中 用PHP实现一个文本型小论坛的源码(二) 相关内容 |