非递归法实现论坛树型结构及分页!!(心血结晶啊,呵呵)

发表于: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="#66CCCC">
      <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