無限分類是什么就不廢話了,可以用遞歸實現,但是遞歸從數據庫取東西用遞歸效率偏低,如果從表設計入手,就很容易做到網站導航的實現,下面是某論壇導航,如下圖

網上無限分類大多不全面,今天我會從設計表開始,
首先我們先做視圖界面,
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8">
<title>白超華-博客園</title>
</head>
<body>
<form action="" method="post"> 分類名稱 <input type="text" name="cat_name" value=""><br><br> 上級分類 <select name="cat_root">
<option value="">頂級分類</option>
</select>
<input type="submit">
</form>
</body>
</html>
網頁展示如下:

我們首先來設計表,(需要實驗的朋友直接復制SQL語句到cmd執行即可)
#創建數據庫 CREATE DATABASE tree; #選擇數據庫 USE tree; #創建表 CREATE TABLE tree( cat_id smallint UNSIGNED AUTO_INCREMENT comment '類別ID', cat_name varchar(10) NOT NULL comment '類別名稱', parent_id smallint NOT NULL DEFAULT 0 comment '類別父ID', path varchar(20) NOT NULL comment '路勁結構', PRIMARY KEY(cat_id) )engine=MyISAM charset=utf8;
表結構如下:

其中字段 path 就是不用遞歸操作的重點,path用來表示下級分類深入的情況,啊哈用語言還不是很好描述,舉個簡單例子吧,理解的朋友就直接跳過了!
path是通過字符串存儲的形式來表示類別之間的層關系,通過字符串函數我們可以知道path中 ' - ' 的數量,如果有一個表示它上面有一個父分類,
如果有兩個表示它上面有兩個父分類.以此類推實現無限分類。

通過表單獲取的類別id和父id可以得到路徑path,我們需要寫一個函數來獲取path,就是先插入這條數據,然后根據這條數據的id,pid制作除path然后更新到這條記錄,
不使用遞歸的方法就是在插入path的時候需要制作一個path路徑。
php代碼如下:
<?php header("Content-Type:text/html;charset=utf8"); require './Mysql.class.php';//引入數據庫操作類
$db = new Mysql(); //連接數據庫 //從數據表中獲取數據用來顯示到 select 下拉菜單.
$sql = "SELECT * FROM tree"; $result = $db->getAll($sql); //接受表單數據
if(!empty($_POST['cat_name'])){ $cat_name = trim($_POST['cat_name']); $parent_id = isset($_POST['parent_cat']) ? $_POST['parent_cat'] : 0; $sql2 = "SELECT cat_id FROM tree WHERE parent_id = $parent_id"; $cat_id = $db->getOne($sql2); $path = path($parent_id,$cat_id); //數據入庫
$sql = "INSERT INTO tree (cat_name,parent_id,path) values('$cat_name',$parent_id,$path)"; if($db->query($sql)) echo "插入成功"; foreach($result as $row){ $sun = substr_count($row['path'], '-'); if($num > 0){ $pre = str_repeat('-',$sum); }else { $row['tree'] = $pre.$row['name']; } $str.=$row['tree'].'br'; } echo $str; } include './tree.html'; //引入視圖文件
可以自己定義輸出樣式
