既然选择了远方,便只顾风雨兼程~~~

一个更简单的无限级分类菜单代码

上一篇 / 下一篇  2007-01-03 14:38:23

查看( 8683 ) / 评论( 64 )
首先要感谢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]
<?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();//调用方法生成菜单
?>

[/php]

{E55C833E-55F2-4CCF-BF16-2F6AFB1A163A}.BMP

TAG:

辉老大的地盘 leehui1983 发布于2007-01-03 14:37:06
代码里  有个echo'  '中间是空的,其实是& n b s p ;代码加亮被过滤掉了:L
Phper的空间 Nickboy 发布于2007-01-03 14:43:24
这个可以看懂,向辉老大学习!
辉老大的地盘 leehui1983 发布于2007-01-03 14:46:33

QUOTE:

原帖由 Nickboy 于 2007-1-3 14:43 发表
这个可以看懂,向辉老大学习!
上次递归那个是有点复杂了,这个可能大家更喜欢,我也是新学来的,可不敢藏着,赶紧拿出来分享下:lol
laopi的个人空间 laopi 发布于2007-01-03 15:01:32
不错 这个好 能最好把修改删除添加的代码也都写上 那样就更好了。谢谢楼主
辉老大的地盘 leehui1983 发布于2007-01-03 15:03:38
呵呵~~大家自己扩展下,不难滴
辉老大的地盘 leehui1983 发布于2007-01-03 16:32:03
顶起
傲龍的天空 djlongshao 发布于2007-01-03 16:35:03
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>';
            }
       }

輝哥來點注釋
loveathena发布于2007-01-03 16:39:53
很不错的想法
zssupertim的个人空间 zssupertim 发布于2007-01-03 16:43:28
把整个程序共享一下好吗
辉老大的地盘 leehui1983 发布于2007-01-03 16:54:17

QUOTE:

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

輝哥來點注釋

PS:本程序只是 demo,不是完整项目,这就是全部

[ 本帖最后由 leehui1983 于 2007-1-3 16:55 编辑 ]
傲龍的天空 djlongshao 发布于2007-01-03 16:58:29
我看明白了,,這個數據庫的設計還真是有點想法才行...

不錯..
辉老大的地盘 leehui1983 发布于2007-01-03 17:09:54

QUOTE:

原帖由 djlongshao 于 2007-1-3 16:58 发表
我看明白了,,這個數據庫的設計還真是有點想法才行...

不錯..
我也这么认为:lol
绿竹居的个人空间 绿竹居 发布于2007-01-03 17:15:17
好东东,学习ING:) :)

可以把那个添加的页面也贴出来下吗??

谢谢。。。不太明白~~~

[ 本帖最后由 绿竹居 于 2007-1-3 17:18 编辑 ]
傲龍的天空 djlongshao 发布于2007-01-03 17:30:34
添加就自己寫個數據庫的添加語句不就可以了?
绿竹居的个人空间 绿竹居 发布于2007-01-03 17:34:43
就是不太明白怎么搞的。。。

才学PHP菜鸟、、、:') :') :')

帮个忙嘛。。。
辉老大的地盘 leehui1983 发布于2007-01-03 17:35:47
是啊!呵呵,其他的都好扩展,这个用于CMS的后台还是不错的,栏目管理部分
辉老大的地盘 leehui1983 发布于2007-01-03 20:44:26

QUOTE:

原帖由 绿竹居 于 2007-1-3 17:34 发表
就是不太明白怎么搞的。。。

才学PHP菜鸟、、、:') :') :')

帮个忙嘛。。。
这个~~~~等我有时间再做个完整点的吧,包括添加,删除,编辑,和显示栏目下的文章。
kukat的个人空间 kukat 发布于2007-01-03 20:50:28
hehe 不错不错 有点意思
天与海的博客 dmkf 发布于2007-01-03 20:55:05

zssupertim的个人空间 zssupertim 发布于2007-01-03 21:35:47

QUOTE:

原帖由 leehui1983 于 2007-1-3 20:44 发表

这个~~~~等我有时间再做个完整点的吧,包括添加,删除,编辑,和显示栏目下的文章。
希望能快点吧!
我来说两句

(可选)

Open Toolbar