【发布时间】:2012-07-23 22:31:08
【问题描述】:
我正在寻找一种从 mysql 数据库中提取数据以创建无限子类别菜单的方法。 菜单中有大约 1500 个类别,它们以下列格式存储到数据库表(菜单)中:
category_id , 类别标题 , parent_id
我想做 1 次 mysql 查询以将所有数据放入一个数组中。
$menu_list =array();
$query = mysql_query("SELECT * FROM menu ORDER BY category_id ASC");
if(mysql_num_rows($query) != 0) {
while($row = mysql_fetch_array($query)){
$category_id = $row['category_id'];
$title = $row['category_title'];
$parent_id = $row[parent_id'];
$menu_list[] = array($category_id,$title,$parent_id);
}
}
这是我目前用来将数据转换为数组的代码。
然后我需要遍历数组来建立一个菜单。
然后我将隐藏所有子类别并使用 jquery 扩展(我可以做到这一点没问题)
我遇到的问题是遍历数组并以正确的顺序显示数据。 该菜单有无限的子类别,因此它可能需要一个递归函数来检索数据。 我已经关注了这里的很多示例,但后来我迷失了如何显示数据..
我现在需要结束:
main item
sub cat
sub cat
sub cat
sub cat
main item
sub cat
main item
main item
sub cat
sub cat
sub cat
sub cat
sub cat
etc...
每个类别都有自己的 div 然后我需要能够编辑每个类别(即,如果需要,标题名称和职位) 然后,如果我更改子类别的位置,则快速页面刷新将以新顺序重新加载菜单..
最后我想把它变成一个拖放,但这将在以后的日期。
我希望这已经足够解释它了..
提前谢谢..
所以问题又来困扰我了...... 我的 ajax 调用另一个 mysql 选择的方法对于 CMS 部分来说是可以的,因为它只是不时使用。 但是现在我们已经到了前端。 每次查看页面时,都会使用大量 mysql 请求来拉取菜单的前 3 级。 随着类别越来越大,这导致 1600 多个类别被多次提取,即使每天访问 1000 次也会导致每天超过 1000000 个 sql 请求。 所以我想我肯定需要将类别拉到一个数组中,然后递归地遍历数组。
我查看了上面的解决方案,它们似乎在纸上有效,但在实践中却没有。
如果有人可以尝试给我另一个解决方案,将不胜感激..
只是回顾一下我的数据库:id、category_name、parent_id
我现在将 PDO 与 mysql 和准备好的语句一起使用以增加安全性..
提前谢谢..
【问题讨论】:
-
我想你会在这个回复中得到你的答案:stackoverflow.com/a/10926952。它对我有用。
-
在尝试查询未知深度的完整树时,构建树的邻接列表将是非常有问题的。您可能需要考虑嵌套集模型(插入/更新/删除更痛苦)或闭包表模型。查看围绕多个模型进行讨论的问题 - stackoverflow.com/questions/192220/…
-
我还建议,除非您的类别结构一直在更改(例如每分钟或两分钟),否则最好缓存您的类别的数据表示以从 MySQL 卸载这项工作服务器。
标签: php mysql arrays recursion tree