Aż dziwnie się czuję - cały czas piszę na forum, ale strasznie dawno nie zadawałem pytań:)
Podczas pracy z PDO natrafiłem dziś na jednym z serwerów klienta, na nietypowy problem. Zaprezentuję go na przykładzie.
<?php $Db = new PDO('mysql:host='.$GLOBALS['CONFIG']['db']['host'].'; dbname='.$GLOBALS['CONFIG']['db']['name'], $GLOBALS['CONFIG']['db']['user'], $GLOBALS['CONFIG']['db']['haslo'] ); $Db -> setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION ); $query = ' SELECT * FROM session LIMIT 1'; $rWynik = $Db -> query( $query ); $a1 = $rWynik->fetch(); $query = ' SELECT 1 '; $rWynik2 = $Db -> query( $query ); $a2 = $rWynik2->fetch(); ?>
Pierwsze zapytanie wykonuje się poprawnie, i zwracana jest (var_dump) tablica zawierająca 1 rekord. (zgodnie z oczekiwaniami

Niestety - 2 zapytanie się nie wykonuje, wyrzucając wyjątek o treści:
Cytat
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 /test/test.php:35
Stack trace:
#0 /test/test.php(35): PDO->query(' SELECT 1 ')
#1 {main}
thrown in /test/test.php on line 35
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 /test/test.php:35
Stack trace:
#0 /test/test.php(35): PDO->query(' SELECT 1 ')
#1 {main}
thrown in /test/test.php on line 35
I wszystko wydawałoby się jasne, gdyby nie to, że błąd taki pojawia się tylko na jednym z serwerów na których pracuję.
Co więcej - jest to o tyle ciekawe, że błąd nie pojawia się za każdym razem, a po drugie - przecież wyraźnie widać, że 1 zapytanie może zwrócić tylko 1 rekord, a wiec fetch() powinno opróżnić bufer do końca.
Oczywiście - mógłbym rozwiązać ten problem tak jak radzi komunikat, ale po pierwsze - po to jest fetch by z niego korzystać, i nie zawsze wydaje się konieczne korzystanie z fetchAll, a ustawianie PDO::MYSQL_ATTR_USE_BUFFERED_QUERY też wygląda raczej na leczenie objawów niż przyczyn.
Czy spotkaliście się z taką sytuacją? I czy można poradzić coś adminowi w celu usunięcia tego problemu?
ps. proszę się nie śmiać z $GLOBALS - to na potrzeby testu
