top
Loading...
用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 "

".$r3[$i][0]." 于 ".$r3[$i][2]." 評論說:
";
for($j=3;$j echo $r3[$i][$j];
}
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表示從頭開始顯示

?>


我是用表格來顯示每篇文章的標題、作者、時間、閱、評。
具體顯示代碼如下:




//就是這句了!! 2表示第二個欄目,從$offset開始每頁顯示12條記錄!!
$tmp=view_page(2,$offset,12);

//先判斷一下是不是有值返回,下面的代碼不用解釋了吧。
if(is_array($tmp)){
for($j=0;$j $i=key($tmp);
echo "
";
echo "";
echo "";
echo "";
echo "";
echo "";
echo "";
next($tmp);
}
}
?>
"."".$tmp[$i][0]."".$tmp[$i][1]."".date("Y-m-j",filemtime("page/".$i.".info"))."".$tmp[$i][4]."".$tmp[$i][5]."



以下語句用來顯示翻頁的一些按鈕:

$pages=ceil($nr/12); //頁數
$cpage=$offset/12+1; //當前頁
echo "第".$cpage."頁/共".$pages."頁";

echo "";

//第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+文本做的)
作者:http://www.zhujiangroad.com
來源:http://www.zhujiangroad.com
北斗有巢氏 有巢氏北斗