具有树状结构的文本论坛(九)——编辑/删除帖子

    这部分功能只有管理员和该帖子作者可以使用,能随时修改该帖子,也能把它删除。不过要注意,删除某个帖子会把它的子帖子也删除,如果是主题的根帖子被删除了,则整个主题都被删除。
    编辑/删除帖子的实现文件是edit.php,其代码如下:
<?
  
echo "<div align=center><h2>编辑/删除帖子</h2></div><br>";
  if(!
session_is_registered("username"))
  {
    echo 
"<div align=center><h2><font color=red>您还没注册,不能管理帖子</font></h2></div>";
    echo 
"<script langue='javascript'>history.go(-1)</script>";
  }
  else if((
$username != $master)&&($username != get_author($titleid$noteid)))
  {
    echo 
"<div align=center><h2><font color=red>只有管理员和发帖人才能编辑或删除帖子</font></h2></div>";
    echo 
"<script langue='javascript'>history.go(-1)</script>";
  }
  
  else    
//身份验证通过,可以修改/删除帖子
  
{
   if(
$submit == '返回')
   {
     echo 
"<script langue='javascript'>history.go(-2)</script>";
   }
   else if(
$submit == '删除该帖子')
   {
     
delete_note($titleid$noteid);
     if(
$noteid == '0.')
       echo 
"<meta http-equiv='Refresh' content='0; url=forum.php?action=themelist'>";
     else
     {
       
$theme get_title($titleid);
       
$notes get_notes($titleid);
       echo 
"<meta http-equiv='Refresh' content='0; url=forum.php?action=read&id=$titleid&title=$theme&notes=$notes'>";
     }
   }
   else if(
$submit == '确定修改')
   {
     
edit_note($titleid$noteid$themeascii2html($content));
     
$notes get_notes($titleid);
     
$theme get_title($titleid);
     echo 
"<meta http-equiv='Refresh' content='0; url=forum.php?action=read&id=$titleid&title=$theme&notes=$notes'>";
   }
   else
   {
     echo 
"<div align=center><h3><font color=green>身份验证......通过!</font></h3></div>";
     
$content get_content($titleid$noteid);
     echo 
"<div align=center><form name='edit' method='post' action='forum.php?action=edit'>";
     echo 
"<input type='hidden' name='titleid' value=$titleid>";
     echo 
"<input type='hidden' name='noteid' value=$noteid>";
     echo 
"标题:<input type='text' name='theme' size='80' value=$theme>";
     
$content html2ascii($content);
     
$content str_replace("<br>""n"$content);
     echo 
"<textarea name='content' cols=95 rows=12>$content</textarea>";
     echo 
"<input type='submit' name='submit' value='确定修改'>&nbsp;";
     echo 
"<input type='reset' name='reset' value='恢复原状'>&nbsp;";
     echo 
"<input type='submit' name='submit' value='返回'>&nbsp;";
     echo 
"<input type='submit' name='submit' value='删除该帖子'>";
     echo 
"</form></div>";
     if(
$noteid == '0.')
       echo 
"<div align=center><font color=red>请注意,该帖子是该主题的首帖子,删除该帖会删除整个主题</font></div>";
     else
       echo 
"<div align=center><font color=red>请注意,如果删除该帖,其子帖也会被删除</font></div>";
   }  
  }
?>
    它需要用到不少的记录文件访问函数,下面一并列出:
<?
    
//节选自funcdef.php
    
    //获取某帖子的发帖人名字
  
function get_author($titleid$noteid)
  {
    
$fp fopen("rec/$titleid""r");
    while(!
feof($fp))
    {
      
$rows fgets($fpMAX_READ_BYTES);
      
$recid strtok($rows"t");
      if(
$noteid == $recid)
      {
        
strtok("t");
        
strtok("t");
        
$author strtok("t");
        break;
      }
    }
    
fclose($fp);
    return 
$author;
  }
  
  
//根据ID获取某主题的大标题
  
function get_title($titleid)
  {
    
$fp fopen("rec/$titleid""r");
    
$rows fgets($fpMAX_READ_BYTES);
    
fclose($fp);
    
strtok($rows"t");
    return 
strtok("t");
  }
  
  
//获取某帖子的内容
  
function get_content($titleid$noteid)
  {
    
$fp fopen("rec/$titleid""r");
    while(!
feof($fp))
    {
      
$rows fgets($fpMAX_READ_BYTES);
      
$recid strtok($rows"t");
      if(
$noteid == $recid)
      {
        
$content substr($rowsstrrpos($rows"t") + 1);
        break;
      }
    }
    
fclose($fp);
    return 
$content
  }
        
  
//将字符串中的换行、空格替换成html代码
  
function ascii2html($content)
  {
     
$content str_replace("n""<br>"$content);
     
$content str_replace(" ""&nbsp;"$content);
     
$content str_replace("r"""$content);
     
$content str_replace("t"""$content);
     
$content str_replace("<""&lt;"$content);
     
$content str_replace(">""&gt;"$content);
     
$content stripslashes($content);     
     return 
$content;
  }
  
  
//将html代码中的换行空格替换成普通ASCII字符
  
function html2ascii($content)
  {
     
$content str_replace("<br>""n"$content);
     
$content str_replace("&nbsp;"" "$content);
     
$content str_replace("&lt;""<"$content);
     
$content str_replace("&gt;"">"$content);
     return 
$content;
  }    
     
  
