这个PHP递归函数有什么问题?



我有一个包含以下数据的数据库表:

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 ),然后以一种允许您以正确顺序显示数组的方式对数组进行排序。

最新更新