1

我正在尝试从程序代码跳转到 PDO 类,并且在根据初始查询的结果查询数据库时遇到了问题。

在这种情况下,我有一个子菜单的菜单 (id = $parent),我成功查询了它的详细信息并存储在一个数组中供我访问。然后我尝试形成一个 foreach 循环来循环遍历该初始数组并再次查询数据库以查找属于每个子菜单的页面。正是在这里,这个过程让我失望了。

需要注意的是,连接很好,并且查询在程序上也可以顺利运行。我只是在新格式上失败了(我认为)。

如果有人能指出我哪里出错了,我将不胜感激。while我一直在循环内运行查询,但我认为foreach这次是要走的路。

编码

function navigation($parent) {

$conn = ConnManager::get('DB');

    //initial query to get list of submenus belonging to $parent
try {       
    $qNAV= $conn->prepare('SELECT ID, Name FROM prm_menu WHERE Parent = :parent');
    $qNAV->execute(array('parent' => $parent));
    $qNAV->setFetchMode(PDO::FETCH_ASSOC);  
    $n=$qNAV->fetchAll();
} 
catch(PDOException $e) {
    echo $e->getMessage();
}

    //now I try to cycle through the array and run another query each time.
foreach($n as $menu) {
    $id = $menu['ID'];
    try{
        $qPAGE=$conn->prepare('SELECT ID, Title, URLName, MenuOrder FROM posts 
                    WHERE MenuID = $id AND Status = 1 ORDER BY MenuOrder ASC, ID ASC');
        $qPAGE->execute(); 
        $qPAGE->setFetchMode(PDO::FETCH_ASSOC);  
        while($m= $qPAGE->fetchAll()) {
            $menu_item = '<li id="navPage'.$m['ID'].'" class="menu-nav">';
            $menu_item.= '<a href="'.$m['URLName'].'">'.$m['Title'].'</a>';
            $menu_item.= '</li>';

            echo '<div class="menu-nav-wrap">';
            echo '<span class="menu-title">'.$menu['Name'].'</span>';
            echo '<ul class="menu-list">';
            echo $menu_item;
            echo '</ul>';
            echo '</div>';
        }

    }
    catch(PDOException $e) {
        echo $e -> getMessage();
    }
}
}
4

2 回答 2

2

这不是你想要做的:

while($m= $qPAGE->fetchAll()) {

由于fetchAll()将返回所有列,因此该while语句不会遍历它们。你要找的是这个:

$subrows = $qPAGE->fetchAll();
foreach( $subrows as $m) {
    ....

此外,您应该查看 SQL JOIN 语句,因为您可以将这些嵌套查询合并为一个查询。

于 2012-08-03T16:11:08.450 回答
1

Nickb 为您提供了针对您的具体问题的解决方案。我唯一可以补充的是,您应该在使用命名参数时保持一致。您在初始查询中使用了它们,并且也应该在嵌套查询中使用它们。

话虽如此,他关于进行联接而不是 N 查询的建议与我给出的建议相同。

看来您已经必须执行一组查询来解决需要您递归遍历所有子级的层次结构,甚至有更多理由将其重写为一个查询。

所需要的只是学习 mysql 的简单内部连接语法,其中包括 JOIN table t ON (a.id = t.id)。然后你会得到一个结果集来循环。例如,这似乎是您需要的:

SELECT pm.ID, Name, p.ID, Title, URLName, MenuOrder
FROM prm_menu pm 
JOIN posts p ON (p.MenuID = pm.ID AND pm.Parent = :parent' AND p.Status = 1)
ORDER BY p.MenuOrder ASC, p.ID ASC
于 2012-08-03T16:29:54.007 回答