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 (IMG:http://forum.php.pl/style_emoticons/default/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 (IMG:http://forum.php.pl/style_emoticons/default/winksmiley.jpg)
Go to the top of the page
+Quote Post
 
Start new topic
Odpowiedzi
SongoQ
post
Post #2





Grupa: Przyjaciele php.pl
Postów: 2 923
Pomógł: 9
Dołączył: 25.10.2004
Skąd: Rzeszów - studia / Warszawa - praca

Ostrzeżenie: (0%)
-----


Cytat
Ale pytanie - czy zawsze trzeba tak robić?

No wlasnie nic na ten temat nie znalazlem. Przegladalem manual po tym jak napisales tego posta i nic na ten temat nie znalazlem. Co do tego ze ten blad czasami wystepuje to troche dziwne, testowalem na 2 maszynach i u mnie zawsze ten blad wystepuje. Moze tak jak pisalem cos innego czysci buffor. Jak znajdziesz jakies informacje to napisz bardzo jestem ciekaw czemu tak jest.
Go to the top of the page
+Quote Post

Posty w temacie


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

 



RSS Aktualny czas: 26.09.2025 - 00:55