Witaj Gościu! ( Zaloguj | Rejestruj )

Forum PHP.pl

 
Reply to this topicStart new topic
> [MySQL][PHP] Błąd PDO - General error: 2014, Wymuszenie i naprawa błędu
Tomplus
post 20.07.2016, 14:13:45
Post #1





Grupa: Zarejestrowani
Postów: 1 874
Pomógł: 230
Dołączył: 20.03.2005
Skąd: Będzin

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


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.

Ten post edytował Tomplus 20.07.2016, 14:14:43
Go to the top of the page
+Quote Post
trueblue
post 20.07.2016, 14:23:07
Post #2





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1827
Dołączył: 11.03.2014

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


Spróbuj użyć closeCursor() po pobraniu danych z zapytania.


--------------------
Go to the top of the page
+Quote Post
Tomplus
post 20.07.2016, 14:51:28
Post #3





Grupa: Zarejestrowani
Postów: 1 874
Pomógł: 230
Dołączył: 20.03.2005
Skąd: Będzin

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


@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.
Go to the top of the page
+Quote Post
trueblue
post 20.07.2016, 15:01:34
Post #4





Grupa: Zarejestrowani
Postów: 6 806
Pomógł: 1827
Dołączył: 11.03.2014

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


  1. $array=$query->fetch(\PDO::FETCH_ASSOC)['uid'];
  2. $query->closeCursor();
  3. return $array;



--------------------
Go to the top of the page
+Quote Post
nospor
post 20.07.2016, 15:07:34
Post #5





Grupa: Moderatorzy
Postów: 36 557
Pomógł: 6315
Dołączył: 27.12.2004




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?


--------------------

"Myśl, myśl, myśl..." - Kubuś Puchatek || "Manual, manual, manual..." - Kubuś Programista
"Szukaj, szukaj, szukaj..." - Kubuś Odkrywca || "Debuguj, debuguj, debuguj..." - Kubuś Developer

Go to the top of the page
+Quote Post
Tomplus
post 20.07.2016, 19:12:48
Post #6





Grupa: Zarejestrowani
Postów: 1 874
Pomógł: 230
Dołączył: 20.03.2005
Skąd: Będzin

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


@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.

Ten post edytował Tomplus 20.07.2016, 19:18:17
Go to the top of the page
+Quote Post

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 Wersja Lo-Fi Aktualny czas: 6.07.2025 - 12:01