返回列表 回复 发帖

[总结] 一个更简单的无限级分类菜单代码

[总结] 一个更简单的无限级分类菜单代码

首先要感谢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



/**************************************

   

  页面:menu.php

  作者:辉老大

  功能:定义数据库操作及生成菜单列表类



**************************************/

class menu{



       
//创建构造函数,作用:数据库连接并选择相应数据库

       
public function __construct(){

           
$dbhost     "localhost";

           
$dbuser     "root";

           
$dbpassword "7529639";

           
$dbname     "menu";

           
mysql_connect($dbhost,$dbuser,$dbpassword) or die("error!");

           
mysql_query("SET NAMES 'GBK'");

           
mysql_select_db($dbname);

       }



       
//执行SQL语句函数

       
private function query($sql){

           return 
mysql_query($sql);

       }



       
//取得结果集数组函数

       
private function loop_query($result){

           return 
mysql_fetch_array($result);

       }

       
//列出菜单列表函数

       
public function menulist(){

           
$sql="select * from list order by path";

           
$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>';

            }

       }



       
//创建析构函数,作用:关闭数据库连接

       
public function __destruct(){

           return 
mysql_close();

       }

   }

  
$db=new menu();//生成实例

  
$db->menulist();//调用方法生成菜单

?>

复制代码
附件: 您所在的用户组无法下载或查看附件
1

评分次数

  • Phzzy

每当我在考场上狂砍六七十分,你一定以为那是我一个人干的,但考试从来都不是一个人的事。”离考试结束只有十秒了,但麦迪还需要一个三分!于是他向科比发出信号,只剩五秒了!监考老师也在死死地盯防科比,但天才就是天才,科比还是以一个不可思议的角度将答案传了出去!麦迪接答案!只剩三秒了!整个考场都在试图阻止麦迪,老师抓住了他的右手,但他还是抄了起来!天哪!他用的是左手!整个考场沸腾了!监考老师已经感动地要哭了,但麦迪却先哭了起来,只见他将纸条狠狠地砸向讲台,然后起身黯然离场。原来上面写的是:“我也不会~~”
代码里  有个echo'  '中间是空的,其实是& n b s p ;代码加亮被过滤掉了:L
每当我在考场上狂砍六七十分,你一定以为那是我一个人干的,但考试从来都不是一个人的事。”离考试结束只有十秒了,但麦迪还需要一个三分!于是他向科比发出信号,只剩五秒了!监考老师也在死死地盯防科比,但天才就是天才,科比还是以一个不可思议的角度将答案传了出去!麦迪接答案!只剩三秒了!整个考场都在试图阻止麦迪,老师抓住了他的右手,但他还是抄了起来!天哪!他用的是左手!整个考场沸腾了!监考老师已经感动地要哭了,但麦迪却先哭了起来,只见他将纸条狠狠地砸向讲台,然后起身黯然离场。原来上面写的是:“我也不会~~”
这个可以看懂,向辉老大学习!
原帖由 Nickboy 于 2007-1-3 14:43 发表
这个可以看懂,向辉老大学习!
上次递归那个是有点复杂了,这个可能大家更喜欢,我也是新学来的,可不敢藏着,赶紧拿出来分享下:lol
每当我在考场上狂砍六七十分,你一定以为那是我一个人干的,但考试从来都不是一个人的事。”离考试结束只有十秒了,但麦迪还需要一个三分!于是他向科比发出信号,只剩五秒了!监考老师也在死死地盯防科比,但天才就是天才,科比还是以一个不可思议的角度将答案传了出去!麦迪接答案!只剩三秒了!整个考场都在试图阻止麦迪,老师抓住了他的右手,但他还是抄了起来!天哪!他用的是左手!整个考场沸腾了!监考老师已经感动地要哭了,但麦迪却先哭了起来,只见他将纸条狠狠地砸向讲台,然后起身黯然离场。原来上面写的是:“我也不会~~”
不错 这个好 能最好把修改删除添加的代码也都写上 那样就更好了。谢谢楼主
welcome to my blog
呵呵~~大家自己扩展下,不难滴
每当我在考场上狂砍六七十分,你一定以为那是我一个人干的,但考试从来都不是一个人的事。”离考试结束只有十秒了,但麦迪还需要一个三分!于是他向科比发出信号,只剩五秒了!监考老师也在死死地盯防科比,但天才就是天才,科比还是以一个不可思议的角度将答案传了出去!麦迪接答案!只剩三秒了!整个考场都在试图阻止麦迪,老师抓住了他的右手,但他还是抄了起来!天哪!他用的是左手!整个考场沸腾了!监考老师已经感动地要哭了,但麦迪却先哭了起来,只见他将纸条狠狠地砸向讲台,然后起身黯然离场。原来上面写的是:“我也不会~~”
顶起
每当我在考场上狂砍六七十分,你一定以为那是我一个人干的,但考试从来都不是一个人的事。”离考试结束只有十秒了,但麦迪还需要一个三分!于是他向科比发出信号,只剩五秒了!监考老师也在死死地盯防科比,但天才就是天才,科比还是以一个不可思议的角度将答案传了出去!麦迪接答案!只剩三秒了!整个考场都在试图阻止麦迪,老师抓住了他的右手,但他还是抄了起来!天哪!他用的是左手!整个考场沸腾了!监考老师已经感动地要哭了,但麦迪却先哭了起来,只见他将纸条狠狠地砸向讲台,然后起身黯然离场。原来上面写的是:“我也不会~~”
public function menulist(){
           $sql="select * from list order by path";
           $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>';
            }
       }

輝哥來點注釋
我除了一身傲氣外一無所有!
很不错的想法
把整个程序共享一下好吗
返回列表