26 Stimmen

PDO kann keine Abfragen ausführen, während andere ungepufferte Abfragen aktiv sind

Ich weiß, dass dies eine einfache Lösung sein muss, und ich verstehe teilweise, warum ich diesen Fehler erhalte, aber ich weiß nicht, wie ich ihn beheben kann. Ich habe in den Dokumenten nachgeschaut, kann aber keine andere Lösung finden als die Verwendung der Option für gepufferte Abfragen. Das habe ich auch schon versucht, aber es funktioniert nicht.

Der Fehler lautet: PDO kann keine Abfragen ausführen, während andere ungepufferte Abfragen aktiv sind

Der Fehler kommt aus der Zeile, wo ich das $result-Array erstellen.

foreach($phones as $phone)
{
    $stmt = db::getInstance()->prepare("CALL phones(:phone)");
    $stmt->bindParam(':phone', $phone, PDO::PARAM_INT, 10);
    $stmt->execute();

    $result[] = db::getInstance()->query("SELECT @phone;")->fetchAll(PDO::FETCH_ASSOC);
}

37voto

Addsy Punkte 3894

Sie müssen Ihre Verbindung mit der Methode PDOStatement::closeCursor() beenden

http://www.php.net/manual/en/pdostatement.closecursor.php

Ich glaube

foreach($phones as $phone)
{
    $stmt = db::getInstance()->prepare("CALL phones(:phone)");
    $stmt->bindParam(':phone', $phone, PDO::PARAM_INT, 10);
    $stmt->execute();

    $stmt->closeCursor()

    $result[] = db::getInstance()->query("SELECT @phone;")->fetchAll(PDO::FETCH_ASSOC);
}

sollte es für Sie tun

12voto

kmoney12 Punkte 4131

Ich lief in dieses Problem aufgrund eines Fehlers in meinem PDO-Verbindungsklausel. Ich habe versucht, die Zeitzone bei der Verbindung zu ändern:

PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8; SET time_zone = '$timezone';"

Ich habe es geändert in:

PDO::MYSQL_ATTR_INIT_COMMAND => "SET NAMES utf8, time_zone = '$timezone';"

Und es hat gut funktioniert.

4voto

Merijn Punkte 2250

Ich bin gerade selbst auf dieses Problem gestoßen, und es stellte sich heraus, dass das Problem in der Verwendung von gestapelten Abfragen lag. Die obige Lösung hat das Problem nicht gelöst.

Diese Abfrage wurde unmittelbar vor der Abfrage ausgeführt, die den Fehler auslöste:

return $this->fquery('
  SELECT @follow_id:=COALESCE(MAX(follow_id) + 1, 0) FROM sync_delete_value; 
  INSERT INTO sync_delete_value (...)
  VALUES (%d, @follow_id, %d, "%s")',
  $val1, $val2, $val3
);

Als ich dies änderte, lief alles wie gewohnt weiter:

$followId = $this->fquery('
  SELECT @follow_id:=COALESCE(MAX(follow_id) + 1, 0) FROM sync_delete_value'
);
return $this->fquery('
  INSERT INTO sync_delete_value (...)
  VALUES (%d, %d, %d, "%s")',
  $val1, $followId, $val2, $val3

);

Es ist eine Art Pseudocode, aber Sie verstehen den Sinn.

3voto

Patrick Fabrizius Punkte 577

Wenn $stmt->closeCursor() bei Ihnen nicht funktioniert (bei mir war das nicht der Fall), können Sie einfach die Variable $stmt zurücksetzen, um den Cursor freizugeben, etwa so:

foreach($phones as $phone)
{
    $stmt = db::getInstance()->prepare("CALL phones(:phone)");
    $stmt->bindParam(':phone', $phone, PDO::PARAM_INT, 10);
    $stmt->execute();
    unset($stmt);

    $result[] = db::getInstance()->query("SELECT @phone;")->fetchAll(PDO::FETCH_ASSOC);
}

CodeJaeger.com

CodeJaeger ist eine Gemeinschaft für Programmierer, die täglich Hilfe erhalten..
Wir haben viele Inhalte, und Sie können auch Ihre eigenen Fragen stellen oder die Fragen anderer Leute lösen.

Powered by:

X