Php 嵌套PDO查询失败?

Php 嵌套PDO查询失败?,php,mysql,pdo,Php,Mysql,Pdo,我有以下代码: $sql = $pdo->query("SELECT pageid FROM webpages WHERE ISNULL(deleted) ORDER BY sortindex"); while ($row = $sql->fetch(PDO::FETCH_ASSOC)) { switch ($row["pageid"]) { case "information": Write(" <li class='top'><a href=

我有以下代码:

$sql = $pdo->query("SELECT pageid FROM webpages WHERE ISNULL(deleted) ORDER BY sortindex"); 
while ($row = $sql->fetch(PDO::FETCH_ASSOC)) {
  switch ($row["pageid"]) {
  case "information":
    Write("  <li class='top'><a href='index.php?m=info' id='info' class='top_link'><span class='down'>Information</span></a>");
    Write("    <ul class='sub'>");
    Write("      <li><a href='index.php?m=info&submode=n'>News</a></li>");
    Write("      <li><a href='index.php?m=info&submode=e'>Events</a></li>");
    Write("      <li><a href='index.php?m=info&submode=m'>Minutes</a></li>");
    $subsql = $pdo->query("SELECT * FROM categories WHERE visible = 1 ORDER BY sortindex,category"); 
    while ($catrow = $subsql->fetch(PDO::FETCH_ASSOC)) Write("      <li><a href='index.php?m=info&cat={$catrow["cid"]}'>{$catrow["category"]}</a></li>");
    Write("    </ul>");
    break;
  }
}
$sql=$pdo->query(“从按sortindex排序为空(已删除)的网页中选择pageid”);
而($row=$sql->fetch(PDO::fetch_ASSOC)){
开关($row[“pageid”]){
案例“信息”:
写“
  • ”; 写(“
      ”; 写(“
    • ”); 写(“
    • ”); 写(“
    • ”); $subsql=$pdo->query(“从可见的类别中选择*=1 ORDER BY sortindex,类别”); 而($catrow=$subsql->fetch(PDO::fetch_ASSOC))写(“
    • ”; 写“
    ”; 打破 } }
  • 当我运行它时,我得到“致命错误:在第29行的/chroot/home/web/html/test.php中对非对象调用成员函数fetch()”,第29行是“while($catrow…”行

    但是,在我的开发服务器上,它可以工作。我应该检查什么来确定如何使它在生产服务器上工作?我不知道为什么它会失败。如果我将代码移出第一个SQL循环,它在生产服务器上可以正常工作。这没有问题:

    $sql = $pdo->query("SELECT pageid FROM webpages WHERE ISNULL(deleted) ORDER BY sortindex"); 
    while ($row = $sql->fetch(PDO::FETCH_ASSOC)) {
      switch ($row["pageid"]) {
      case "information":
        Write("  <li class='top'><a href='index.php?m=info' id='info' class='top_link'><span class='down'>Information</span></a>");
        Write("    <ul class='sub'>");
        Write("      <li><a href='index.php?m=info&submode=n'>News</a></li>");
        Write("      <li><a href='index.php?m=info&submode=e'>Events</a></li>");
        Write("      <li><a href='index.php?m=info&submode=m'>Minutes</a></li>");
        Write("    </ul>");
        break;
      }
    }
    $subsql = $pdo->query("SELECT * FROM categories WHERE visible = 1 ORDER BY sortindex,category"); 
    while ($catrow = $subsql->fetch(PDO::FETCH_ASSOC)) Write("Cat: {$catrow["category"]}<br/>");
    
    $sql=$pdo->query(“从按sortindex排序为空(已删除)的网页中选择pageid”);
    而($row=$sql->fetch(PDO::fetch_ASSOC)){
    开关($row[“pageid”]){
    案例“信息”:
    写“
  • ”; 写(“
      ”; 写(“
    • ”); 写(“
    • ”); 写(“
    • ”); 写“
    ”; 打破 } } $subsql=$pdo->query(“从可见的类别中选择*=1 ORDER BY sortindex,类别”); 而($catrow=$subsql->fetch(PDO::fetch_ASSOC))写($Cat:{$catrow[“category”]}
    );

  • 当我运行它时,第一个循环会运行,然后我会很好地获得类别列表。我知道我无法准确地通过堆栈溢出来排除服务器故障,但是如果有人知道什么样的配置调整或其他问题会导致这种行为,我将非常感谢任何提示:)未完全获取的语句可能会阻止其他语句实际发生(因此,
    $subsql
    不是有效的PDO对象)。这可能会奏效:

    $rows = $pdo->query("SELECT pageid FROM webpages WHERE ISNULL(deleted) ORDER BY sortindex")->fetchAll(PDO::FETCH_ASSOC); 
    foreach ($rows as $row) {
      switch ($row["pageid"]) {
      case "information":
        Write("  <li class='top'><a href='index.php?m=info' id='info' class='top_link'><span class='down'>Information</span></a>");
        Write("    <ul class='sub'>");
        Write("      <li><a href='index.php?m=info&submode=n'>News</a></li>");
        Write("      <li><a href='index.php?m=info&submode=e'>Events</a></li>");
        Write("      <li><a href='index.php?m=info&submode=m'>Minutes</a></li>");
        $subsql = $pdo->query("SELECT * FROM categories WHERE visible = 1 ORDER BY sortindex,category"); 
        while ($catrow = $subsql->fetch(PDO::FETCH_ASSOC)) Write("      <li><a href='index.php?m=info&cat={$catrow["cid"]}'>{$catrow["category"]}</a></li>");
        Write("    </ul>");
        break;
      }
    }
    
    $rows=$pdo->query(“从按sortindex排序为空(已删除)的网页中选择pageid”)->fetchAll(pdo::FETCH_ASSOC);
    foreach($行作为$行){
    开关($row[“pageid”]){
    案例“信息”:
    写“
  • ”; 写(“
      ”; 写(“
    • ”); 写(“
    • ”); 写(“
    • ”); $subsql=$pdo->query(“从可见的类别中选择*=1 ORDER BY sortindex,类别”); 而($catrow=$subsql->fetch(PDO::fetch_ASSOC))写(“
    • ”; 写“
    ”; 打破 } }
  • what is
    ISNULL(deleted)
    ?deleted是MySQL中的一个datetime字段,用于让我知道内容负责人将其标记为deleted的日期/时间。我不喜欢实际删除内容,我只是将其标记为这样并隐藏起来。我想这是个“回收站”。如果我将查询复制到phpMyAdmin中并在那里执行,我会得到很好的结果。我想不出它是由什么代码组成的。啊,对不起,我应该把它们改成echos作为例子。这只是我使用的一个小东西(函数Write($str){echo“$str\n”;})。我注意到当使用echo时,如果我必须在输出上“查看源代码”,那么很难阅读所有塞满的内容,因此我使用echo使其更清晰。有一种更好的方法可以输出整洁的HTML。非常感谢。这就是问题所在,您的修改在我的prod服务器上运行得非常好。我想知道为什么它能在我的dev-one上工作。我的开发人员运行一个旧的PHP,也许这是他们在以后版本中修复/更改的?好吧,不管怎样,谢谢大家!!嗯,可能在您的开发服务器中,第一条语句只返回一行?这可能会帮助您:不,这两个数据库是相同的。不过我会看文件的,谢谢。