top
Loading...
用PHP實現一個文本型小論壇的源碼(一)


第一次總結自己的東西,從哪開始呢?
寫一個程序,首先要確定的應是數據結構,因為我們沒有用到數據庫,所以就從文本文件的結構開始說起。

1、文件名的確定
我們采用time()函數來獲取用戶發帖時的時間值,做為文件名。這樣基本上可以避免了重復文件名的出現。所有與此文章相關的帖子均采用同一個名字加不同的擴展名。

一共設計了三種文件擴展名:

一個是.info記錄了本帖的一些基本信息,結構是:
1:文章標題
2:作者
3:作者email
4:欄目編號
5:點擊數
6:回復數

例:965634636.info內容如下
厚重的盔甲應聲而落
如霜
ycshowtop@21cn.com
2
23
1

另一個文件是.body記錄了文章的完全內容。就不說了。
最后一種比較復雜一些,用.r0 .r1 .r2 ……來表示回復的評論。
結構是:
1:作者
2:email
3:回應時間
4:回應內容

而.r0表示第1個評論、.r1表示第2個評論……

大家可能注意到了,我們在info文件中沒有記錄時間,對,我們可以根據文件建立的時間來作為文章發表的時間,所以,嘿嘿…,其實在回復的帖子中我們也可以不記錄的,不過我一不小心就……懶的改了。:)
其實這樣,程序也好寫一點了。


2、目錄結構
因為我在info中記錄了欄目,就沒有按欄目劃分目錄了。整個網站的目錄如下:

/-index.php 等一些基本的程序文件
|
|___phtml 放各個具體功能的php文件
|
|___images本站所用的圖像文件
|
|___ban與廣告有關的圖像文件或其它
|
|___include一些包含文件,主要是廣告欄、友情鏈接欄
|
|___page.info and .body
|
|___reply .r0 .r1 .r2 ……

其實文件結構出來了,程序寫起來就不困難了,是吧。
現在我們來討論一下如何顯示最新發表的文章和人氣最旺的文章。

1、相關函數
先介紹兩個用到的函數get_top_time和 get_top_hit。代碼如下:

//提取標題,按時間排序
//$number 指定所提取的標題個數

function get_top_time($number) {
$dire="page/";
$hd=opendir($dire);
while($fl=readdir($hd)) {//讀出此目錄下文件
if($fl=="." or $fl=="..") continue;
if(strpos($fl,".info")){ //如果是.info文件,則
$tmp=explode(".",$fl);
$ft=$tmp[0];

//以文件名(不含擴展名)為key,以建立時間為value
$list[$ft]=filemtime($dire.$fl);
}
}
if(count($list)==0) return $list; //如果沒有文件,則返回

arsort($list); //排序!!!

for($i=0;$i<$number;$i++) {
$k=key($list);
if($k=="")break;

//取出前number個,打開文件取信息放入二維數組$re_var,以文件名為key。
$fc=file($dire.$k.".info");
$re_var[$k]=$fc;

next($list);
}

return $re_var;
}


//提取標題按點擊排序

function get_top_hit($number) {
$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); //打開文件取點擊數放入數組中作值
$list[$ft]=chop($fc[4]);
}
}

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

for($i=0;$i<$number;$i++) {
$k=key($list);
if($k=="")break;
$v=file($dire.$k.".info");
$re_var[$k]=$v;

next($list);
}

return $re_var;
}

?>

2、調用函數方法

先包含進來

include("phtml/getitle.php3");

$r1=get_top_time(10); //取前10個放入二維數組r1中
$r2=get_top_hit(10);

?>

……

if(is_array($r1)){ //只有是數組說明有記錄,才列出記錄
for($j=0;$j $i=key($r1); //取鍵值
//如果你還記得.info的文件格式,下面這句話就不用我多說了吧。
echo "".$r1[$i][0]."[".$r1[$i][1]." ".date("Y-m-j",filemtime("page/".$i.".info"))."]
";
next($r1);
}
}
?>

我們已經知道列出最近文章與人氣最旺文章的方法,下面我們來看看如何實現發表文章的,其實知道了文件的結構,這一部分是很簡單的了。

1、也先介紹一下兩個函數

show_err($message);在一個窗口中以自定義的格式顯示一句錯誤,應該不用多說吧。就是先作好這個窗口,然后在某個地方顯示$message……

在判斷用戶是否給出了一個真實的email地址時,我用到了正則表達式。


function is_valid_email_addr($email_addr)
{
return eregi("^[_.0-9a-z-]+@([0-9a-z][0-9a-z-]+.)+[a-z]{2,3}$",$email_addr);
}

?>

要不要說這個表達式的含義呢?我看還是免了吧。
大家可以在“PHP中文用戶”找到正則表達式的詳細說明。

2、發表文章

從addpage.php3中的表單中接收到以下變量(至于表單的結構,限于篇幅,我就不說了):

$name 文本,作者大名
$emailadd 文本,作者email
$item 單選,發表欄目
$title 文本,文章標題
$content 多行文本,文章內容

處理這些變量,如下:


require("err.php3");
require("isemail.php3");

if($name =="" or $emailadd =="" or $title ==""){
//至少得給出大名、email和標題
show_err("發表文章請將信息填寫完整!");
exit;
}
else {
if(!is_valid_email_addr($emailadd)) {
//判斷一下是否真的是email地址
show_err("別玩我了,朋友!給個真的email吧。");
exit;
}

$c=nl2br($content);//把回車換成


$fbn="http://www.zhujiangroad.com/page/".time(); //這里用當前時間生成文件名

$fp=fopen($fbn.".info","w"); //建立文件,寫入信息
fputs($fp,$title."n");fputs($fp,$name."n");fputs($fp,$emailadd."n");
fputs($fp,$item."n");
fputs($fp,"0n");fputs($fp,"0");
fclose($fp);

//改文件屬性,因為以后我們要對它進行寫操作,加點擊數和回復數!!!
chmod($fbn.".info",0777);


$fp=fopen($fbn.".body","w"); //寫文章內容
fputs($fp,$c);
fclose($fp);

}
?>

寫到這里,我都有點不想寫下去了,各位是不是覺得太簡單了?!
的確,其實我講了我的文件結構,想必有很多朋友已經知道這個論壇是如何實現的了。現在我羅嗦的,其實都是一些很基本的PHP語法的應用。

好了,下一節我們講如何顯示文章與評論。
作者:http://www.zhujiangroad.com
來源:http://www.zhujiangroad.com
北斗有巢氏 有巢氏北斗