//修改某一帖子
  
function edit_note($titleid$noteid$theme$content)
  {
    
//修改?主题文件内容
    
$fp fopen("rec/".$titleid"r");
    
$newfp fopen("rec/".$titleid.".bak""w");
    while(!
feof($fp))
    {
      
$rows fgets($fpMAX_READ_BYTES);
      
$recid strtok($rows"t");
      if(
$noteid == $recid//要修改的帖子
      
{
        
strtok("t");  //title
        
$face strtok("t");  //face
        
$maker strtok("t");  //maker
        
$thmestr strtok("t");  //timestr
        
$ip strtok("t");  //ip
        
$oicq strtok("t");  //oicq
        
$email strtok("t");  //email
        
$homepage strtok("t");  //homepage
        
        
fwrite($newfp"$recidt");
        
fwrite($newfp"$themet");
        
fwrite($newfp"$facet");
        
fwrite($newfp"$makert");
        
fwrite($newfp"$timestrt");
        
fwrite($newfp"$ipt");
        
fwrite($newfp"$oicqt");    
        
fwrite($newfp"$emailt");
        
fwrite($newfp"$homepaget");
        
fwrite($newfp"$contentn");  
      }
      else
      {
        
fwrite($newfp$rows);
      }
    }
    
fclose($newfp);
    
fclose($fp);
    
copy("rec/".$titleid.".bak""rec/".$titleid);
    
unlink("rec/".$titleid.".bak");
    
    
//如果是根帖子,则要修改themelist文件内容
    
if($noteid == '0.')
    {
      
$fp fopen("rec/themelist""r");
      
$newfp fopen("rec/themelist.bak""w");
      
      
$rows fgets($fpMAX_READ_BYTES);
      
fwrite($newfp$rows);
      
$rows fgets($fpMAX_READ_BYTES);
      
fwrite($newfp$rows);
      while(!
feof($fp))
      {
        
$rows fgets($fpMAX_READ_BYTES);
        
$recid intval(strtok($rows"t"));
        if(
$recid != $titleid)
        {
          
fwrite($newfp$rows);
        }
        else    
//如果是要修改的行
        
{
          
strtok("t");
          
$recmaker strtok("t");        
          
$rectime strtok("t");        
          
$newnum intval(strtok("t"));
          
fwrite($newfp$recid."t");
          
fwrite($newfp$theme."t");
          
fwrite($newfp$recmaker."t");
          
fwrite($newfp$rectime."t");
          
fwrite($newfp"$newnumn");
        }
      }
      
fclose($newfp);
      
fclose($fp);
      
copy("rec/themelist.bak""rec/themelist");
      
unlink("rec/themelist.bak");
    }   
  }
  
  
//删除某帖子的函数
  
function delete_note($titleid$noteid)
  {
    if(
$noteid == '0.')
    {
      
unlink("rec/$titleid");
      
$delnum get_notes($titleid);
    }
    else
    {
      
//修改?主题文件内容
      
$fp fopen("rec/".$titleid"r");
      
$newfp fopen("rec/".$titleid.".bak""w");
      
$delnum 0;
      while(!
feof($fp))
      {
        
$rows fgets($fpMAX_READ_BYTES);
        
$recid strtok($rows"t");
        if(
substr($recid0strlen($noteid)) == $noteid)
        {
          
$delnum ++;
          continue;
        }
        else
          
fwrite($newfp$rows);
      }
      
fclose($newfp);
      
fclose($fp);  
      
copy("rec/".$titleid.".bak""rec/".$titleid);
      
unlink("rec/".$titleid.".bak");
    }
    
    
//修改themelist文件
    
$fp fopen("rec/themelist""r");
    
$newfp fopen("rec/themelist.bak""w");
      
    
$rows fgets($fpMAX_READ_BYTES);
    if(
$noteid != '0.')        
      
fwrite($newfp$rows);
    else    
      
fwrite($newfpstrval(intval($rows) - 1)."n");     
    
$rows fgets($fpMAX_READ_BYTES);
    
fwrite($newfpstrval(intval($rows) - $delnum)."n");
    while(!
feof($fp))
    {
      
$rows fgets($fpMAX_READ_BYTES);
      
$recid intval(strtok($rows"t"));
      if(
$recid != $titleid)
      {
        
fwrite($newfp$rows);
      }
      else    
//如果是要修改的行
      
{
        if(
$noteid == '0.')
          continue;
        else
        {
          
$theme strtok("t");
          
$recmaker strtok("t");        
          
$rectime strtok("t");        
          
$newnum intval(strtok("t")) - $delnum;
          
fwrite($newfp$recid."t");
          
fwrite($newfp$theme."t");
          
fwrite($newfp$recmaker."t");
          
fwrite($newfp$rectime."t");
          
fwrite($newfp"$newnumn");
        }
      }
    }
    
fclose($newfp);
    
fclose($fp);
    
copy("rec/themelist.bak""rec/themelist");
    
unlink("rec/themelist.bak");
  }
?>
    自此,这个论坛的原代码基本上都给出来了,欢迎大家就它的设计结构以及实现算法提出宝贵意见。
    感兴趣的朋友可以到下面的地址看看该论坛的演示:http://youziyun.oso.com.cn/forum/forum.php