文章详情

  • 游戏榜单
  • 软件榜单
关闭导航
热搜榜
热门下载
热门标签
php爱好者> php文档>用PHP实现一个文本型小论坛的源码(二)

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

时间:2007-02-17  来源:PHP爱好者

这节要谈的是如何显示文章与评论。

这部分只用了一个文件来实现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("[email protected]",$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时间也不长,所以有什么不妥的地方(我想肯定有很多地方是可以优化的),请务必要告诉我!!!!

我的联系地址是:[email protected]

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爱好者站 http://www.phpfans.net Linux|Apache|IIS.
相关阅读 更多 +
排行榜 更多 +
辰域智控app

辰域智控app

系统工具 下载
网医联盟app

网医联盟app

运动健身 下载
汇丰汇选App

汇丰汇选App

金融理财 下载