用PHP实现一个文本型小论坛的源码(一)
时间:2007-02-17 来源:PHP爱好者
从本帖开始,我将把一个基于文本文件的论坛《自由岛》的源码一一公开给大家。如果你还没看过,可以先到这个网址去瞧一下。
http://sharetop.e-chome.net
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
第一次总结自己的东西,从哪开始呢?
写一个程序,首先要确定的应是数据结构,因为我们没有用到数据库,所以就从文本文件的结构开始说起。
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
1、文件名的确定
我们采用time()函数来获取用户发帖时的时间值,做为文件名。这样基本上可以避免了重复文件名的出现。所有与此文章相关的帖子均采用同一个名字加不同的扩展名。
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
一共设计了三种文件扩展名:
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
一个是.info 记录了本帖的一些基本信息,结构是:
1:文章标题
2:作者
3:作者email
4:栏目编号
5:点击数
6:回复数
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
例:965634636.info内容如下
厚重的盔甲应声而落
如霜
[email protected]
2
23
1
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
另一个文件是.body 记录了文章的完全内容。就不说了。
最后一种比较复杂一些,用.r0 .r1 .r2 ……来表示回复的评论。
结构是:
1:作者
2:email
3:回应时间
4:回应内容
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
而.r0表示第1个评论、.r1表示第2个评论……
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
大家可能注意到了,我们在info文件中没有记录时间,对,我们可以根据文件建立的时间来作为文章发表的时间,所以,嘿嘿…,其实在回复的帖子中我们也可以不记录的,不过我一不小心就……懒的改了。:)
其实这样,程序也好写一点了。
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
2、目录结构
因为我在info中记录了栏目,就没有按栏目划分目录了。整个网站的目录如下:
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
/-index.php 等一些基本的程序文件
|
|___phtml 放各个具体功能的php文件
|
|___images 本站所用的图像文件
|
|___ban 与广告有关的图像文件或其它
|
|___include 一些包含文件,主要是广告栏、友情链接栏
|
|___page .info and .body
|
|___reply .r0 .r1 .r2 ……
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
其实文件结构出来了,程序写起来就不困难了,是吧。
现在我们来讨论一下如何显示最新发表的文章和人气最旺的文章。
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
1、相关函数
先介绍两个用到的函数get_top_time 和 get_top_hit。代码如下:
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
<?php
// 提取标题,按时间排序
//$number 指定所提取的标题个数
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
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];
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
//以文件名(不含扩展名)为key,以建立时间为value
$list[$ft]=filemtime($dire.$fl);
}
}
if(count($list)==0) return $list; //如果没有文件,则返回
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
arsort($list); //排序!!!
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
for($i=0;$i<$number;$i++) {
$k=key($list);
if($k=="")break;
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
//取出前number个,打开文件取信息放入二维数组$re_var,以文件名为key。
$fc=file($dire.$k.".info");
$re_var[$k]=$fc;
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
next($list);
}
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
return $re_var;
}
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
//提取标题按点击排序
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
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]);
}
}
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
if(count($list)==0) return $list;
arsort($list);
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
for($i=0;$i<$number;$i++) {
$k=key($list);
if($k=="")break;
$v=file($dire.$k.".info");
$re_var[$k]=$v;
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
next($list);
}
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
return $re_var;
}
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
?>
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
2、调用函数方法
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
先包含进来
<?php
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
include("phtml/getitle.php3");
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
$r1=get_top_time(10); //取前10个放入二维数组r1中
$r2=get_top_hit(10);
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
?>
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
……
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
<?php
if(is_array($r1)){ //只有是数组说明有记录,才列出记录
for($j=0;$j<count($r1);$j++){
$i=key($r1); //取键值
//如果你还记得.info的文件格式,下面这句话就不用我多说了吧。
echo "<img src="../images_php/200582211437966.gif" width="12" height="12"><a href="phtml/show.php3?id=".$i."" target="_blank">".$r1[$i][0]."</a><font color=#2bae8f><i>[".$r1[$i][1]." ".date("Y-m-j",filemtime("page/".$i.".info"))."]</font></i><br>";
next($r1);
}
}
?>
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
我们已经知道列出最近文章与人气最旺文章的方法,下面我们来看看如何实现发表文章的,其实知道了文件的结构,这一部分是很简单的了。
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
1、也先介绍一下两个函数
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
show_err($message);在一个窗口中以自定义的格式显示一句错误,应该不用多说吧。就是先作好这个窗口,然后在某个地方显示$message……
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
在判断用户是否给出了一个真实的email地址时,我用到了正则表达式。
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
<?php
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
function is_valid_email_addr($email_addr)
{
return eregi("^[_.0-9a-z-]+@([0-9a-z][0-9a-z-]+.)+[a-z]{2,3}$",$email_addr);
}
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
?>
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
要不要说这个表达式的含义呢?我看还是免了吧。
大家可以在“PHP中文用户”找到正则表达式的详细说明。
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
2、发表文章
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
从addpage.php3中的表单中接收到以下变量(至于表单的结构,限于篇幅,我就不说了):
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
$name 文本,作者大名
$emailadd 文本,作者email
$item 单选,发表栏目
$title 文本,文章标题
$content 多行文本,文章内容
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
处理这些变量,如下:
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
<?php
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
require("err.php3");
require("isemail.php3");
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
if($name =="" or $emailadd =="" or $title ==""){
//至少得给出大名、email和标题
show_err("发表文章请将信息填写完整!");
exit;
}
else {
if(!is_valid_email_addr($emailadd)) {
//判断一下是否真的是email地址
show_err("别玩我了,朋友!给个真的email吧。");
exit;
}
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
$c=nl2br($content);//把回车换成<br>
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
$fbn="../page/".time(); //这里用当前时间生成文件名
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
$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);
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
//改文件属性,因为以后我们要对它进行写操作,加点击数和回复数!!!
chmod($fbn.".info",0777);
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
$fp=fopen($fbn.".body","w"); //写文章内容
fputs($fp,$c);
fclose($fp);
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
}
?>
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
写到这里,我都有点不想写下去了,各位是不是觉得太简单了?!
的确,其实我讲了我的文件结构,想必有很多朋友已经知道这个论坛是如何实现的了。现在我罗嗦的,其实都是一些很基本的PHP语法的应用。
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
好了,下一节我们讲如何显示文章与评论。
php爱好 者站 http://www.phpfans.net php基础|php进阶|php模板.
http://sharetop.e-chome.net
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
第一次总结自己的东西,从哪开始呢?
写一个程序,首先要确定的应是数据结构,因为我们没有用到数据库,所以就从文本文件的结构开始说起。
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
1、文件名的确定
我们采用time()函数来获取用户发帖时的时间值,做为文件名。这样基本上可以避免了重复文件名的出现。所有与此文章相关的帖子均采用同一个名字加不同的扩展名。
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
一共设计了三种文件扩展名:
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
一个是.info 记录了本帖的一些基本信息,结构是:
1:文章标题
2:作者
3:作者email
4:栏目编号
5:点击数
6:回复数
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
例:965634636.info内容如下
厚重的盔甲应声而落
如霜
[email protected]
2
23
1
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
另一个文件是.body 记录了文章的完全内容。就不说了。
最后一种比较复杂一些,用.r0 .r1 .r2 ……来表示回复的评论。
结构是:
1:作者
2:email
3:回应时间
4:回应内容
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
而.r0表示第1个评论、.r1表示第2个评论……
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
大家可能注意到了,我们在info文件中没有记录时间,对,我们可以根据文件建立的时间来作为文章发表的时间,所以,嘿嘿…,其实在回复的帖子中我们也可以不记录的,不过我一不小心就……懒的改了。:)
其实这样,程序也好写一点了。
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
2、目录结构
因为我在info中记录了栏目,就没有按栏目划分目录了。整个网站的目录如下:
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
/-index.php 等一些基本的程序文件
|
|___phtml 放各个具体功能的php文件
|
|___images 本站所用的图像文件
|
|___ban 与广告有关的图像文件或其它
|
|___include 一些包含文件,主要是广告栏、友情链接栏
|
|___page .info and .body
|
|___reply .r0 .r1 .r2 ……
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
其实文件结构出来了,程序写起来就不困难了,是吧。
现在我们来讨论一下如何显示最新发表的文章和人气最旺的文章。
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
1、相关函数
先介绍两个用到的函数get_top_time 和 get_top_hit。代码如下:
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
<?php
// 提取标题,按时间排序
//$number 指定所提取的标题个数
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
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];
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
//以文件名(不含扩展名)为key,以建立时间为value
$list[$ft]=filemtime($dire.$fl);
}
}
if(count($list)==0) return $list; //如果没有文件,则返回
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
arsort($list); //排序!!!
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
for($i=0;$i<$number;$i++) {
$k=key($list);
if($k=="")break;
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
//取出前number个,打开文件取信息放入二维数组$re_var,以文件名为key。
$fc=file($dire.$k.".info");
$re_var[$k]=$fc;
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
next($list);
}
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
return $re_var;
}
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
//提取标题按点击排序
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
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]);
}
}
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
if(count($list)==0) return $list;
arsort($list);
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
for($i=0;$i<$number;$i++) {
$k=key($list);
if($k=="")break;
$v=file($dire.$k.".info");
$re_var[$k]=$v;
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
next($list);
}
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
return $re_var;
}
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
?>
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
2、调用函数方法
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
先包含进来
<?php
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
include("phtml/getitle.php3");
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
$r1=get_top_time(10); //取前10个放入二维数组r1中
$r2=get_top_hit(10);
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
?>
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
……
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
<?php
if(is_array($r1)){ //只有是数组说明有记录,才列出记录
for($j=0;$j<count($r1);$j++){
$i=key($r1); //取键值
//如果你还记得.info的文件格式,下面这句话就不用我多说了吧。
echo "<img src="../images_php/200582211437966.gif" width="12" height="12"><a href="phtml/show.php3?id=".$i."" target="_blank">".$r1[$i][0]."</a><font color=#2bae8f><i>[".$r1[$i][1]." ".date("Y-m-j",filemtime("page/".$i.".info"))."]</font></i><br>";
next($r1);
}
}
?>
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
我们已经知道列出最近文章与人气最旺文章的方法,下面我们来看看如何实现发表文章的,其实知道了文件的结构,这一部分是很简单的了。
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
1、也先介绍一下两个函数
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
show_err($message);在一个窗口中以自定义的格式显示一句错误,应该不用多说吧。就是先作好这个窗口,然后在某个地方显示$message……
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
在判断用户是否给出了一个真实的email地址时,我用到了正则表达式。
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
<?php
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
function is_valid_email_addr($email_addr)
{
return eregi("^[_.0-9a-z-]+@([0-9a-z][0-9a-z-]+.)+[a-z]{2,3}$",$email_addr);
}
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
?>
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
要不要说这个表达式的含义呢?我看还是免了吧。
大家可以在“PHP中文用户”找到正则表达式的详细说明。
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
2、发表文章
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
从addpage.php3中的表单中接收到以下变量(至于表单的结构,限于篇幅,我就不说了):
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
$name 文本,作者大名
$emailadd 文本,作者email
$item 单选,发表栏目
$title 文本,文章标题
$content 多行文本,文章内容
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
处理这些变量,如下:
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
<?php
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
require("err.php3");
require("isemail.php3");
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
if($name =="" or $emailadd =="" or $title ==""){
//至少得给出大名、email和标题
show_err("发表文章请将信息填写完整!");
exit;
}
else {
if(!is_valid_email_addr($emailadd)) {
//判断一下是否真的是email地址
show_err("别玩我了,朋友!给个真的email吧。");
exit;
}
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
$c=nl2br($content);//把回车换成<br>
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
$fbn="../page/".time(); //这里用当前时间生成文件名
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
$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);
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
//改文件属性,因为以后我们要对它进行写操作,加点击数和回复数!!!
chmod($fbn.".info",0777);
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
$fp=fopen($fbn.".body","w"); //写文章内容
fputs($fp,$c);
fclose($fp);
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
}
?>
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
写到这里,我都有点不想写下去了,各位是不是觉得太简单了?!
的确,其实我讲了我的文件结构,想必有很多朋友已经知道这个论坛是如何实现的了。现在我罗嗦的,其实都是一些很基本的PHP语法的应用。
wwww.chin aitpower.comVB0V7DSrHKd3ceyVLZ4nwodUv
好了,下一节我们讲如何显示文章与评论。
php爱好 者站 http://www.phpfans.net php基础|php进阶|php模板.
相关阅读 更多 +