我正在尝试从过程代码跳转到PDO类,并在根据初始查询的结果查询数据库时遇到问题。
在这个例子中,我有一个子菜单的菜单(id = $parent
),其详细信息我成功查询并存储在一个数组中供我访问。然后我尝试形成一个foreach循环来遍历该初始数组并再次查询DB以找到属于每个子菜单的页面。在这里,这个过程让我失望。
就像一个注释,连接很好,查询也可以在程序上顺利运行。我只是以新格式失败(我认为)。
如果有人能够指出我哪里出错了,我将不胜感激。我一直在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();
}
}
}
答案 0 :(得分:2)
这不是你想要做的:
while($m= $qPAGE->fetchAll()) {
由于fetchAll()
将返回所有列,因此while
语句不会迭代它们。您正在寻找的是:
$subrows = $qPAGE->fetchAll();
foreach( $subrows as $m) {
....
此外,您应该查看SQL JOIN语句,因为您可以将这些嵌套查询合并为一个。
答案 1 :(得分:1)
Nickb已经为您解决了您的具体问题。我唯一可以补充的是,你应该在使用命名参数时保持一致。您在初始查询中使用它们,并且也应该在嵌套查询中使用它们。
话虽如此,他提出的关于连接而不是N个查询的建议与我给出的建议是一样的。
您似乎已经必须执行一组查询来解决需要您通过所有子进程递归的层次结构,因此您应该将其重写为一个查询。
所有需要的是学习mysql的简单内连接语法,其中包含JOIN表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