免费注册 查看新帖 |

Chinaunix

  平台 论坛 博客 文库
最近访问板块 发新帖
查看: 3204 | 回复: 9
打印 上一主题 下一主题

用PHP语言+MySql数据库怎样做多级树型菜单?请各位多多指点! [复制链接]

论坛徽章:
0
跳转到指定楼层
1 [收藏(0)] [报告]
发表于 2004-10-20 11:19 |只看该作者 |倒序浏览

各位大哥:小弟正在做一个网站,想实现一个多级树型菜单,菜单的父菜单与子菜单均成MySql数据库中调出,请问各位高手,怎样实现?请多多指教!

谢谢各位!

论坛徽章:
0
2 [报告]
发表于 2004-10-20 14:39 |只看该作者

用PHP语言+MySql数据库怎样做多级树型菜单?请各位多多指点!

建一个表

tblMenu
ID          ID号
FID      父ID
Name    菜单名
Link     链接
Icon     图标

再用PHP做一个递归。就是一个无限级树形菜单了,我以前做过。

论坛徽章:
0
3 [报告]
发表于 2004-10-20 16:29 |只看该作者

用PHP语言+MySql数据库怎样做多级树型菜单?请各位多多指点!

搜过没,好久以前讨论过的
http://bbs.chinaunix.net/forum/viewtopic.php?t=320616

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
4 [报告]
发表于 2004-10-20 17:15 |只看该作者

用PHP语言+MySql数据库怎样做多级树型菜单?请各位多多指点!

用递归会慢死的.

论坛徽章:
1
荣誉会员
日期:2011-11-23 16:44:17
5 [报告]
发表于 2004-10-20 17:15 |只看该作者

用PHP语言+MySql数据库怎样做多级树型菜单?请各位多多指点!

用递归会慢死的.

论坛徽章:
0
6 [报告]
发表于 2004-10-20 22:26 |只看该作者

用PHP语言+MySql数据库怎样做多级树型菜单?请各位多多指点!

我就用得剃归+js

论坛徽章:
0
7 [报告]
发表于 2004-10-21 00:06 |只看该作者

用PHP语言+MySql数据库怎样做多级树型菜单?请各位多多指点!

建表同aspbiz ,程序方面

用js把,有这样的开源程序的,兼容性非常好!

或者自己写js,先把这张表取出来(如果太大就不要全取了(200条以内)),然后对表数据用递归(不要无穷递归哦)!

<ul id="lvl0" class="ul0">;
   <li id="lvl00" class="li0">;para00</li>;
   <li id="lvl01" class="li0">;para01</li>;
   <li id="lvl02" class="li0">;
      <ul id="lvl1" class="ul1">;
            <li id="lvl10" class="li1">;para10</li>;
            <li id="lvl11" class="li1">;para11</li>;
            <li id="lvl12" class="li1">;para12</li>;
            <li id="lvl13" class="li1">;
                 <ul id="lvl2" class="ul2">;.....</ul>;
            </li>;
      </ul>;
    </li>;
    <li id="lvl03" class="li0">;para03</li>;

</ul>;


在js里面用 document.getElementById(id)和document.getElementsByTagName(tagName) 配合来查找节点,很方便,记得用标准的DOM方法哦!

论坛徽章:
0
8 [报告]
发表于 2004-10-21 15:08 |只看该作者

用PHP语言+MySql数据库怎样做多级树型菜单?请各位多多指点!

这个问题前段smth有个贴子的想法很好,实际使用的时候这么设计表格,递归只有在更新树的时候使用一次就行,也很好写

发信人: gutentag (Bonjour & 刷·刷·刷刷·刷···), 信区: WebDev
标 题: Re: 有没有人写出一个递归算法显示论坛帖子的算法
发信站: BBS 水木清华站 (Tue Sep 14 13:45:30 2004), 站内

我也推荐这种保存树形结构相关的数据办法,虽然牺牲一点存储空间,
但是免去了递归查询时的消耗

比如,把concat(RootID, ..., 父父ID, 父ID, ID) 作为一个字段保存下来,
比如叫idstru,每个ID前面要补零使其长度相等,添加新数据的时候就把父记录的
idstru 与 新记录的ID 接起来

直接对它排序,得到的就是树形结构了

举个例子:

mysql>; select id, pid, name, idstru from rec order by idstru;
+----+------+----------+-----------------+
| id | pid | name | idstru |
+----+------+----------+-----------------+
| 2 | NULL | Bob | 002 |
| 1 | 2 | Durand | 002;001 |
| 4 | 1 | Lee | 002;001;004 |
| 10 | 4 | Goethe | 002;001;004;010 |
| 7 | 2 | Rau | 002;007 |
| 3 | NULL | Tom | 003 |
| 5 | 3 | Mike | 003;005 |
| 11 | 3 | Linda | 003;011 |
| 6 | 11 | Michelle | 003;011;006 |
+----+------+----------+-----------------+

mysql>; select concat(lpad('', (length(idstru)-3)/4*2, ' '),name) as name
->; from rec order by idstru;
+--------------+
| name |
+--------------+
| Bob |
| Durand |
| Lee |
| Goethe |
| Rau |
| Tom |
| Mike |
| Linda |
| Michelle |
+--------------+

需要删除的时候也很方便,如果要把所有子记录都一起删掉,
比如删掉 id = 1 的所有子记录

