用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 //如果你还记得.info的文件格式,下面这句话就不用我多说了吧。 echo " ![]() "; 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语法的应用。 好了,下一节我们讲如何显示文章与评论。 |
![]() |
百度中 用PHP实现一个文本型小论坛的源码(一) 相关内容 |
![]() |
Google搜索中 用PHP实现一个文本型小论坛的源码(一) 相关内容 |