無限分類(多級分類)是電商、CMS、後台管理系統的核心需求。本文提供一個生產可用的 PHP 無限分類類別完整實作,包含資料表結構、CRUD 操作、樹狀顯示、移動節點、級聯刪除等核心邏輯,代碼經測試可直接使用。
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:同級排序,支援拖拽排序。單檔案包含:資料庫連線、分頁列表顯示、新增、編輯、儲存、刪除、樹狀縮進顯示、移動節點時的級聯更新(深度、rootid、parentstr、orders、child 計數)等完整邏輯。關鍵方法:
add() / saveadd():新增分類,自動計算 typeid、depth、rootid、parentstr、orders,並級聯更新祖先 child 計數與同級 orders。edit() / saveedit():修改分類名稱或移動父分類。核心難點:移動子樹時需遞迴更新所有後代的 depth、rootid、parentstr、orders,同時調整舊父系與新父系的 child 計數與 orders。del():刪除分類,禁止刪除含子分類的節點,刪除時級聯減少祖先 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'];
}
}
$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']}'");
}
縮進顯示層級,+/- 標識有無子分類,粗體標識頂級分類。confirm 防誤刪,含子分類時禁止刪除。mysql_* 替換為 PDO 或 MySQLi 預處理語句,防 SQL 注入。parentstr LIKE 查詢,提升大數據量下查詢效能。此類別雖基於舊式 API,但其樹狀資料維護邏輯(深度、路徑、排序、計數的級聯一致性)極具參考價值,可作為現代重構的業務邏輯藍本。