本文介紹一個極精簡的多層級論壇系統,全部核心代碼不足 200 行,執行速度極快。系統採用 PHP + MySQL 架構,支援無限層級的主題回覆、分頁顯示、發帖/回覆功能,適合作為輕量級社區或學習參考。
論壇僅需一張資料表 yxforum,結構如下:
| 欄位 | 類型 | Null | Key | 預設值 | Extra |
|---|---|---|---|---|---|
| id | int(11) | PRI | 0 | auto_increment | |
| dt | datetime | YES | NULL | ||
| tp | varchar(255) | YES | NULL | ||
| ct | text | YES | NULL | ||
| fl | int(11) | YES | NULL | ||
| ip | varchar(20) | YES | NULL | ||
| un | varchar(50) | YES | NULL | ||
| em | varchar(60) | YES | NULL | ||
| num | int(11) | YES | NULL |
該文件負責:
$fl 參數決定顯示哪個版塊或主題(預設為 1,即首頁)$fl != 1,顯示主題標題、作者信息及主題正文fl = $fl),按時間倒序分頁顯示(每頁 15 條)關鍵代碼片段(已轉義):
<?php
$m = mysql_connect("localhost", "××××", "××××");
mysql_select_db("××××", $m);
if ($fl == "") $fl = 1;
$hf_fl = $fl;
$q = "select * from yxforum where id=" . $fl;
$mr = mysql_query($q, $m);
$ra = mysql_fetch_row($mr);
?>
<p align=center><b><?php print($ra[2]); ?></b><br>
<?php if ($fl != 1) { ?>
<small><?php printf("(<a href=mailto:%s>%s</a>) ", $ra[7], $ra[6]); ?></small></p>
<?php
$alltt = $ra[2];
$lastid = $ra[4];
print("<center><table width=90% border=1><tr><td bgcolor=#dddddd class=unnamed1>" . $ra[3] . "</tr></table></center>");
print("<br><small>跟隨主題:</small>");
}
$q = "select * from yxforum where fl=" . $fl . " order by dt desc";
if ($p == "") $p = 0;
$mr = mysql_query($q, $m);
$f = mysql_num_fields($mr);
$ra = mysql_fetch_row($mr);
$i = 0; $p1 = $p * 15;
while ($i < $p1) { $i++; $ra = mysql_fetch_row($mr); if (!$ra) break; }
?>
<center>
<table border=0 width=732 class="unnamed1">
<tr align="center" valign="top" bgcolor="#FFFFCC">
<td width="186">最新回應時間</td>
<td width="88">發表人</td>
<td width="414">主題</td>
<td width="44">回應數</td>
</tr>
<?php
$x[0] = "ffffcc"; $x[1] = "DEEFFF"; $i = 1;
while ($ra) {
$ys_c = $i % 2;
print("<tr height=12 bgcolor=#" . $x[$ys_c] . "><td align=center>" . $ra[1]);
print("<td align=center><a href=mailto:" . $ra[7] . ">" . $ra[6] . "</a>");
print("<td>");
printf("<a href=index.php?fl=%s>%s</a>", $ra[0], $ra[2]);
print("<td align=center>" . $ra[8]);
print("</tr>");
$ra = mysql_fetch_row($mr);
$i++;
if ($i > 15) break;
}
?>
</table></center>
<!-- 分頁導航與發帖表單略 -->
功能:
< > 轉義,換行轉 <br>,空格轉 )dt(最後回覆時間)與 num(回覆數)<?php
$m = mysql_connect("localhost", "×××", "×××××");
mysql_select_db("×××××", $m);
$zw = ereg_replace("<", "<", $zw);
$zw = ereg_replace(">", ">", $zw);
$zw = ereg_replace("\n", "<br>", $zw);
$zw = ereg_replace(" ", " ", $zw);
$tt = ereg_replace("<", "<", $tt);
$tt = ereg_replace(">", ">", $tt);
if ($nm == "") $nm = "無名寶";
if ($em == "") { $nm .= "<-- 是一只沒有MAIL的菜鳥"; $em = "No"; }
$err = strlen($tt) * strlen($zw);
if ($err == 0) {
$msg = "<font color=red>不要偷懶嘛!把表格填完再提交不遲。</font>";
} else {
$q = "insert into yxforum (dt,tp,ct,fl,ip,un,em,num) values (now(),'" . $tt . "','" . $zw . "'," . $fl . ",'" . $REMOTE_ADDR . "','" . $nm . "','" . $em . "',0)";
mysql_query($q, $m);
$q = "select num,fl from yxforum where id=" . $fl;
$fl_a = $fl;
do {
$mr = mysql_query($q, $m);
$ra = mysql_fetch_row($mr);
$num = $ra[0] + 1;
$q = "update yxforum set dt=now(),num=" . $num . " where id=" . $fl;
$fl = $ra[1];
mysql_query($q, $m);
$q = "select num,fl from yxforum where id=" . $fl;
} while ($fl > 0);
$msg = "<font color=green>你的意見已經成功提交!</font>";
}
?>
<html><head><script language="Javascript">
function go() { document.location = "index.php?fl=<?php print($fl_a); ?>&p=<?php print($p) ?>"; }
</script><body onload="setTimeout('go()',3000);">
<?php print($msg); ?><br>
系統將在3秒鐘以後自動返回。如果不能返回或者你著急,請按<a href="index.php?fl=<?php print($fl_a); ?>&p=<?php print($p) ?>">這裡</a>
</body>
flush() 機制實現準即時顯示(配合無限循環)雖然使用了已棄用的 mysql_* 函數,但其架構思想對理解輕量級論壇實現極具參考價值。現代重構建議改用 PDO/MySQLi、Prepared Statements、模板引擎分離視圖邏輯。