php不用遞歸完成無限分類,從表設計入手完整演示過程


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

網上無限分類大多不全面,今天我會從設計表開始,

首先我們先做視圖界面,

<!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';        //引入視圖文件

可以自己定義輸出樣式

 


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM