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

打造 PHP 無限分類類別:完整代碼、資料表設計與遞迴邏輯詳解

     編輯:PHP 相關知識

無限分類(多級分類)是電商、CMS、後台管理系統的核心需求。本文提供一個生產可用的 PHP 無限分類類別完整實作,包含資料表結構、CRUD 操作、樹狀顯示、移動節點、級聯刪除等核心邏輯,代碼經測試可直接使用。

1. 資料表設計:b_mtype

CREATE TABLE `b_mtype` (
  `typeid`   int(4) NOT NULL DEFAULT '0',   -- 分類ID
  `typename` varchar(50) NOT NULL DEFAULT '', -- 分類名稱
  `parentid` int(4) NOT NULL DEFAULT '0',   -- 父分類ID
  `parentstr` varchar(200) NOT NULL DEFAULT '', -- 祖先路徑,如 "1,5,12"
  `depth`    int(4) NOT NULL DEFAULT '0',   -- 深度(0=頂級)
  `rootid`   int(4) NOT NULL DEFAULT '0',   -- 根分類ID(最頂層)
  `child`    varchar(200) NOT NULL DEFAULT '', -- 子分類計數/列表
  `orders`   varchar(200) NOT NULL DEFAULT '', -- 同級排序號
  PRIMARY KEY (`typeid`)
) ENGINE=MyISAM DEFAULT CHARSET=gb2312;

關鍵欄位說明:

  • parentstr:儲存從根到父節點的 ID 路徑,利於 LIKE '%parentstr%' 快速查詢所有後代。
  • depth:限制最大深度(代碼中限制 20 層),避免無限遞迴。
  • rootid:同一棵樹的節點共享同一 rootid,便於整樹操作。
  • orders:同級排序,支援拖拽排序。

2. 核心類別架構 (ProductClass.php)

單檔案包含:資料庫連線、分頁列表顯示、新增、編輯、儲存、刪除、樹狀縮進顯示、移動節點時的級聯更新(深度、rootid、parentstr、orders、child 計數)等完整邏輯。關鍵方法:

  • add() / saveadd():新增分類,自動計算 typeid、depth、rootid、parentstr、orders,並級聯更新祖先 child 計數與同級 orders。
  • edit() / saveedit():修改分類名稱或移動父分類。核心難點:移動子樹時需遞迴更新所有後代的 depth、rootid、parentstr、orders,同時調整舊父系與新父系的 child 計數與 orders。
  • del():刪除分類,禁止刪除含子分類的節點,刪除時級聯減少祖先 child 計數。

3. 關鍵遞迴更新邏輯解析

新增節點時更新祖先 child 計數

for ($i = 1; $i <= $depth; $i++) {
    if ($parentid != "") {
        mysql_query("UPDATE b_mtype SET child = child + 1 WHERE typeid = '$parentid'");
        // 取得上一層 parentid
        $result = mysql_query("SELECT parentid FROM b_mtype WHERE typeid = '$parentid'");
        $par = mysql_fetch_array($result);
        if ($par['parentid'] != "") $parentid = $par['parentid'];
    }
}

移動子樹:更新後代 depth、rootid、parentstr

$iparentstr = $parentstr . "," . $newtypeid;
$query = mysql_query("SELECT * FROM b_mtype WHERE parentstr LIKE '%$iparentstr%' ORDER BY orders");
while ($arr = mysql_fetch_array($query)) {
    $i++;
    $newParentStr = str_replace($parentstr, $newParentPath, $arr['parentstr']);
    mysql_query("UPDATE b_mtype SET 
        depth = depth + $depthDiff,
        rootid = '$newRootId',
        parentstr = '$newParentStr',
        orders = '$newBaseOrder' + $i
        WHERE typeid = '{$arr['typeid']}'");
}

4. 前端介面互動

  • 列表頁:以   縮進顯示層級,+/- 標識有無子分類,粗體標識頂級分類。
  • 新增/編輯:下拉選單選擇父分類,同樣以縮進視覺化層級。
  • 刪除確認:JS confirm 防誤刪,含子分類時禁止刪除。

5. 現代化改造建議

  1. 將 mysql_* 替換為 PDO 或 MySQLi 預處理語句,防 SQL 注入。
  2. 採用 MVC 架構:模型層封裝分類邏輯,控制器處理請求,視圖渲染模板。
  3. 引入 遞迴 CTE (MySQL 8.0+) 或 Closure Table 設計,替代 parentstr LIKE 查詢,提升大數據量下查詢效能。
  4. 加入 事務 包裹移動/刪除操作,保證資料一致性。
  5. 前端改用 Vue/React + AJAX,提升使用者體驗。

此類別雖基於舊式 API,但其樹狀資料維護邏輯(深度、路徑、排序、計數的級聯一致性)極具參考價值,可作為現代重構的業務邏輯藍本。

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