一個更簡單的無限級分類選單程式碼
首先要感謝terry39的指點,元旦閒來無事可做,我就把他所講的原理簡單實現一下,這個程式的關鍵就在於資料表的設計很有特色,不用遞歸,靠個簡單SQL語句就能列出菜單,看看這個資料表怎麼設計的:
資料庫欄位大概如下:
----------------- -------------------------------------------------- ----------------
id 編號
fid 父分類編號
name 分類名
path 分類路徑,以id 為節點,組成類似,1,2,3,4, 這樣的字串
---------------------------------------------- ------------------------------------
可以假設有以下的資料
id fid name path
------------------------------------------------- ---
1 0 分類1 ,1,
2 0 分類2 ,2,
3 1 分類1-1 ,1,3,
4 1 分類1-2 ,1,4,
5 2 分類2-1 ,2,5,
6 4 分類1-2-1 ,1,4,6,
---------------------------- ------------------------
這次偷懶,我只用一個頁面,好在程式碼不長,全部程式碼用類別封裝的(不是必要,而是自己也想熟悉一下OO,呵呵! ),來看看頁面代碼:
<?php classmenu{ //创建构造函数,作用:数据库连接并选择相应数据库 publicfunction__construct(){ $dbhost="localhost"; $dbuser="root"; $dbpassword="7529639"; $dbname="menu"; mysql_connect($dbhost,$dbuser,$dbpassword)ordie("error!"); mysql_query("SETNAMES'GBK'"); mysql_select_db($dbname); } //执行SQL语句函数 privatefunctionquery($sql){ returnmysql_query($sql); } //取得结果集数组函数 privatefunctionloop_query($result){ returnmysql_fetch_array($result); } //列出菜单列表函数 publicfunctionmenulist(){ $sql="select*fromlistorderbypath"; $result=$this->query($sql); while($rows=$this->loop_query($result)){ if(substr_count($rows['path'],',')>2){ for($i=0;$i<(substr_count($rows['path'],',')-2);$i++) echo''; } echo$rows['name'].'<br>'; } } //创建析构函数,作用:关闭数据库连接 publicfunction__destruct(){ returnmysql_close(); } } $db=newmenu();//生成实例 $db->menulist();//调用方法生成菜单 ?>