PDO „Nieprzechwycony wyjątek” PDOException ”. Nie można wykonać kwerendy, gdy aktywne są inne niebuforowane zapytania. Rozważ użycie PDOStatement :: fetchAll (). ”

Wiem, że to pytanie zostało zadane wiele razy, ale przeczytałem odpowiedzi na wiele pytań i wciąż nie mogę zrozumieć, dlaczego otrzymuję ten błąd:

Błąd krytyczny: nieprzechwycony wyjątek „PDOException” z komunikatem „SQLSTATE [HY000]: Błąd ogólny: 2014 Nie można wykonać kwerendy, gdy aktywne są inne niebuforowane zapytania. Rozważ użycie PDOStatement :: fetchAll (). Alternatywnie, jeśli twój kod będzie działał tylko przeciwko mysql, możesz włączyć buforowanie zapytań, ustawiając atrybut PDO :: MYSQL_ATTR_USE_BUFFERED_QUERY. '

Pierwszą rzeczą, która jest dziwna, jest to, że nie dostaję błędu na moim lokalnym serwerze (wampserver), ale dostaję go na mój serwer WWW. Wersja php na moim lokalnym serwerze to 5.3.10, a na moim serwerze to 5.3.13.

Przeczytałem, że źródłem tego błędu jest zapytanie, gdy dane pozostały w buforze z poprzedniego zapytania. Nie dotyczy to mnie - mam echo wszystkich danych i wiem, że każdy wiersz zwracany w zapytaniu jest pobierany.

Powiedziałem, że zmieniłem jedno z moich zapytań nafetchAll zamiastfetch rozwiązuje problem, ale to po prostu nie ma sensu, ponieważ jawiedzieć że wszystkie zwrócone wiersze są odczytywane. Kiedy użyłemfetchAll w przypadku zapytania (jest wykonywane w pętli) wydrukowałem tablicę każdej pętli i tylko jeden element znajdował się w tablicy dla każdego zapytania w pętli.

Jeszcze jedna informacja. To nie jest zapytanie, na które zmieniłamfetchAll (co powoduje odejście błędu), który zgłasza błąd PDO, w moim pliku php pojawia się kolejne zapytanie, które zgłasza błąd. Mój plik jest w zasadzie taki:

... code ...

query 1

... code ...

loop
query 2
end loop

... code ... 

query 3

Jeśli skomentuję zapytanie 3, nie ma błędu. Jeśli komentuję lub zmieniam nafetchAll, zapytanie 2, nie ma błędu. zapytanie 1 nie ma żadnego wpływu.

Chciałbym też dodać, że próbowałem dodaćLIMIT 1 dowszystko zapytań na stronie (w tym samym czasie), a błąd nadal istnieje. Myślę, że to dowodzi, że w buforze nie ma nieprzeczytanych danych, prawda?

Jestem naprawdę zdezorientowany, więc byłbym wdzięczny za twoją radę. Zanim ktoś zapyta, nie mogę opublikować pełnego kodu, ale tutaj jest uproszczona wersja mojego kodu:

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

Tutaj jestmakeQuery().

/**************************************************************************************************************
* 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();
    }
}

Dzięki za pomoc!

EDYTUJ: Próbowałem również wykonać następujące czynności po zapytaniu 2 (ponieważ wydaje się, że jest to źródło problemu:

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

Wynik był:

bool(false) 

Czy natknąłem się na błąd PDO?

questionAnswers(2)

yourAnswerToTheQuestion