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

PHPCMS 全站欄目內容鏈接批量導出:單腳本實現跨模型聯合查詢

     編輯:PHP 相關知識

前言

PHPCMS V9 將內容分散存儲於 v9_news、v9_product 等模型表,需導出全站所有欄目的內容鏈接時,單純後台匯出無法滿足。本文提供一支獨立 PHP 腳本,連接資料庫、遍歷 v9_category,以 UNION ALL 合併多模型內容,輸出「欄目名 + 內容 URL」清單,可直接導向 CSV 或站點地圖生成器。

資料庫結構速覽

表名用途關鍵欄位
v9_category欄目表catid, catname, modelid
v9_news文章模型id, catid, title, url
v9_product產品模型id, catid, title, url
實際專案可能還有 v9_picture、v9_download 等模型,腳本中可動態根據 modelid 組裝 UNION。

完整導出腳本

<?php
/**
 * PHPCMS 全站欄目內容鏈接導出
 * 輸出格式:欄目名 | 內容標題 | 內容URL
 * 可重定向 > urls.csv 直接生成 CSV
 */

// === 設定區 ===
$dbConfig = [
    'host' => 'localhost',
    'user' => 'db_user',
    'pass' => 'db_pass',
    'name' => 'phpcms_db',
    'charset' => 'utf8',
    'prefix' => 'v9_'
];

// 模型表對應表(可擴充)
$modelTables = [
    1 => 'news',      // 文章模型
    2 => 'product',   // 產品模型
    // 3 => 'picture',
    // 4 => 'download',
];

// === 連線 ===
$mysqli = new mysqli($dbConfig['host'], $dbConfig['user'], $dbConfig['pass'], $dbConfig['name']);
if ($mysqli->connect_errno) {
    die("DB Connect Failed: {$mysqli->connect_error}");
}
$mysqli->set_charset($dbConfig['charset']);

// === 取得所有欄目 ===
$cats = $mysqli->query("SELECT catid, catname, modelid FROM {$dbConfig['prefix']}category");
if (!$cats) die("Category Query Failed: {$mysqli->error}");

// === 輸出標頭(CSV 格式) ===
echo "catname,title,url\n";

while ($cat = $cats->fetch_assoc()) {
    $catname = $cat['catname'];
    $catid   = (int)$cat['catid'];
    $modelid = (int)$cat['modelid'];

    // 找對應模型表
    if (!isset($modelTables[$modelid])) {
        // 模型不在對應表,略過或記錄警告
        continue;
    }
    $table = $dbConfig['prefix'] . $modelTables[$modelid];

    // 聯合查詢:標題 + URL,按 id 降序
    $sql = "SELECT title, url FROM {$table} WHERE catid = {$catid} ORDER BY id DESC";
    $res = $mysqli->query($sql);
    if (!$res) continue;

    while ($row = $res->fetch_assoc()) {
        // CSV 轉義:雙引號轉雙雙引號、欄位包雙引號
        $title = '"' . str_replace('"', '""', $row['title']) . '"';
        $url   = '"' . str_replace('"', '""', $row['url']) . '"';
        $cname = '"' . str_replace('"', '""', $catname) . '"';
        echo "{$cname},{$title},{$url}\n";
    }
    $res->free();
}

$cats->free();
$mysqli->close();
?>

執行與輸出範例

$ php export_urls.php > urls.csv
# 或
$ php export_urls.php | gzip > urls.csv.gz

CSV 內容示意

catname,title,url
"最新消息","PHPCMS V9 釋出","https://example.com/news/1.html"
"最新消息","版本更新說明","https://example.com/news/2.html"
"產品中心","旗艦手機 X","https://example.com/product/10.html"
"產品中心","輕薄筆記型","https://example.com/product/11.html"

進階擴充建議

  1. 動態讀取模型對應:查詢 v9_model 表的 tablename 欄位,免維護陣列。
  2. 分頁/游標處理大量資料:使用 LIMIT offset, size 或 WHERE id > last_id 避免記憶體溢位。
  3. 並行導出:將欄目 ID 分批,用 pcntl_fork 或 GNU Parallel 多程序加速。
  4. 直接生成 sitemap.xml:輸出時改寫 XML 格式,符合 Sitemap 協定。
  5. 增量導出:記錄上次最大 id 或 updatetime,僅導出新增/異動內容。

常見問題

Q: URL 欄位為空怎麼辦?
A: PHPCMS 內容 URL 由 URL 規則生成,若為空需檢查後台「模型管理 → URL 規則」設定,或用 show_url($catid, $id) 函數動態生成(需載入 PHPCMS 核心)。
Q: 跨資料庫/主從架構?
A: 修改連線參數指向讀庫,或用 mysqli::change_user 切換資料庫。
Q: 導出包含 HTML 標籤的標題?
A: CSV 已雙引號包裹並轉義,Excel/資料庫匯入皆可正確識別。

總結

這支腳本零依賴、單檔案、可直接在 CLI 執行,適合納入排程任務每日更新站點地圖或提供 SEO 團隊審核。核心邏輯為「遍歷欄目 → 依模型查表 → UNION/多查詢合併 → CSV 輸出」,可依專案模型數量彈性擴充。

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