Frage PDO wirft keine Ausnahme bei falscher SQL-Abfrage


Ich bin ziemlich vertraut mit MySQLi und versuchte PDO, ich habe gehört, dass es besser ist. Ich ging durch das Tutorial-Geschenk Hier. Sie sagen, dass PDO eine Ausnahme auslöst, wenn PDO :: ERRMODE_EXCEPTION gesetzt ist und wir versehentlich etwas falsch mit der Abfrage machen (zum Beispiel falsch eingeben, DELECT statt SELECT). Ich habe dieselbe falsche Abfrage eingegeben, um die Fehler- und Ausnahmebedingungsnachricht in meiner lokalen Umgebung anzuzeigen. Ich habe letzte WAMP mit PHP 5.5, MySQL 5.6 und Apache 2.4.9 in meinem 32-Bit-Windows 7-PC installiert, aber nicht bekommen, was ich erwartet habe, keine Ausnahme wurde dort geworfen. Ich habe den gleichen Code ausprobiert wie im Tutorial:

try {
$DBH = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass);
$DBH->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );

# UH-OH! Typed DELECT instead of SELECT!
$DBH->prepare('DELECT name FROM people');
}
 catch(PDOException $e) {
 echo "I'm sorry, Dave. I'm afraid I can't do that.";
 file_put_contents('PDOErrors.txt', $e->getMessage(), FILE_APPEND);
}

Keine PDOError.txt, keine Fehlermeldung. Stimmt etwas mit dem Lernprogramm oder meiner Umgebung nicht? Oder gibt es Fälle, in denen PDO keine Ausnahmen auslösen kann? Ich habe PDO-Treiber für MySQL installiert.


6
2018-01-26 17:42


Ursprung


Antworten:


Es ist wahrscheinlich fehlgeschlagen, da die Abfrage nie ausgeführt wird und auf weitere Anweisungen wartet.

Da ist das nichts Feuer, dann ist alles im Auge von PDO gültig; Das ist meine Analogie dazu.

Führen Sie es aus und Sie werden sehen, dass es eine Ausnahme auslöst.

Entweder durch Ausführen nach der Vorbereitung oder durch ein einfaches ->query() eher, als ->prepare().


5
2018-01-26 17:55



Dies ist tatsächlich mit einem anderen Attribut der PDO-Verbindung zu tun, das Sie möglicherweise noch nicht berücksichtigt haben. Und das ist PDO::ATTR_EMULATE_PREPARES

Wenn Sie dieses Attribut hinzufügen und auf festlegen false es wird der PDO-Erweiterung mitteilen, dass die prepare in die Datenbank zur Kompilierung, Optimierung und Ausführungsplanung, an dem Punkt, an dem Sie den ->prepare(). Wenn Sie es nicht setzen, nimmt es den Standardwert von true, die die Erweiterung angibt, um die Zusammenstellung zu EMULIEREN. Mit anderen Worten, es wird warten, bis Sie die ->execute() bevor die Anweisung kompiliert wird und Fehler gemeldet werden.

PDO :: ATTR_EMULATE_PREPARES Aktiviert oder deaktiviert die Emulation von vorbereiteten Anweisungen. Einige Treiber unterstützen native vorbereitete Anweisungen nicht oder haben nur eingeschränkte Unterstützung für sie. Verwenden Sie diese Einstellung, um zu erzwingen, dass PDO entweder vorbereitete Anweisungen (falls TRUE) emuliert oder versucht, native prepared-Anweisungen zu verwenden (falls FALSE). Es wird immer darauf zurückgreifen, die vorbereitete Anweisung zu emulieren, wenn der Treiber die aktuelle Abfrage nicht erfolgreich vorbereiten kann.

Führen Sie Ihren Code mit dieser zusätzlichen Attributeinstellung aus und sehen Sie den Unterschied.

try {
    $DBH = new PDO("mysql:host=$host;dbname=$dbname", $user, $pass);
    $DBH->setAttribute( PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION );
    $DBH->setAttribute( PDO::ATTR_EMULATE_PREPARES, FALSE );

    # UH-OH! Typed DELECT instead of SELECT!
    $DBH->prepare('DELECT name FROM people');
}
catch(PDOException $e) {
    echo "I'm sorry, Dave. I'm afraid I can't do that.";
    file_put_contents('PDOErrors.txt', $e->getMessage(), FILE_APPEND);
}

Jetzt erhalten Sie die Nachricht und die Datei wird mit der Fehlermeldung erstellt


6
2018-01-26 20:44