非递归法实现论坛树型结构及分页!!(心血结晶啊,呵呵)
发表于:2007-07-01来源:作者:点击数:
标签:
现将本人的实践结果show给大家,不足之处就是分页的方法不太好,不能显示具体的页数,可实在又没有其它更好的解决办法,只好先如此了,如果哪位有类似本论坛的分页方法,表赐教一二,二泉不胜感激!具体可访问我的个人小网站:http://web.nyist.net/~wbgwrq,
现将本人的实践结果show给大家,不足之处就是分页的方法不太好,不能显示具体的页数,可实在又没有其它更好的解决办法,只好先如此了,如果哪位有类似本
论坛的分页方法,表赐教一二,二泉不胜感激!具体可访问我的个人小网站:http://web.nyist.net/~wbgwrq,不废话了,开始吧......
//表的结构如下:
//creat.sql
//简单说明:RootId 论题序数;Layer:帖子层次,缩进的依据;Orders:帖子的顺序
CREATE TABLE over_post (
id int(11) NOT NULL auto_increment,
title varchar(80) NOT NULL default @#@#,
content text,
postat datetime NOT NULL default @#0000-00-00 00:00:00@#,
readed int(11) NOT NULL default @#0@#,
size int(11) NOT NULL default @#0@#,
rootid int(11) NOT NULL default @#0@#,
orders int(4) NOT NULL default @#0@#,
layer int(4) NOT NULL default @#0@#,
PRIMARY KEY (id)
) TYPE=MyISAM;
//creat.sql End
//发表根帖,即RootId,Layer,Orders为0的帖子
//said.
php
//begin
<form method="post" action="post.php">
<table width="81%" border="0" cellspacing="1" cellpadding="0" align="center">
<tr bgcolor="#66
CCCC">
<
td height="35" width="23%">
<div align="right">你的想法:
</div>
</td>
<td height="35" width="77%">
<input type="text" name="title" size="50" class="eq">
</td>
</tr>
<tr bgcolor="#66CCCC">
<td height="39" width="23%">
<div align="right">你的内容:
</div>
</td>
<td height="39" width="77%">
<textarea name="content" cols="50" rows="10" class="eq"></textarea>
</td>
</tr>
<tr bgcolor="#66CCCC">
<td colspan="2" height="24">
</td>
</tr>
<tr bgcolor="#66CCCC">
<td colspan="2" height="28">
<div align="center">
<input type="submit" name="said" value="先说这些">
<input type="reset" name="Submit2" value="从头再来">
</div>
</td>
</tr>
</table>
</form>
//said.php End
//帖子内容,且在本页进行跟帖
//content.php
//Begin
<?php
$result=
mysql_query("select
over_post.title,over_post.content,over_post.postat,over_post.readed,over_post.rootid,over_post.la
yer,over_post.orders from over_post where over_post.id=$id");
$readed=mysql_result($result,0,"readed");
$title=mysql_result($result,0,"title");
$content=mysql_result($result,0,"content");
$date=mysql_result($result,0,"postat");
$rootid=mysql_result($result,0,"rootid");
$orders=mysql_result($result,0,"orders");
$layer=mysql_result($result,0,"layer");
?>
<table width="90%" cellspacing="1" bgcolor="red" align="center">
<tr bgcolor="#FFFFFF">
<td width="12%">发表人:</td>
</tr>
<tr bgcolor="#FFFFFF">
<td width="12%">主 题:</td>
<td colspan="5">《<?php echo $title; ?>》 <font color="666666"><i>【
Readed:<?echo"$readed";?>】 <?echo"$date";?></i></font></td>
</tr>
<tr bgcolor="#FFFFFF">
<td width="12%">内 容:</td>
<td colspan="5"><?php echo $content; ?></td>
</tr>
</table>
<br>
<center>
论坛发表跟帖
<form method="post" action="post.php">
<table width="78%" cellspacing="0" align="center" cellpadding="0" border="0">
<tr bgcolor="#FFFFFF">
<td height="24" width="12%">
<div align="right">题目:</div>
</td>
<td height="24" width="88%">
<input type="text" name="title" class="eq" size="50">
</td>
</tr>
<tr bgcolor="#FFFFFF">
<td height="63" width="12%">
<div align="right">内容:</div>
</td>
<td height="63" width="88%">
<textarea name="content" class="eq" cols="50" rows="10"></textarea>
</td>
</tr>
<tr bgcolor="#FFFFFF">
<td height="57" colspan="2">
</td>
</tr>
<tr bgcolor="#FFFFFF">
<td height="20" colspan="2">
<div align="center">
<input type="submit" name="reply" value="跟帖" class=in>
<input type="reset" value="重写" class=in name="reset">
<input type="hidden" name="rootid" value="<?echo $rootid;?>">
<input type="hidden" name="orders" value="<?echo$orders;?>">
<input type="hidden" name="layer" value="<?echo$layer;?>">
</div>
</td>
</tr>
</table>
//content.php End
//更新
数据库
//post.php
//Begin
<?
$content=nl2br(htmlspecialchars($content));
$title=htmlspecialchars($title); //决不允许在标题上使用html
$date=date("Y-m-d H:i:s");
$length=strlen($content);
if(isset($said)) //发表新帖子
{
$query="insert into over_post
values(null,@#$title@#,@#$content@#,$user_id,@#$date@#,0,$length,$img,@#@#,@#@#,@#@#)";
$result=mysql_query($query) or die(mysql_error());
$r=mysql_query("select max(id) from over_post");
$rootid = mysql_result($r,0)+0;
mysql_query("update over_post set rootid=$rootid where ID=$rootid")or die(mysql_error());
}
if(isset($reply)): //发表跟帖
mysql_query("update over_post set orders=orders+1 where rootid=$rootid and orders>$orders")or
die(mysql_error());
$layer=$layer+1;
$orders=$orders+1;
$query="insert into over_post
values(null,@#$title@#,@#$content@#,$user_id,@#$date@#,0,$length,$img,$rootid,$orders,$layer)";
$result=mysql_query($query) or die(mysql_error());
endif;
if($result) {
include"list.php";
}
?>
//post.php End
//重头戏,显示所有帖子,并实现分页
//list.php
//Begin
<?php
//找到最新论题的rootid
$query = "select max(rootid) as maxid1, min(rootid) as minid1 from over_post";
$result = mysql_query($query);
$maxid1 = mysql_result($result, 0, "maxid1");
$startid1 = mysql_result($result, 0, "minid1");
if(!($maxid1>0)) $maxid1=0;
if(!($startid1>0)) $startid1=0;
$totalid1 = $maxid1; //这是真正的最大的rootid值, $maxid1要根据$nextmaxid1变的
if($nextmaxid1>0) $maxid1=$nextmaxid1; //翻页
//计算最小rootid:注意下面的desc,与limit结合,保证选取记录的范围.
//如果使用asc, 在mysql_result中检索第0个,将大大错误!
$itemsperpage=30;
$query="select distinct rootid from over_post where rootid<=$maxid1 order by rootid desc limit
$itemsperpage";
$r=mysql_query($query);
$n=mysql_num_rows($r);
if($n>0) {
$minid1=mysql_result($r,$n-1);
$query="select * from over_post where rootid<=$maxid1 and rootid>=$minid1 order by rootid
desc,orders";
$result=mysql_query($query);
$num=mysql_num_rows($result);
}
else {
$minid1=0;
$maxid1=0;
echo "<p><center><font color=@##ff0000@#>没有更多的发言内容</font></center>";
}
$query="select distinct rootid from over_post where rootid>$maxid1 order by rootid limit
$itemsperpage";
$r=mysql_query($query);
$n=mysql_num_rows($r);
if($n>0) $up=mysql_result($r,$n-1);
else $up=$totalid1;
$query="select distinct rootid from over_post where rootid<$minid1 order by rootid desc limit
$itemsperpage";
$r=mysql_query($query);
$n=mysql_num_rows($r);
if($n>0) $down=mysql_result($r,0);
else $down=$maxid1;
?>
<div align=center>
<br>
<table width="90%" border="0" cellspacing="1" cellpadding="0" align="center">
<tr bgcolor="2880AC">
<td height="20" align="center"><font color="#FFFFFF"><a
href="
javascript:window.location.reload()" class=a1>刷新</a>
<a href="list.php" class=a1>首页</a> <a href="list.php?nextmaxid1=<?echo$up;?>" class=a1>
上页</a>
<a href="list.php?nextmaxid1=<?echo$down;?>" class=a1>下页</a> <?echo" 现存论题
:$startid1-$totalid1 ";?>
</font></td>
</tr>
<tr>
<td height="40" bgcolor="#E0F0F8" cellspacing="1">
<?php
echo"<ul>";
while ($array=mysql_fetch_array($result)){
$id=$array["id"];
$title=$array["title"];
$content=$array["content"];
$postat=$array["postat"];
$readed=$array["readed"];
$size=$array["size"];
if($size==0) $size="无内容";
else $size.=" Bytes";
$rootid=$array["rootid"];
$orders=$array["orders"];
$layer=$array["layer"];
$ul=""; //开始树型结构
$_ul="";
for($j=0;$j<$layer;$j++){
$ul=$ul."<ul>";
$_ul=$_ul."</ul>";
}
echo $ul."<li>"."<a href=\"content.php?id=$id\" class=big>$title</a><font color=006699>($size) 【
".作者."】 $postat <被读:$readed> </font><br>".$_ul;
flush();
//树型结构结束
}
?><br></td>
</tr>
<tr bgcolor="2880AC">
<td height="20" align="center"><font color="#FFFFFF"><a
href="javascript:window.location.reload()" class=a1>刷新</a>
<a href="list.php" class=a1>首页</a> <a href="list.php?nextmaxid1=<?echo$up;?>" class=a1>
上页</a>
<a href="list.php?nextmaxid1=<?echo$down;?>" class=a1>下页</a> <?echo" 现存论题
:$startid1-$totalid1 ";?>
</font></td>
</tr>
</table>
</div>
//list.php End
原文转自:http://www.ltesting.net