PHP代碼部分: //無限分類-使用路徑 //原理:通過路徑來進行拆分得到所有想得到的pid以及id,路徑是在設計表時的一個字段,包含著從祖先id到父id的一系列id //該方法,不論查看或者是刪除等其他操作,都只需要執行一次sql語句就能夠達到想要的效果 //該種方法也是本人比較喜歡的使用的啦,因為我的原則是能夠不使用遞歸,就堅決不用遞歸 $link=mysql_connect('localhost','username,'password'); if(mysql_errno()){ echo '數據庫連接失敗:'.mysql_error(); } mysql_select_db('db_kind'); mysql_set_charset('utf8'); //concat(),連接字符串成一個新字符串 //下面的代碼完成一個無限分類的現實 $sql="select concat(path,'-',id) as conpath,id,name,path from wx_kind order by conpath"; $result=mysql_query($sql); while($row=mysql_fetch_assoc($result)){ $arr=array(); //這裡可以選擇對path字段或者新組成的conpath字段來進行字符串的拆分 //對於explode()函數注意一點,無論要拆分的字符串是否包含使用參數的字符,都至少返回包含一個元素的數組 $count=count(explode('-',$row['path']))-1; //str_repeat(),對字符串進行重復,主要是為了格式看的比較清楚 $str=str_repeat(' ',$count); echo $str.$id.'=>'.$row['name'].'<hr/>'; } /*********************************** 如果現在需要進行刪除操作,同樣使用路徑 例如現在要刪除雷霆這個分類 首先根據其id找到路徑 **************************************/ /* $sql1="select id,path from wx_kind where id=20"; $result1=mysql_query($sql1); $row=mysql_fetch_assoc($result1); $id=$row['id']; $path=$row['path']; //構造出以該分類作為父類或者祖先分類的所有path $new_path=$path.'-'.$id; //下面就可以進行刪除動作了 $sql2="delete from wx_kind where id={$id} or path like '{$new_path}%'"; $result2=mysql_query($sql2); if($result2 && mysql_affected_rows()){ echo '刪除成功!'; }else{ echo '刪除失敗!'; } */ /*****************************************************/ //使用遞歸函數的方法,不解釋那麼多了,直接看代碼吧,主要就是查找的方式不一樣 function display_classify($pid=0,$num=0){ $sql="select id,name from wx_kind where pid={$pid}"; $result=mysql_query($sql); while($row=mysql_fetch_assoc($result)){ $id=$row['id']; $str=str_repeat(' ',$num); echo $str.$id.'=>'.$row['name'].'<hr/>'; display_classify($id,$num+1,$sid); } } //display_classify(); /*****************************************************/ //以下就是刪除的方法了,慢慢看吧主要就是下面說的刪除時的順序,和應該在哪進行刪除要注意一下 function del_classify($id){ //先使用遞歸來找出已該id為父id或祖先id的所有的子分類,然後依次從裡到外進行刪除操作,注意刪除時的順序 $sql="select id,name from wx_kind where pid={$id}"; $result=mysql_query($sql); while($row=mysql_fetch_assoc($result)){ $id=$row['id']; del_classify($id); } //刪除操作在循環外執行 $sql1="delete from wx_kind where id={$id}"; //直接進行刪除,而不是任何提示 $result=mysql_query($sql1); if(!($result && mysql_affected_rows())){ $bool=false; }else{ $bool=true; } return $bool; } //del_classify(5); 以下是數據庫代碼: -- -- 數據庫: `db_kind` -- -- -------------------------------------------------------- -- -- 表的結構 `wx_kind_dump` -- CREATE TABLE `wx_kind_dump` ( `id` int(11) NOT NULL auto_increment, `pid` int(11) NOT NULL, `name` char(40) NOT NULL, `path` char(40) NOT NULL, PRIMARY KEY (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=26 ; -- -- 導出表中的數據 `wx_kind_dump` -- INSERT INTO `wx_kind_dump` VALUES (1, 0, '新聞', '0'); INSERT INTO `wx_kind_dump` VALUES (2, 0, '視頻', '0'); INSERT INTO `wx_kind_dump` VALUES (3, 0, '圖片', '0'); INSERT INTO `wx_kind_dump` VALUES (4, 0, '讀書', '0'); INSERT INTO `wx_kind_dump` VALUES (5, 1, '政治新聞', '0-1'); INSERT INTO `wx_kind_dump` VALUES (6, 1, '財經新聞', '0-1'); INSERT INTO `wx_kind_dump` VALUES (7, 1, '娛樂新聞', '0-1'); INSERT INTO `wx_kind_dump` VALUES (8, 1, '體育新聞', '0-1'); INSERT INTO `wx_kind_dump` VALUES (9, 8, '籃球', '0-1-8'); INSERT INTO `wx_kind_dump` VALUES (10, 8, '足球', '0-1-8'); INSERT INTO `wx_kind_dump` VALUES (11, 8, 'F1', '0-1-8'); INSERT INTO `wx_kind_dump` VALUES (12, 8, '網球', '0-1-8'); INSERT INTO `wx_kind_dump` VALUES (13, 9, '國際籃球', '0-1-8-9'); INSERT INTO `wx_kind_dump` VALUES (14, 9, 'CBA', '0-1-8-9'); INSERT INTO `wx_kind_dump` VALUES (15, 9, 'CUBA', '0-1-8-9'); INSERT INTO `wx_kind_dump` VALUES (16, 9, 'NBA', '0-1-8-9'); INSERT INTO `wx_kind_dump` VALUES (17, 9, 'NCAA', '0-1-8-9'); INSERT INTO `wx_kind_dump` VALUES (18, 16, '熱火', '0-1-8-9-16'); INSERT INTO `wx_kind_dump` VALUES (19, 16, '湖人', '0-1-8-9-16'); INSERT INTO `wx_kind_dump` VALUES (20, 16, '雷霆', '0-1-8-9-16'); INSERT INTO `wx_kind_dump` VALUES (21, 16, '凱爾特人', '0-1-8-9-16'); INSERT INTO `wx_kind_dump` VALUES (22, 18, 'James', '0-1-8-9-16-18'); INSERT INTO `wx_kind_dump` VALUES (23, 18, 'Wade', '0-1-8-9-16-18'); INSERT INTO `wx_kind_dump` VALUES (24, 20, 'KD', '0-1-8-9-16-20'); INSERT INTO `wx_kind_dump` VALUES (25, 20, 'WS', '0-1-8-9-16-20');