mysql>; delete rec from rec r1, rec r2
->; where r1.idstru like concat(r2.idstru, '%') and r2.id=1;
Query OK, 3 rows affected (0.02 sec)

【 在 losa (因为所以) 的大作中提到: 】
: 递归从数据库调数据效率太低了,不用
: 以前有讨论过(5859),先要从数据库的表结构入手,把一些生成树形需要
: 的数据作为字段存在表里,在增删改数据时即时计算好这些值
: ...................

--

O Lieb, o Liebe, Du segnest herrlich O Maedchen, Maedchen,
So golden schoen, Das frische Feld, Wie lieb ich dich!
Wie Morgenwolken Im Blütendampfe Wie blickt dein Auge!
Auf jenen Hoehn! Die volle Welt. Wie liebst du mich!

※ 修改:·gutentag 于 Sep 14 14:12:45 修改本文·[FROM: 166.111.38.*]
※ 来源:·BBS 水木清华站 smth.org·[FROM: 166.111.38.*]

论坛徽章:
0
9 [报告]
发表于 2004-10-21 21:22 |只看该作者

用PHP语言+MySql数据库怎样做多级树型菜单?请各位多多指点!

数据库:

  1. CREATE TABLE `popdom` (
  2.   `popid` int(11) NOT NULL auto_increment,
  3.   `parentid` int(11) NOT NULL default '0',
  4.   `popname` varchar(30) NOT NULL default '',
  5.    PRIMARY KEY  (`popid`,`parentid`),
  6.   KEY `popid` (`popid`),
  7.   KEY `parentid` (`parentid`)
  8. )
复制代码

  1. 代码:
  2. ///////////////取?奘÷
  3. function popdomtree($popid,$type){
  4.         global $db,$layeri;
  5.         if(empty($layeri)){
  6.                 $layeri=0;
  7.         }
  8.         $layeri++;
  9.         $result=$db->;query("select * from popdom where parentid='$popid' order by popid asc");
  10.     echo "                                  <table width=\"100%\" border=\"0\" cellspacing=\"0\" cellpadding=\"0\">;\r\n";       
  11.         while($prow=$result->;fetchRow()){
  12.                 $subre=$db->;query("select count(*) as totalnum from popdom where parentid='$prow[popid]'");
  13.                 $subdb=$subre->;fetchRow();
  14.                 if($subdb[totalnum] !=0){
  15.             if($type=="edit"){
  16.                $actdo="popform.popid.value='$prow[popid]';popform.popname.value='$prow[popname]';";
  17.             }

  18.             echo "                    <tr>;
  19.                       <td width=\"4\">;<img src=../../images/+.gif>;</td>;
  20.                       <td >;<a href='#' onclick=\"$actdo ShowMenu(Menu$layeri);\">;$prow[popname]</td>;
  21.                      </tr>;\r\n";
  22.             echo "<tr id=\"Menu$layeri\" style='display:none'>;\r\n";
  23.                         echo "<td width='4'>;</td>;";
  24.                         echo "<td>;";
  25.                         popdomtree($prow[popid],$type);
  26.                         echo "<td>;<tr>;";
  27.                 }else{
  28.             if($type=="edit"){
  29.                echo "                    <tr>;
  30.                       <td width=\"4\">;<img src=../../images/-.gif>;</td>;
  31.                       <td>;<a href=\"#\" onclick=\"popform.popid.value='$prow[popid]';popform.popname.value='$prow[popname]';\">;$prow[popname]</td>;
  32.                      </tr>;\r\n";
  33.             }elseif($type=="assign"){
  34.                echo "                    <tr>;
  35.                       <td width=\"4\">;<img src=../../images/-.gif>;</td>;
  36.                       <td>;$prow[popname][<a href=\"#\" onclick=\"setpop($prow[popid])\">;分配</a>;]</td>;
  37.                      </tr>;\r\n";
  38.             }
  39.                 }
  40.                 $layeri++;
  41.         }
  42.     echo "                  </table>;\r\n";

  43. }
复制代码

js:
  1. <script language="javascript">;
  2. function ShowMenu(MenuID)
  3. {
  4. if(MenuID.style.display=="none")
  5. {
  6. MenuID.style.display="";
  7. }
  8. else
  9. {
  10. MenuID.style.display="none";
  11. }
  12. }
  13. </script>;
复制代码

这是我的权限管理+分配的树

论坛徽章:
0
10 [报告]
发表于 2004-10-22 10:22 |只看该作者

用PHP语言+MySql数据库怎样做多级树型菜单?请各位多多指点!

看到上面的回复,我真的很高兴!
小弟在这里表示感谢了!
谢谢各位!

有这么多的热心朋友,有什么困难都解决了!
呵呵!
您需要登录后才可以回帖 登录 | 注册

本版积分规则 发表回复

  

北京盛拓优讯信息技术有限公司. 版权所有 京ICP备16024965号-6 北京市公安局海淀分局网监中心备案编号:11010802020122 niuxiaotong@pcpop.com 17352615567
未成年举报专区
中国互联网协会会员  联系我们:huangweiwei@itpub.net
感谢所有关心和支持过ChinaUnix的朋友们 转载本站内容请注明原作者名及出处

清除 Cookies - ChinaUnix - Archiver - WAP - TOP