Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

> PDO - problem z unbuffered queries, w przypadku zapytań zwracających 1 rekord.
DeyV
post
Post #1





Grupa: Zarząd
Postów: 2 277
Pomógł: 6
Dołączył: 27.12.2002
Skąd: Wołów/Wrocław




Witam

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.

  1. <?php
  2. $Db = new PDO('mysql:host='.$GLOBALS['CONFIG']['db']['host'].'; dbname='.$GLOBALS['CONFIG']['db']['name'],
  3. $GLOBALS['CONFIG']['db']['user'], $GLOBALS['CONFIG']['db']['haslo'] );
  4. $Db -> setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
  5.  
  6.  
  7. $query = ' SELECT * FROM session LIMIT 1';
  8. $rWynik = $Db -> query( $query );
  9. $a1 = $rWynik->fetch();
  10.  
  11. var_dump( $a1 );
  12.  
  13. $query = ' SELECT 1 ';
  14. $rWynik2 = $Db -> query( $query );
  15. $a2 = $rWynik2->fetch();
  16.  
  17. var_dump( $a2 );
  18. ?>


Pierwsze zapytanie wykonuje się poprawnie, i zwracana jest (var_dump) tablica zawierająca 1 rekord. (zgodnie z oczekiwaniami smile.gif )

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


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 winksmiley.jpg


--------------------
"Niezależnie od tego, jakie masz osiągnięcia, ktoś Ci pomaga..."
Go to the top of the page
+Quote Post

Posty w temacie


Reply to this topicStart new topic
1 Użytkowników czyta ten temat (1 Gości i 0 Anonimowych użytkowników)
0 Zarejestrowanych:

 



RSS Aktualny czas: 20.08.2025 - 14:13