用php+mysql实现菜单树的问题

yyhlong 2002-09-08 09:39:29
具体问题是没有级数限制,点该树中的菜单时,在另外的frame中显示菜单的程序内容。数据表怎么设计?
...全文
38 3 打赏 收藏 转发到动态 举报
写回复
用AI写文章
3 条回复
切换为时间正序
请发表友善的回复…
发表回复
d_einstein 2002-11-16
  • 打赏
  • 举报
回复
Good!
bombshell 2002-11-16
  • 打赏
  • 举报
回复
<html>
<head>
<link href='image/style1.css' rel=stylesheet>
<script language="JavaScript">
function ShowMenu(MenuID)
{
if(MenuID.style.display=="none")
{
MenuID.style.display="";
}
else
{
MenuID.style.display="none";
}
}
</script
</head>
<body>
<?php
//基本变量设置
$GLOBALS["ID"] = 1; //用来跟踪下拉菜单的ID号
$layer = 1; //用来跟踪当前菜单的级数

//连接数据库
$Con = mysql_connect("localhost","root","");
mysql_select_db("netoffice");

//提取一级菜单
$sql = "select * from menu where parent_id=0";
$result = mysql_query($sql,$Con);

//如果一级菜单存在则开始菜单的显示
if(mysql_num_rows($result)>0) ShowTreeMenu($Con,$result,$layer,$ID);


//=============================================
//显示树型菜单函数 ShowTreeMenu($con,$result,$layer)
//$con:数据库连接
//$result:需要显示的菜单记录集
//layer:需要显示的菜单的级数
//=============================================
function ShowTreeMenu($Con,$result,$layer)
{
//取得需要显示的菜单的项目数
$numrows = mysql_num_rows($result);

//开始显示菜单,每个子菜单都用一个表格来表示
echo "<table cellpadding='0' cellspacing='0' border='0'>";

for($rows=0;$rows<$numrows;$rows++)
{
//将当前菜单项目的内容导入数组
$menu = mysql_fetch_array($result);

//提取菜单项目的子菜单记录集
$sql = "select * from menu where parent_id=$menu[id]";
$result_sub = mysql_query($sql,$Con);

echo "<tr>";
//如果该菜单项目有子菜单,则添加JavaScript onClick语句
if(mysql_num_rows($result_sub)>0)
{
echo "<td width='20'><img src='../image/openfold.gif' border='0'></td>";
echo "<td class='Menu' onClick='javascript:ShowMenu(Menu".$GLOBALS["ID"].");'>";
}
else
{
echo "<td width='20'><img src='../image/closedfold.gif' border='0'></td>";
echo "<td class='Menu'>";
}
//如果该菜单项目没有子菜单,并指定了超级连接地址,则指定为超级连接,
//否则只显示菜单名称
if($menu[url] != "")
echo "<a href='$menu[url]' target='$menu[show_frame]'>$menu[name]</a>";
else
echo $menu[name];
echo "
</td>
</tr>
";

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

表结构如下:
create table menu(
id tinyint(4),
parent_id tinyint(4),
name varchar(20),
url varchar(30),
primary key(id));

pcdreama 2002-09-09
  • 打赏
  • 举报
回复
在数据表里面设置一个toplevel的字段,标识上层树的id号。
用递归的方法就可以生成一个无限深度的树。当然深度太高效率会低。

function tree($toplevel=0){
$sql=select * from tbl where toplevel=$toplevel;
$result=mysql_query($sql);
$treehtml=""; // 这个变量用来返回这个树枝的html代码
while($row=mysql_fetch_array($result)){
....... // 生成当前层的树
$treehtml.=tree($row["id"]); //用递归继续生成下一级的树.
.......
}
return $treehtml;
}

没测试果,即场写的,理论上是这样吧... :P

21,882

社区成员

发帖
与我相关
我的任务
社区描述
从PHP安装配置,PHP入门,PHP基础到PHP应用
社区管理员
  • 基础编程社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