首頁
編程語言
C語言|JAVA編程
Python編程
網頁編程
ASP編程|PHP編程
JSP編程
數據庫
MYSQL數據庫|SqlServer數據庫
Oracle數據庫|DB2數據庫
您现在的位置: 程式碼之家 >> 編程語言 >  >> 網頁程式設計 >> PHP 程式設計 >> PHP 綜合知識

Discuz! 論壇最新主題 JavaScript 調用:PHP 產出 JS 跨域嵌入指南

     編輯:PHP 綜合知識

應用場景

主站(非 Discuz 目錄)需在側邊欄、首頁顯示論壇最新主題,且不想用 iframe。解決方案:Discuz 目錄下放一支 PHP,輸出 document.writeln() 格式的 JavaScript,主站用 <script src="..."> 引入,瀏覽器直接執行寫入 HTML。

實作步驟

1. 前端調用代碼(主站任意頁面)

<script language="javascript" src="js_bbs.php?fid=2"></script>
  • fid:版塊 ID,可變更顯示不同版塊主題。

2. js_bbs.php(放置於網站根目錄)

<?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 域設定正確。

現代化改良建議

  1. 改用 JSONP / API + AJAX:前端 fetch 取得 JSON,自行渲染模板,分離邏輯與呈現。
  2. 快取層:Redis / Memcached 快取查詢結果,降低 DB 壓力。
  3. 參數化查詢:改用 mysqli_prepare 或 PDO 預處理。
  4. 編碼統一 UTF-8:資料庫、連線、PHP 檔案、HTTP Header 全鏈路 UTF-8,避免轉碼麻煩。

完整範例下載

將上述 js_bbs.php 放入網站根目錄,確認 require 路徑指向正確的 config.inc.php,即可在任意頁面用 <script src="js_bbs.php?fid=2"></script> 顯示最新主題列表。

  1. 上一篇文章:
  2. 下一篇文章:
Copyright © 程式碼之家 All Rights Reserved