mysql递归:使用" 函数递归" 实现基于php和MySQL的动态树型菜单

  树型菜单在很多桌面应用系统中都有非常广泛应用其主要优点是结构清晰利于使用者非常清楚知道目前自己所在位置但在web上树型菜单应用没有理想现成组件可以拿过来直接使用所以情况下员主要是通过JavaScript来实现些简单树型结构菜单但这些菜单往往都是事先定好各菜单项目以及各菜单项目的间层次关系不利于扩充旦需要另个菜单结构时往往还需要重新编写因此使用起来不是很方便

  经过对递归研究我发现这种树型菜单可以通过递归使树型菜单显示实现动态变化并没有级数限制下面就是我用php,MySQL,JavaScript写个动态树型菜单处理代码如果大家有兴趣就和我起来看看我是如何实现吧:)

  首先我们需要个数据库在这个数据库中我们建立以下张表:

CREATE TABLE menu (
id tiny(4) NOT NULL auto_increment,
parent_id tiny(4) DEFAULT '0' NOT NULL,
name varchar(20),
url varchar(60),
PRIMARY KEY (id)
);


  这张表中

  id 为索引

  parent_id 用来保存上级菜单id号如果是级菜单则为0

  name 为菜单名称也就是要在页面上显示菜单内容

  url 如果某菜单为末级菜单则需要指定该连接url地址这个字段就是用来保存此地址其他非末级菜单该字段为空

  好了数据库有了你就可以添加些记录了下面是我做测试时候使用些记录:

INSERT INTO menu VALUES ( '1', '0', '人事管理', '');
INSERT INTO menu VALUES ( '2', '0', '通讯交流', '');
INSERT INTO menu VALUES ( '3', '1', '档案管理', '');
INSERT INTO menu VALUES ( '4', '1', '考勤管理', 'http://localhost/personal/attendance.php');
INSERT INTO menu VALUES ( '5', '2', '通讯录', '');
INSERT INTO menu VALUES ( '6', '2', '网络会议', '');
INSERT INTO menu VALUES ( '7', '3', '新增档案', 'http://localhost/personal/add_achive.php');
INSERT INTO menu VALUES ( '8', '3', '查询档案', 'http://localhost/personal/search_archive.php');
INSERT INTO menu VALUES ( '9', '3', '删除档案', 'http://localhost/personal/delete_archive.php');
INSERT INTO menu VALUES ( '10', '5', '新增通讯记录','http://localhost/communication/add_address.php');
INSERT INTO menu VALUES ( '11', '5', '查询通讯记录', http://localhost/communication/search_address.php');
INSERT INTO menu VALUES ( '12', '5', '删除通讯记录', http://localhost/communication/delete_address.php');
INSERT INTO menu VALUES ( '13', '6', '召开会议', 'http://localhost/communication/convence_meeting.php');
INSERT INTO menu VALUES ( '14', '6', '会议查询', 'http://localhost/communication/search_meeting.php');


  在添加记录时候定要注意级菜单parent_id定要指定为上级菜单ID号否则你菜单是不会显示出来:)

  好了!有了数据库下面就是通过php,JavaScript把菜单从数据库中读出来并显示出来了:)

  1、JavaScript脚本: function ShowMenu(MenuID)
{
(MenuID.style.display"none")
{
MenuID.style.display="";
}

{
MenuID.style.display="none";
}
}


  这个脚本很简单就是用来响应点击某个菜单被点击事件

  2、CSS文件: <!-- 表格样式 -->
TD {
FONT-FAMILY: "Verdana", "宋体"; FONT-SIZE: 12px; LINE-HEIGHT: 130%; letter-spacing:1px
}
<!-- 超级连接样式 -->
A:link {
COLOR: #990000; FONT-FAMILY: "Verdana", "宋体"; FONT-SIZE: 12px; TEXT-DECORATION: none; letter-spacing:1px
}
A:visited {
COLOR: #990000; FONT-FAMILY: "Verdana", "宋体"; FONT-SIZE: 12px; TEXT-DECORATION: none; letter-spacing:1px
}
A:active {
COLOR: #990000; FONT-FAMILY: "Verdana", "宋体"; FONT-SIZE: 12px; TEXT-DECORATION: none; letter-spacing:1px
}
A:hover {
COLOR: #ff0000; FONT-FAMILY: "Verdana", "宋体"; FONT-SIZE: 12px; TEXT-DECORATION: underline; letter-spacing:1px
}
<!-- 其他样式 -->
.Menu {
COLOR:#000000; FONT-FAMILY: "Verdana", "宋体"; FONT-SIZE: 12px; CURSOR: hand
}


  定义了些基本样式信息比如字体颜色超级连接样式等如果你想改变样式只要修改这里就行了!

  3、下面就是我php页面了!

<html>
<head>
<linkShowMenu(Menu".$GLOBALS["ID"].");'>";
}

{
echo "<td width='20'><img src='file.g' border='0'></td>";
echo "<td ='Menu'>";
}
//如果该菜单项目没有子菜单并指定了超级连接地址则指定为超级连接
//否则只显示菜单名称
($menu[url]!="")
echo "<a href='$menu[url]'>$menu[name]</a>";

echo $menu[name];
echo "
</td>
</tr>
";
//如果该菜单项目有子菜单则显示子菜单
(mysql_num_rows($result_sub)>0)
{
//指定该子菜单ID和style以便和onClick语句相对应
echo "<tr id=Menu".$GLOBALS["ID"]." style='display:none'>";
echo "<td width='20'>&nbsp;</td>";
echo "<td>";
//将级数加1
$layer;
//递归ShowTreeMenu生成子菜单
ShowTreeMenu($Con,$result_sub,$layer);
//子菜单处理完成返回到递归将级数减1
$layer--;
echo "</td></tr>";
}
//继续显示下个菜单项目
}
echo "</table>";
}
?>
</body>
</html>




  在上面php页面里面我定义了ShowTreeMenu通过这个会从数据库中递归调出每个菜单项目并显示在页面上了:)



Tags:  php递归函数 原始递归函数 递归函数 mysql递归

延伸阅读

最新评论

发表评论