2016-05-26 3 views
4

Ich optimiere eine veraltete Datenbankklasse, die für PHP/5.2 geschrieben wurde, die entworfen wurde, um sich mit MySQL zu verbinden und alle Fehler zu verstecken. Ich habe die PDO-Instanz konfiguriert Ausnahmen werfen:Können PDO-Methoden fehlschlagen und keine PDOException auslösen?

new PDO($dsn, $user, $pass, array(PDO::ATTR_ERRMODE => PDO::ERRMODE_EXCEPTION)) 

Jetzt muss ich meinen Code entsprechend anpassen, den Fall zu behandeln, in denen Funktionen eine Ausnahme auslösen kann, wenn sie nicht vor, damit ich in den manuellen Kopf.

In einigen Fällen ist das Handbuch explizit, z. PDO::prepare:

If the database server successfully prepares the statement, PDO::prepare() returns a PDOStatement object. If the database server cannot successfully prepare the statement, PDO::prepare()returns FALSE or emits PDOException (depending on error handling).

In anderen Fällen ist es Art von vage ist, z.B. PDO::commit:

Returns TRUE on success or FALSE on failure.
Throws a PDOException if there is no active transaction.

(Kann es aus einem anderen Grund fehlschlagen und einfach false zurückkehren?)

Und es sind Fälle, in denen Ausnahmen werden nicht einmal erwähnt, z.B. :

Returns TRUE on success or FALSE on failure.

... obwohl es klar ist, zu überprüfen, ob es PDOException auf Fehler wirft (zumindest auf bestimmte Fehler).

Muss ich noch den Rückgabewert von Methoden überprüfen, die false bei Fehler zurückgeben, wenn das Handbuch nicht anders sagt?

+0

@RyanVincent Sprichst du über normale Fehlerbedingungen, die im regulären Betrieb auftreten (ein Beispiel wäre großartig) oder die kleinen Fehler, die die PHP-Entwicklung ab und an anregen? –

+0

Sie haben Recht, im normalen Betrieb ist es sehr zuverlässig. Imo, 'emuliert = falsch' und falsche Parameterhinweise können PDO verwirren. Ich schlage vor, du versuchst es mit 'emuliert vorbereiten' auf 'wahr' gesetzt. Du verlierst nichts außer ein paar Minuten? –

+0

ich schlage vor, dass Sie keine Parametertypen angeben, es sei denn, BLOB-Typen werden verwendet. Und nur für die 'Blob'-Spalten. –

Antwort

3

Nein, wenn Sie die Einstellung PDO::ERRMODE_EXCEPTION wird es

+1

Ich habe das geändert, seit ich * denke * es ist korrekt. Aus meiner bisherigen Erfahrung habe ich folgendes versucht: Verbindung zu MySQL über PDO im Exception-Modus. Dann habe ich gewaltsam die Verbindung auf der MySQL-Seite fallen lassen, indem ich sie gelöscht habe, dann habe ich versucht, eine Anweisung über PHP vorzubereiten - wenn sie nicht im Ausnahme-Modus ist, gibt sie false zurück. Im Ausnahmemodus gibt es eine Exception aus (Ausnahme war "MySQL Server ist weg"). Das gleiche gilt für 'query'-Methode, Transaktionen usw. Wie ich bereits sagte, ist dies aus Erfahrung, aber die Dokumentation legt nahe, dass diese Antwort richtig ist. –

+0

kann ich hinzufügen, dass dies gilt für "emulates_prepares" wenn "wahr", soweit ich weiß. Es ist auch wahr, wenn "emuliert" ist falsch und alle Bindungstypen korrekt sind oder, ich vermute, Standard-Bindungstypen verwenden. Imo, Es kann verwirrt werden, wenn die Bindungstypen falsch sind. Es kann manchmal keine Ausnahme auslösen. ; -/ –

-5

Versuchen Sie dieses

try { 
    $db = new PDO("mysql:host=localhost;dbname=dbname", "username", "password"); 
}catch(PDOException $Exception) { $Exception->getMessage() ; } 
+0

Wie beantwortet das überhaupt die Frage nach Ausnahmen? –

+0

Ja, diese Art von Antworten meine Frage mit "Ja, es wird jedes Mal" false "zurückkehren, aber es ist das genaue Gegenteil von dem, was ich zu erreichen versuche. Ich möchte Ausnahmen. –

+0

try { $ db = neues PDO ("mysql: host = localhost; dbname = dbname", "benutzername", "passwort"); } catch (PDOException $ Exception) {$ Exception-> getMessage(); } – srinivas

0

immer Ausnahme für Fehler sein, wenn Sie Ausnahmen aktiviert haben und es einen Fehler im Code geschieht, wird der Code direkt stoppt Ausführung von dieser Funktion, so wird es nichts zurückgeben.

Also, um zu blund, müssen Sie nicht überprüfen, die Rückgabewerte, aber wenn Sie nicht, können Sie nichts Fehlerspezifisch Fehler und Sie würden sich voll und ganz auf Fehler auf PDO verlassen.

Wenn ich mein Datenbanksystem erstellt habe, nutze ich beides, wenn ich einen Fehler sehe, den ich stattdessen selbst werfe. Zum Beispiel ist $pdo->prepare('') sehr gültig, wird aber beim Binden fehlerhaft sein.

Dann gibt es andere Funktionen wie fetch, die keinen Fehler machen, wenn es keine Ergebnisse in der Datenbank gibt, nicht die Ergebnisse zu überprüfen wäre albern.

nun zum Scheitern verurteilt zu begehen, ich glaube, es ist ein Szenario, das es ohne Auslösen eine Ausnahme zurückzukehren falsch verursachen würde, und das ist, wenn die Verbindung zum Server fällt nach der Verbindung zur Datenbank und vor PDO::commit Aufruf, recht gut wissen, ob Sie einen entfernten Datenbankserver haben.

So Ihre Frage zu beantworten, ja es eine Ausnahme ohne werfen kann fehlschlagen, aber das Timing hat sehr spezifische noch so sein, wenn Sie eine lokale Datenbank.

+0

Ich müsste das testen, aber ich erinnere mich daran, PDOExceptions in der Vergangenheit erhalten mit * MySQL Server ist weggegangen * als Nachricht, obwohl wahrscheinlich in anderen Methoden. –

+0

@ ÁlvaroGonzález hast du es schon getestet? – Xorifelse

+0

Ich kann bestätigen, dass ich Einträge in meinen Protokollen mit "MySQL-Server ist weggegangen", "Zu viele Verbindungen" und "Verlorene Verbindung zum MySQL-Server bei 'Lesen der ersten Kommunikationspaket', Systemfehler: 111" Nachrichten erhalten habe kommen von 'PDOException' (und keine von Rückgabecodes überprüfen). Mein Bauchgefühl ist, dass es nur ein Dokumentationsproblem ist, aber ich denke, der einzige Weg, 100% sicher zu sein, ist den C-Quellcode der PHP-Version zu durchsuchen, die auf meinem Server läuft :) –

Verwandte Themen