Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [PHP][MYSQL][PDO]Proste skrypt pobierający wyniki
Forum PHP.pl > Forum > Przedszkole
matssuda
Witam.

Mam problem ze skryptem php łączącym się z MySql przez PDO i pobierającym wyniki.
Skrypt na serwerze (nazwa.pl) generuje błąd (na localu jest ok):
Cytat
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.


Oto skrypt (uposzczony, ale chodzi o sens):

  1. <?php
  2. try
  3. {
  4. $pdo = new PDO(DATABASE, USER, PASS);
  5. $pdo -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  6.  
  7. $query_1 = $pdo->query('SELECT * FROM `tabela_1`');
  8.  
  9. while ($row=$query_1->fetch())
  10. {
  11. echo $row['tabela_1_id'];
  12.  
  13. $query_2 = $pdo->query('SELECT * FROM `tabela_2` WHERE tabela_2_id = '.$row['tabela_1_id'].' ');
  14.  
  15. while ($rows=$query_2->fetch())
  16. {
  17. echo $rows['tabela_2_id'];
  18.  
  19. }
  20.  
  21. $query_2 -> closeCursor(); 
  22.  
  23. }
  24.  
  25. $query_1 -> closeCursor(); 
  26.  
  27. }
  28.  
  29. catch(PDOException $e)
  30. {
  31. echo 'Nie polaczono: ' . $e->getMessage();
  32. }
  33. ?>


Czytałem, że to błąd niezamknięcia połączenia i wywoływanie drugiego.
Ale nie mam zielonego pojęcia jak to uzyskać inaczej.
Nie gromcie od razu, jestem w przedszkolu smile.gif
szpakoo
Cytat
Czytałem, że to błąd niezamknięcia połączenia i wywoływanie drugiego.
Ale nie mam zielonego pojęcia jak to uzyskać inaczej.

no jeśli chodzi o to to powinieneś zmienic
  1. <?php
  2. //to
  3. $query_1 -> closeCursor(); 
  4. //na to
  5. $query_1 -> closeCursor(); 
  6. $query_1=NULL;
  7. //analogicznie w innych zapytaniach kursora
  8. ?>


ale warto spojrzeć na Twoje zapytania żeby zobaczyć, że niepotrzebnie wywołujesz dwa zapytania, można ten sam efekt uzyskać jednym, no chyba że tak uprościłeś kod podany na forum że jest inaczej
matssuda
nawet to robię to w ten sposób:
  1. <?php
  2. //zamknięcie połącznia
  3. $query_1 -> closeCursor(); $query_1=NULL; unset($query_1);
  4. ?>

i niestety wywala błąd. Tak jak pisałem - na localu jest ok (XAMPP), ale na serwerze już nie.

Czyli nie mogą byc otwarete 2 połączenia naraz?
Mozna by połączyć tabele i zrobić to jednym zapytaniem, ale mnie bardziej interesuje rozwiązanie takie jak podałem. Jak to jest niemozliwe to ok - chcę tylko wiedzieć.
nospor
dodaj atrybut odnosnie buforowania:

  1. <?php
  2. $pdo = new PDO(DATABASE, USER, PASS);
  3. $pdo -> setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
  4. $pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);
  5. ?>


ps: takie zapytania w petli to bardzo, bardzo, bardzo, bardzo nieoptymalne rozwiązanie. To sie robi jednym zapytaniem.
matssuda
dziękuję za pomoc, teraz działa.

Wiem że to nie jest optymalne rozwiązanie, ale byłem ciekaw.
Jestem na etapie poznawania php i baz danych więc jeszcze się mną znudzicie smile.gif
To jest wersja lo-fi głównej zawartości. Aby zobaczyć pełną wersję z większą zawartością, obrazkami i formatowaniem proszę kliknij tutaj.
Invision Power Board © 2001-2025 Invision Power Services, Inc.