PDO «Неперехваченное исключение« PDOException ».. Невозможно выполнять запросы, пока активны другие небуферизованные запросы. Рассмотрите возможность использования PDOStatement ::fetchAll ().

Я знаю, что этот вопрос задавали много раз, но я прочитал ответы на многие вопросы и до сих пор не могу понять, почему я получаю эту ошибку:

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.'

Первое, что странно, это то, что я не получаю ошибку на моем локальном хосте (wampserver ), но я получаю ее на своем веб-сервере. Версия php на моем локальном хосте — 5.3.10, а на моем веб-сервере — 5.3.13.

Я читал, что источником этой ошибки является выполнение запроса, когда данные остались в буфере из предыдущего запроса.Это не относится ко мне --Я вывел все данные и точно знаю, что каждая строка, возвращаемая в запросе, извлекается.

С учетом сказанного я обнаружил, что изменение одного из моих запросов на fetchAllвместо fetchустраняет проблему, но это просто не делает, поскольку я знаю , что все возвращаемые строки читаются. Когда я использовал fetchAllдля запроса (, он выполняется в цикле ), я распечатывал массив в каждом цикле, и только один элемент был в массиве для каждого запроса в цикле.

Еще одна информация. Это не тот запрос, который я изменил наfetchAll(что устраняет ошибку ), которая выдает ошибку PDO, позже в моем php-файле есть еще один запрос, который выдает ошибку. Мой файл в основном такой:

... code...

query 1

... code...

loop
query 2
end loop

... code... 

query 3

Если я закомментирую запрос 3, ошибки не будет. Если я закомментирую или перейду на fetchAll, запрос 2, ошибки не будет. запрос 1 ни на что не влияет.

Я также хотел бы добавить, что я пытался добавить LIMIT 1к всем запросам на странице (одновременно ), и ошибка все еще там. Я думаю, это доказывает, что в буфере нет непрочитанных данных, верно?

Я действительно запутался, поэтому я был бы признателен за ваш совет. Прежде чем кто-то спросит, я не могу опубликовать полный код для этого, но вот упрощенная версия моего кода:

$stmt = $this->db->prepare('SELECT... :par LIMIT 1');
makeQuery($stmt, array(':par' => $var));
$row = $stmt->fetch(PDO::FETCH_ASSOC);


$stmt = $this->db->prepare('SELECT... :par LIMIT 1');

for loop
    makeQuery($stmt, array(':par' => $var));
    $row2 = $stmt->fetch(PDO::FETCH_ASSOC);
   ... [use row2]...
end for loop


$stmt = $this->db->prepare('SELECT... :par LIMIT 1');
makeQuery($stmt, array(':par' => $var));
$row3 = $stmt->fetch(PDO::FETCH_ASSOC);

Вот makeQuery().

/**************************************************************************************************************
* Function: makeQuery                                                                                         *
* Desc: Makes a PDO query.                                                                                    *
* Pre conditions: The statement/query and an array of named parameters (may be empty) must be passed.         *
* Post conditions: The PDO query is executed. Exceptions are caught, displayed, and page execution stopped.   *
**************************************************************************************************************/
function makeQuery($stmt, $array, $errMsg = '')
{
    try 
    {
        $stmt->execute($array);
    }
    catch (PDOException $e) 
    {
        print $errMsg != ''?$errMsg:"Error!: ". $e->getMessage(). "<br/>";
        die();
    }
}

Спасибо за вашу помощь!

РЕДАКТИРОВАТЬ :Я также пытался сделать следующее после запроса 2 (, так как это кажется источником проблемы:

$row2 = $stmt->fetch(PDO::FETCH_ASSOC); var_dump($row2);

Результат был:

bool(false) 

Я наткнулся на ошибку PDO?

7
задан Nate 15 July 2012 в 14:28
поделиться