1

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

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: %s\n", 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 作为 categoryId 传递给函数后,下一个通过的 categoryId 是 women,它应该定位最后的 subcats。有任何想法吗?

4

3 回答 3

1

老实说,您应该重新评估您的方法并废弃该功能。在递归函数中运行查询只是在找麻烦。如果您有 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

值得注意的是,这篇文章实际上建议遵循嵌套集模型。

于 2012-11-30T20:56:42.520 回答
0

您将在函数结束时关闭数据库连接。对于递归迭代,在第一次递归达到完全深度后,您将无法使用连接。

更好的方法是将您的数据库连接作为参数传递给函数

function display_children($parent, $db) {
    // when you recurse call
    display_children($categoryId, $db);
}

display_children('root', $connect);
mysqli_close($connect);
于 2012-11-30T20:55:03.953 回答
0

我认为您的问题在于您使用“退出”而不是“返回”语句。此外,您关闭与

mysqli_close($connect);

这不是你想做的。退出停止你的整个程序,而返回(即使你没有给你返回值)只是退出函数。

然后你必须改变你的算法,这完全不是正确的方法。

对我来说,最好的方法是首先获取所有结果(使用mysqli_fetch_all),然后以允许您以正确顺序显示它的方式对数组进行排序。

于 2012-11-30T20:56:05.040 回答