用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.
这部分只用了一个文件来实现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.
相关阅读 更多 +