Ich benutze PDO, um einen Datensatz einzufügen (MySQL und PHP)
$stmt->bindParam(':field1', $field1, PDO::PARAM_STR);
$stmt->bindParam(':field2', $field2, PDO::PARAM_STR);
$stmt->execute();
Gibt es eine Möglichkeit festzustellen, ob es erfolgreich eingefügt wurde, z. B. wenn der Datensatz nicht eingefügt wurde, weil es sich um ein Duplikat handelte?
Bearbeiten: Natürlich kann ich mir die Datenbank ansehen, aber ich meine programmatisches Feedback.
if ($stmt->execute()) { //true }
PDOStatement->execute()
undPDOStatement->errorCode()
völlig im Einklang miteinander? Gibt es Umstände, unter denenPDOStatement->errorCode()
etwasPDOStatement->execute()
wahr ist? Oder wennPDOStatement->execute()
falsch zurückgegeben wird, aberPDOStatement->errorCode()
nichts hat?Da die meisten empfohlenen Fehlermodus für PDO ist
ERRMODE_EXCEPTION
, keine direkteexecute()
Ergebnis Überprüfung wird immer Arbeit . Da die Codeausführung nicht einmal die in anderen Antworten angegebene Bedingung erreicht.Es gibt also drei mögliche Szenarien, um das Ergebnis der Abfrageausführung in PDO zu verarbeiten:
try..catch
Operator, um den erwarteten Fehler wie einen doppelten Primärschlüssel zu behandeln, und wenn Sie ein bestimmtes Szenario haben, um diesen bestimmten Fehler zu behandeln .Für einen normalen PHP-Benutzer klingt es ein bisschen fremd - wie ist das, um das direkte Ergebnis der Operation nicht zu überprüfen? - aber genau so funktionieren Ausnahmen - Sie überprüfen den Fehler woanders. Ein für alle Mal. Sehr praktisch.
Kurz gesagt: In einem normalen Code benötigen Sie überhaupt keine Fehlerbehandlung. Behalten Sie einfach Ihren Code wie er ist:
Bei Erfolg wird dies angezeigt. Bei einem Fehler wird die reguläre Fehlerseite angezeigt, die Ihre Anwendung für einen solchen Anlass anzeigt.
Nur für den Fall, dass Sie ein anderes Behandlungsszenario haben als nur den Fehler zu melden, fügen Sie Ihre Einfügeanweisung in einen
try..catch
Operator ein, prüfen Sie, ob es sich um den erwarteten Fehler handelt, und behandeln Sie ihn. oder - wenn der Fehler anders war - die Ausnahme erneut auslösen , um die übliche Behandlung durch den standortweiten Fehlerbehandler zu ermöglichen. Unten finden Sie den Beispielcode aus meinem Artikel zur Fehlerbehandlung mit PDO :Im obigen Code prüfen wir, ob der bestimmte Fehler eine Aktion ausführt, und lösen die Ausnahme für jeden anderen Fehler (z. B. keine solche Tabelle) erneut aus, der einem Programmierer gemeldet wird.
Während noch einmal - nur um einem Benutzer etwas wie "Ihre Einfügung war erfolgreich" zu sagen , wird nie eine Bedingung benötigt.
quelle
query()
Funktion? Kann ichquery()
anstelle von try-catch verwendenprepared()->execute()
?Versuchen Sie, den Rückgabewert von zu ermitteln
execute
, der sichTRUE
auf Erfolg undFALSE
Misserfolg bezieht.quelle
Wenn eine Aktualisierungsabfrage mit Werten ausgeführt wird, die mit dem aktuellen Datenbankeintrag übereinstimmen,
$stmt->rowCount()
wird zurückgegeben, da0
keine Zeilen betroffen waren. Wenn Sie einenif( rowCount() == 1 )
Test auf Erfolg durchführen müssen, denken Sie, dass die Aktualisierung fehlgeschlagen ist, wenn sie nicht fehlgeschlagen ist, aber die Werte bereits in der Datenbank vorhanden waren, sodass sich nichts ändert.Dies funktionierte bei mir nicht, als ich versuchte, einen Datensatz mit einem eindeutigen Schlüsselfeld zu aktualisieren, gegen das verstoßen wurde. Die Abfrage hat Erfolg zurückgegeben, aber eine andere Abfrage gibt den alten Feldwert zurück.
quelle
if($stmt->execute() && ($stmt->rowCount()>0))
Sie können die Zeilenanzahl testen
quelle
SELECT
Abfragen nicht zuverlässig sein kann (und selbst dort sprechen die Dokumente über mehrere Abfragen). Es sagt nichts überDELETE
,INSERT
oderUPDATE
, was in Ordnung zu Arbeit zu sein scheint (die Frage war , um eineINSERT
Abfrage). Ich bin jedoch neu bei PDO und wenn ich falsch liege und jemand andere Referenzen hat, schreibe sie bitte hier. Ich bin interessiert zu sehen, ob es echte Nachteile für die 3 obigen Befehle gibt.Verwenden Sie id als Primärschlüssel mit automatischer Inkrementierung
Die inkrementelle ID ist auch beim ersten Datensatz immer größer als Null. Dies bedeutet, dass immer ein wahrer Wert für die ID zurückgegeben wird, da größer als Null in PHP true bedeutet
quelle
PDOStatement-> execute () kann eine Ausnahme auslösen
Was Sie also tun können, ist
quelle