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 решает проблему, но просто не делает, потому что яknow что все возвращенные строки читаются. Когда я использовалfetchAll для запроса (он выполняется в цикле) я распечатал массив каждого цикла, и только один элемент был в массиве для каждого запроса в цикле.

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

... code ...

query 1

... code ...

loop
query 2
end loop

... code ... 

query 3

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

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

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

$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?

Ответы на вопрос(2)

Ваш ответ на вопрос