我有一个包含以下数据的数据库表:
categoryId categoryName parentCategory
men Men root
women Women root
shoes Shoes root
mensshirts Men's Shirts men
menspants Men's Pants men
mensjeans Men's Jeans men
mensvests Men's Vests men
womensshirts Women's Shirts women
womenpants Women's Pants women
我正在使用递归函数来打印分层菜单。代码如下。
function display_children($parent) {
global $connect;
$query = "SELECT categoryId, categoryName FROM categories WHERE parentCategory='$parent'";
$result = mysqli_query($connect,$query);
if ( $result === false ) {
printf("Query Error: %sn", mysqli_error($connect));
exit();
}
echo "<ul>";
while ($row = mysqli_fetch_assoc($result)) {
extract($row);
echo "<li>".$categoryName."</li>";
display_children($categoryId);
}
echo "</ul>";
mysqli_close($connect);
}
display_children('root');
结果,我在屏幕上打印出来:
- 男人
- 男士衬衫
- 男士裤子
- 男士牛仔裤
- 男士背心
- 女人
- 鞋
递归函数没有打印出其余的子猫,我也不确定为什么。我的测试/调试已经证实,在mensvests作为类别ID传递到函数中后,下一个传递的categoryId是女性,它应该找到最后一个子猫。有什么想法吗?
老实说,你应该重新评估你的方法并废弃这个函数。在递归函数中运行查询只是在寻找麻烦。如果您有 50 个不同的类别分支,您是否真的想运行 50 个左右的查询,只是为了显示它们?您应该阅读这篇关于使用 MySQL 管理分层数据的文章。通过使用正确的方法,可以运行一个查询而不是多个查询。适用于你的方案的文章中的示例:
SELECT t1.name AS lev1, t2.name as lev2, t3.name as lev3, t4.name as lev4
FROM category AS t1
LEFT JOIN category AS t2 ON t2.parent = t1.category_id
LEFT JOIN category AS t3 ON t3.parent = t2.category_id
LEFT JOIN category AS t4 ON t4.parent = t3.category_id
值得注意的是,本文实际上建议遵循嵌套集模型。
您将在函数结束时关闭数据库连接。 对于递归迭代,在第一次递归进入完全深度后,您将没有可以使用的连接。
更好的方法是将数据库连接作为参数传递到函数中
function display_children($parent, $db) {
// when you recurse call
display_children($categoryId, $db);
}
display_children('root', $connect);
mysqli_close($connect);
我认为您的问题在于您使用"退出"而不是"返回"语句。此外,您关闭了与
mysqli_close($connect);
这不是你想做的。退出停止整个程序,而返回(即使你没有给出值tu return)只是出去函数。
然后你必须改变你的算法,这完全不是正确的方法。
对我来说,最好的方法是首先获取所有结果(使用 mysqli_fetch_all
),然后以一种允许您以正确顺序显示数组的方式对数组进行排序。