这部分功能只有管理员和该帖子作者可以使用,能随时修改该帖子,也能把它删除。不过要注意,删除某个帖子会把它的子帖子也删除,如果是主题的根帖子被删除了,则整个主题都被删除。
编辑/删除帖子的实现文件是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¬es=$notes'>"; }
}
else if($submit == '确定修改') {
edit_note($titleid, $noteid, $theme, ascii2html($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¬es=$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='确定修改'> ";
echo "<input type='reset' name='reset' value='恢复原状'> ";
echo "<input type='submit' name='submit' value='返回'> ";
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($fp, MAX_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($fp, MAX_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($fp, MAX_READ_BYTES);
$recid = strtok($rows, "t");
if($noteid == $recid) {
$content = substr($rows, strrpos($rows, "t") + 1);
break;
}
}
fclose($fp);
return $content;
}
//将字符串中的换行、空格替换成html代码
function ascii2html($content) {
$content = str_replace("n", "<br>", $content); $content = str_replace(" ", " ", $content); $content = str_replace("r", "", $content);
$content = str_replace("t", "", $content);
$content = str_replace("<", "<", $content); $content = str_replace(">", ">", $content); $content = stripslashes($content);
return $content; }
//将html代码中的换行空格替换成普通ASCII字符
function html2ascii($content) {
$content = str_replace("<br>", "n", $content); $content = str_replace(" ", " ", $content); $content = str_replace("<", "<", $content); $content = str_replace(">", ">", $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($fp, MAX_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($fp, MAX_READ_BYTES);
fwrite($newfp, $rows);
$rows = fgets($fp, MAX_READ_BYTES);
fwrite($newfp, $rows);
while(!feof($fp))
{
$rows = fgets($fp, MAX_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($fp, MAX_READ_BYTES);
$recid = strtok($rows, "t");
if(substr($recid, 0, strlen($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($fp, MAX_READ_BYTES);
if($noteid != '0.')
fwrite($newfp, $rows);
else
fwrite($newfp, strval(intval($rows) - 1)."n");
$rows = fgets($fp, MAX_READ_BYTES);
fwrite($newfp, strval(intval($rows) - $delnum)."n");
while(!feof($fp))
{
$rows = fgets($fp, MAX_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
|
|