2012-08-03 123 views
1

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

在这个例子中,我有一个子菜单的菜单(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(); 
    } 
} 
} 

回答

2

这不是你想要做什么:

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

由于fetchAll()将返回所有列,该while语句是遍历他们。什么你要找的是这样的:

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

此外,你应该考虑SQL JOIN声明,因为你可以将这些嵌套查询合并成一个单一的一个。

+0

感谢nickb - 在程序上我会尝试加入,但我只是想与PDO的语法去之前,我开始阐述查询本身。不幸的是,上面只是返回每个子菜单的空数组(尽管'$ id'正在填充一个值)。 – Eamonn 2012-08-03 16:22:59

+0

PDO的OOP接口的使用与您使用的查询类型完全没有关系。 – gview 2012-08-03 16:30:40

+0

我明白,我的意思是我希望在学习一种新的,虽然是单独的语法的同时保持一般的简单性高。不过谢谢。 – Eamonn 2012-08-03 16:33:09

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 
+0

感谢您的帮助! :) – Eamonn 2012-08-03 16:34:09