Pomoc - Szukaj - Użytkownicy - Kalendarz
Pełna wersja: [MySQL][PHP] Błąd PDO - General error: 2014
Forum PHP.pl > Forum > Przedszkole
Tomplus
Witam,

Zgodnie z pomocą na forum tym i innym, rozwiązanie jest proste:
  1. $pdo->setAttribute(PDO::MYSQL_ATTR_USE_BUFFERED_QUERY, true);


Jednakże mimo to wciąż mam błąd:
Kod
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.


Błąd pojawia się w tej klasie: https://github.com/PHPAuth/PHPAuth

  1. public function getSessionUID($hash)
  2. {
  3.  
  4. $query = $this->dbh->prepare("SELECT uid FROM {$this->config->table_sessions} WHERE hash = ?");
  5. $query->execute(array($hash)); //w tej linii
  6.  
  7. if ($query->rowCount() == 0) {
  8. return false;
  9. }
  10.  
  11. return $query->fetch(\PDO::FETCH_ASSOC)['uid'];
  12. }


oraz w metodzie checkSession($hash);
  1. $query = $this->dbh->prepare("SELECT id, uid, expiredate, ip, agent, cookie_crc FROM {$this->config->table_sessions} WHERE hash = ?");
  2. $query->execute(array($hash));
  3.  
  4. if ($query->rowCount() == 0) {
  5. return false;
  6. }


Zależnie od podstrony to jest w tutaj lub tutaj błąd.
Pojawia się tylko wtedy gdy wykorzystuję metody publiczne PHP Auth w innych klasach.

Ścieżka do błędu to:

Kod
Stack trace:
#0 /home/(...)/class/PHPAuth/Auth.php(1420): PDOStatement->execute(Array)
#1 /home/(...)/class/obslugaKoszyka.php(71): PHPAuth\Auth->createSession()
#2 /home/(...)/class/obslugaKoszyka.php(42): obslugaKoszyka->sessionId()
#3 /home/(...)/class/obslugaKoszyka.php(38): obslugaKoszyka->getIdKoszyk()
#4 /home/(...)/class/obslugaKoszyka.php(9): obslugaKoszyka->sprawdzZawartoscKoszyka(6168)
#5 /home/(...)/produkt.php in /home/(...)/class/PHPAuth/Auth.php on line 480


W pliku produkt.php jest odwołanie do koszyka:
  1. $PDO = new \PDO;
  2. $Auth = new \PHPAuth\Auth($PDO);
  3. $obslugaKoszyka = new obslugaKoszyka($PDO, $Auth);
  4. $obslugaKoszyka -> dodajElement($idProduktu, $ileElementow);



Próbowałem także ten błąd zrobić w osobnym pliku, z pominięciem moich klas i skryptów.
Skorzystałem m.in. z tego forum i użyłem kodu, który powodował taki błąd:

  1. for($i=0;$i<10;$i++) {
  2. $query = ' SELECT * FROM sessions';
  3. $rWynik = $pdo -> query( $query );
  4.  
  5.  
  6. while($a1 = $rWynik->fetch())
  7. print_r($a1);
  8.  
  9. $query = ' SELECT 1 ';
  10. $rWynik2 = $pdo -> query( $query );
  11. $a2 = $rWynik2->fetch();
  12.  
  13. var_dump( $a2 );
  14. }
oraz
  1. $stmt = $pdo->prepare('SELECT CURDATE()');
  2. $stmt->execute();
  3. $row = $stmt->fetch();
  4.  
  5. print_r($row);
  6.  
  7. $stmt = $pdo->prepare('SELECT CURDATE()');
  8.  
  9. print_r($pdo->errorInfo());


Ale wykonują się bez problemu BEZ MYSQL_ATTR_USE_BUFFERED_QUERY

Proszę o pomoc, bo może jeszcze czegoś nie robię? Albo mam jakiś błąd.
trueblue
Spróbuj użyć closeCursor() po pobraniu danych z zapytania.
Tomplus
@trueblue

Czyli jak mam metodę:
  1. public function getSessionUID($hash)
  2. {
  3.  
  4. $query = $this->dbh->prepare("SELECT uid FROM {$this->config->table_sessions} WHERE hash = ?");
  5. $query->execute(array($hash));
  6.  
  7. if ($query->rowCount() == 0) {
  8. return false;
  9. }
  10.  
  11. return $query->fetch(\PDO::FETCH_ASSOC)['uid'];
  12. }


To gdzie mam dodać closeCursor?
Pamiętaj że to klasa innego autora, a nie moja.
trueblue
  1. $array=$query->fetch(\PDO::FETCH_ASSOC)['uid'];
  2. $query->closeCursor();
  3. return $array;

nospor
Cytat
Pamiętaj że to klasa innego autora, a nie moja.
Problem rownie dobrze moze byc w Twoim kodzie a objawia sie on dopiero w tej zewnetrznej klasie... Nie pobierasz sam wczesniej jakis danych?
Tomplus
@nospor
W bindParam w metodzie getIdKoszyk() wsadzam $this->sessionId() aby uzyskać ID koszyka.

  1. private function sessionId () {
  2. if(!isset($_COOKIE['AKCESSID'])) {
  3. $this->Auth->createSession();
  4. }
  5. return $this->Auth->getSessionUID($this->Auth->getSessionHash());
  6. }


Nie wiem czy to istotne, ale stosuje także własną obsługę zapytań. Po zastosowaniu ich w PHPAuth, problem zniknął jak ręką odjął, działa wszystko jak należy, ale jeżeli działam na surowym PDO, to mam taki kwiatek.

Dlatego gdybym wiedział jakie zapytanie jest zabuforowane, to dowiedziałbym się gdzie leży błąd. Tzn. co robię źle.
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.