主站(非 Discuz 目錄)需在側邊欄、首頁顯示論壇最新主題,且不想用 iframe。解決方案:Discuz 目錄下放一支 PHP,輸出 document.writeln() 格式的 JavaScript,主站用 <script src="..."> 引入,瀏覽器直接執行寫入 HTML。
<script language="javascript" src="js_bbs.php?fid=2"></script>
fid:版塊 ID,可變更顯示不同版塊主題。<?php
require "bbs/config.inc.php"; // Discuz 設定檔,含 $dbhost, $dbuser, $dbpw, $dbname, $tablepre
// 連線資料庫
$link = mysql_connect($dbhost, $dbuser, $dbpw) or die('連線失敗: ' . mysql_error());
mysql_select_db($dbname) or die('選擇資料庫失敗');
// 取得版塊 ID,預設 1
$fid = isset($_GET['fid']) ? intval($_GET['fid']) : 1;
// 防中文亂碼(視實際編碼調整)
mysql_query("SET NAMES 'gb2312'");
// 查詢最新 10 個主題
$query = "SELECT tid, subject FROM {$tablepre}threads WHERE fid='$fid' ORDER BY lastpost DESC LIMIT 10";
$result = mysql_query($query) or die('查詢失敗: ' . mysql_error());
// 輸出 JS 代碼
while ($row = mysql_fetch_row($result)) {
$title = cutstr($row[1], 36, '..'); // 截取 36 字元
printf(
"document.writeln(\"<li><a href=\\\"bbs/viewthread.php?tid=%s&extra=page=1\\\" target=\\\"_blank\\\">%s</a></li>\");\n",
$row[0], $title
);
}
mysql_free_result($result);
mysql_close($link);
/**
* 簡易中英文混合截取(按位元組,雙位元組字元視為 2 字元)
*/
function cutstr($string, $length, $dot = '...') {
$strcut = '';
for ($i = 0; $i < $length - strlen($dot) - 1; $i++) {
$strcut .= (ord($string[$i]) > 127) ? $string[$i] . $string[++$i] : $string[$i];
}
return $strcut . $dot;
}
?>
| 項目 | 說明 |
|---|---|
| 編碼一致性 | Discuz 早期版本多為 GBK/GB2312,主站若為 UTF-8 需在 JS 輸出前 header('Content-Type: text/javascript; charset=gb2312'),或用 iconv 轉碼。 |
| SQL 注入防護 | intval($_GET['fid']) 強制整數,避免注入。 |
| 效能考量 | 每次頁面載入皆查詢資料庫,高流量建議加入檔案快取(如 5 分鐘更新一次靜態 .js 檔)。 |
| 跨域限制 | <script src> 不受同源策略限制,但若 Discuz 在子網域,需確保 Cookie 域設定正確。 |
fetch 取得 JSON,自行渲染模板,分離邏輯與呈現。mysqli_prepare 或 PDO 預處理。將上述 js_bbs.php 放入網站根目錄,確認 require 路徑指向正確的 config.inc.php,即可在任意頁面用 <script src="js_bbs.php?fid=2"></script> 顯示最新主題列表。