2013-06-20 79 views
-2

我想使用jQueryUI选项卡和菜单窗口小部件创建一个目录列表。我有以下代码来获取目录。PHP致命错误:未捕获异常'PDOException'

<?php 

    $db = new PDO('mysql:host='.$host.';dbname='.$databaseName, 
        $user, 
        $password, 
        array(
         PDO::ATTR_EMULATE_PREPARES => false, 
         PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION 
       ) 
       ); 

    $menu = ''; 
    $charTabs = '<div id="charTabs">'; //1 
    $db->exec('set names utf8'); 
    $queryFirstLetters = $db->prepare('SELECT DISTINCT LEFT(organization, 1) as org FROM Organizations WHERE parent_id = 0 ORDER BY organization', array(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true)); 

    //Add each first characters to the charTabs 
    $queryFirstLetters->execute(); 
    $charTabs .='<ul>'; //2 
    while($rowFL = $queryFirstLetters->fetch(PDO::FETCH_ASSOC)) 
    { 
     $charTabs .= '<li><a href="#' . $rowFL['org'] . '">' . $rowFL['b'] . '</a></li>';//3 
    } 
    $charTabs .= '</ul>'; //4 

    //Create Divs corresponding to list items for each first letter. 
    $queryFirstLetters->execute(); 
    while($rowFL = $queryFirstLetters->fetch(PDO::FETCH_ASSOC)) 
    { 
     $charTabs .= '<div id="' . $rowFL['org'] . '">'; //5 

     //Get the parent organizations and add their children as sub menu items 
     $queryParentOrganizations = $db->prepare('SELECT * FROM Organizations WHERE parent_id = 0 AND LEFT(organization,1) = :p1 ORDER BY organization', array(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true)); 
     $queryParentOrganizations->bindValue(':p1', $rowFL['org'], PDO::PARAM_STR); 
     //This is the line 26 which crashes 
     $queryParentOrganizations->execute(); 
     //This is the line 26 which crashes 
     echo '<script>$(function(){ $("#menu'.$rowFL['org'].'").menu(); });</script>'; 
     $menu = '<ul id="menu'.$rowFL['org'].'">'; 
     while($rowPO = $queryParentOrganizations->fetch(PDO::FETCH_ASSOC)) 
     { 
      $queryChildOrganizations = $db->prepare('SELECT * FROM Organizations WHERE parent_id = :p1 ORDER BY organization', array(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY => true)); 
      $queryChildOrganizations->bindValue(':p1', $rowPO['id'], PDO::PARAM_INT); 
      $queryChildOrganizations->execute(); 

      $menu .= '<li><a class="list" href="#">'.$rowPO['organization'].'</a>'; 
      if ($queryChildOrganizations->rowCount() > 0) 
      { 
       $menu .= '<ul>'; 
       while($rowCO = $queryChildOrganizations->fetch(PDO::FETCH_ASSOC)) 
       { 
        $menu .= '<li><a class="list" href="#' . $rowCO['id'] . '">' . $rowCO['organization'] . '</a></li>'; 
       } 
       $menu .= '</ul>'; 
      } 
      else 
      { 
       $menu .= '</li>'; 
      } 
     } 
     $menu .= '</ul>'; 
     $charTabs .= $menu . '</div>'; 
    } 
    $charTabs .= '</div>'; 

    echo $charTabs; 
?> 

忽略性能问题,它工作正常。但是在上传到服务器后,我得到了与PDO相关的以下错误。而其他非缓冲查询是活跃

PHP Fatal error: Uncaught exception 'PDOException' with message 'SQLSTATE[HY000]: General error: 2014 Cannot execute queries while other unbuffered queries are active. Consider using PDOStatement::fetchAll(). Alternatively, if your code is only ever going to run against mysql, you may enable query buffering by setting the PDO::MYSQL_ATTR_USE_BUFFERED_QUERY attribute.' in /home/server/public_html/directory/index.php:26

Stack trace:

# 0 /home/server/public_html/directory/index.php(26): PDO->prepare('SELECT * FROM O...')

# 1 /home/server/public_html/directory/index.php(26): include('/home/server/publ...')

# 2 {main} thrown in /home/server/public_html/directory/index.php on line 26

+0

如果我使用mysql_ *函数,它应该已经工作。 – zkanoca

回答

0

无法执行查询。考虑使用PDOStatement::fetchAll()。另外,如果你的代码只是针对mysql运行,你可以通过设置PDO::MYSQL_ATTR_USE_BUFFERED_QUERY属性来启用查询缓冲。

+4

显然OP不理解。 – christopher

+0

那么我试图使用'PDO :: MYSQL_ATTR_USE_BUFFERED_QUERY'属性。但它不会改变任何事情。我得到了同样的错误信息。 – zkanoca

+0

1.你可能会尝试错误的方式。你为什么不包括你在你的问题中尝试过什么? 2.通过错误信息异常提出了另一种解决方案。 –

相关问题