PDO “Exceção não identificada 'PDOException' .. Não é possível executar consultas enquanto outras consultas sem buffer estão ativas. Considere o uso de PDOStatement :: fetchAll (). ”

Eu sei que essa pergunta foi feita muitas vezes, mas li as respostas para muitas das perguntas e ainda não consigo entender por que estou recebendo este erro:

Erro fatal: exceção não capturada 'PDOException' com mensagem 'SQLSTATE [HY000]: Erro geral: 2014 Não é possível executar consultas enquanto outras consultas sem buffer estão ativas. Considere o uso de PDOStatement :: fetchAll (). Como alternativa, se o seu código for executar somente com o mysql, você poderá ativar o buffer de consulta definindo o atributo PDO :: MYSQL_ATTR_USE_BUFFERED_QUERY. '

A primeira coisa que é estranho, é que eu não recebo um erro no meu localhost (wampserver), mas eu entendo no meu servidor web. A versão do php no meu localhost é 5.3.10, e no meu servidor web é 5.3.13.

Eu li que a origem desse erro está fazendo uma consulta quando os dados deixados no buffer de uma consulta anterior. Este não é o caso para mim - eu tenho ecoado todos os dados e sei que cada linha retornada em uma consulta está sendo buscada.

Com isso dito, descobri que mudar uma das minhas consultas parafetchAll ao invés defetch corrige o problema, mas simplesmente não faz porque euconhecer que todas as linhas retornadas estão sendo lidas. Quando eu useifetchAll para a consulta (ela está sendo feita em um loop), imprimi o array em cada loop e apenas um item estava no array para cada consulta no loop.

Mais uma informação. Não é a consulta que eu mudei parafetchAll (que faz com que o erro vá embora) que lança o erro do PDO, há outra consulta mais tarde no meu arquivo php que lança o erro. Meu arquivo é basicamente assim:

... code ...

query 1

... code ...

loop
query 2
end loop

... code ... 

query 3

Se eu comentar a consulta 3, não há erro. Se eu comentar ou mudar parafetchAll, consulta 2, não há erro. consulta 1 não tem efeito algum.

Eu também gostaria de acrescentar que eu tentei adicionarLIMIT 1 paratodos das consultas na página (ao mesmo tempo), e o erro ainda está lá. Eu acho que isso prova que não há dados não lidos no buffer, certo?

Estou muito confuso, por isso gostaria de receber seu conselho. Antes que alguém pergunte, não posso postar o código completo para isso, mas aqui está uma versão simplificada do meu código:

$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);

Aqui está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();
    }
}

Obrigado pela ajuda!

EDIT: Eu também tentei fazer o seguinte após a consulta 2 (desde que parece ser a fonte do problema:

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

A saída foi:

bool(false) 

Eu tropecei em um bug do PDO?

questionAnswers(2)

yourAnswerToTheQuestion