Behebung des Fehlers „Abfragen können nicht ausgeführt werden, während andere ungepufferte Abfragen aktiv sind“ mit MySQL
Einführung:
Das Client-Protokoll von MySQL unterliegt einer Einschränkung, bei der nur eine Abfrage gleichzeitig ausgeführt werden kann. Beim Versuch, zusätzliche Abfragen auszuführen, während die Ergebnisse früherer Abfragen nicht abgerufen werden, kann es sein, dass Benutzer auf die Fehlermeldung „Abfragen können nicht ausgeführt werden, während andere ungepufferte Abfragen aktiv sind“ stoßen. Dieses Problem kann in bestimmten Szenarien auftreten, insbesondere wenn PHP Data Objects (PDO) mit dem auf false gesetzten PDO::ATTR_EMULATE_PREPARES-Attribut verwendet wird.
Ursache:
Die Die Hauptursache liegt darin, dass das MySQL-Client-Protokoll nicht in der Lage ist, mehrere Abfragen gleichzeitig auszuführen. Sobald eine Abfrage ausgeführt wird, ruft die Client-Bibliothek automatisch alle ihre Ergebnisse ab und speichert sie zwischen, sodass nachfolgende Abrufe die gespeicherten Ergebnisse durchlaufen können, ohne mit MySQL zu kommunizieren. Dieser als „gepufferte Abfragen“ bekannte Ansatz befreit den MySQL-Server von der weiteren Verarbeitung, sobald die ersten Ergebnisse abgerufen wurden.
Umgekehrt werden bei ungepufferten Abfragen die Ergebnisse nicht zwischengespeichert, sodass der Client sie einzeln abrufen muss. Diese Einschränkung entsteht, wenn eine zweite Abfrage ausgeführt wird, bevor die Ergebnisse der ersten Abfrage vollständig abgerufen wurden. Der MySQL-Server interpretiert dies als Konflikt zwischen aktiven Abfragen und löst die Fehlermeldung aus.
Lösung:
Um dieses Problem zu beheben, können die folgenden Strategien angewendet werden:
Zusätzliche Überlegungen:
Codebeispiel:
Der bereitgestellte Code kann geändert werden, um den Fehler zu verhindern, indem fetchAll() verwendet oder PDO::MYSQL_ATTR_USE_BUFFERED_QUERY explizit auf true gesetzt wird .
$sql ='SELECT temp_id FROM temp1'; $stmt2 = db::db()->prepare($sql); $stmt2->execute(); $rs2 = $stmt2->fetchAll(PDO::FETCH_ASSOC); $stmt2->closeCursor(); $sql='SELECT COUNT(*) AS valid FROM cities_has_zipcodes WHERE cities_id=:cities_id AND zipcodes_id=:zipcodes_id'; $stmt1 = db::db()->prepare($sql); foreach($data AS $row) { try { $stmt1->execute($row); $rs1 = $stmt1->fetchAll(PDO::FETCH_ASSOC); $stmt1->closeCursor(); syslog(LOG_INFO,'$rs1: '.print_r($rs1[0],1).' '.rand()); syslog(LOG_INFO,'$rs2: '.print_r($rs2[0],1).' '.rand()); } catch(PDOException $e){echo(sql_error($e));} }
Das obige ist der detaillierte Inhalt vonWie behebt man den MySQL-Fehler „Abfragen können nicht ausgeführt werden, während andere ungepufferte Abfragen aktiv sind'?. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!