Aktueller Standort: Startseite> Neueste Artikel> Wenn der Rückgabewert von PDO :: ERRAGECODE '00000' ist, wie kann man genau bestimmen, ob der Datenbankvorgang wirklich erfolgreich ist?

Wenn der Rückgabewert von PDO :: ERRAGECODE '00000' ist, wie kann man genau bestimmen, ob der Datenbankvorgang wirklich erfolgreich ist?

M66 2025-06-22

Bei der Verwendung von PDO (PHP -Datenobjekten) für Datenbankvorgänge gibt die PDO :: ERRORCODE () -Methode '00000' zurück, um anzuzeigen, dass keine Fehler aufgetreten sind. Dies scheint zu bedeuten, dass die Datenbankoperation erfolgreich abgeschlossen ist. In Wirklichkeit gibt ERRRUNGCODE '00000' jedoch nicht immer genau wider, ob der Vorgang tatsächlich erfolgreich ist.

In diesem Artikel wird ausführlich erklärt, warum PDO :: ERRORCODE () '00000' zurückgibt und den Erfolg des Vorgangs nicht vollständig darstellt und mehrere zuverlässigere Methoden einführt, um zu beurteilen, ob der Datenbankvorgang wirklich erfolgreich ist.


Warum bedeutet PDO :: ERRORCODE () RETURATION '00000' nicht 100% Erfolg?

'0000' von PDO :: ERRAGECODE () ist ein SQLState -Standardcode, der "keine Fehler" bedeutet. Es wird hauptsächlich aufgeführt, ob während des Datenbankkommunikationsprozesses Fehler wie Syntaxfehler, Verbindungsfehler usw. vorliegen.

In einigen Fällen, auch wenn die SQL -Anweisung ausgeführt wird und kein Fehler auftritt, gibt ERRRUNGCODE () immer noch '00000' zurück, das Betriebsergebnis ist jedoch möglicherweise nicht ideal. Zum Beispiel:

  • Die Update -Anweisung wurde ausgeführt, aber tatsächlich wurden tatsächlich keine Zeilen aktualisiert (da die Bedingung keine Datensätze übereinstimmte).

  • Die Löschanweisung wurde ausgeführt, aber es wurden keine Zeilen gelöscht.

  • Die Einfügeanweisung wurde ausgeführt, die Daten wurden jedoch durch den Auslöser geändert oder die Einschränkungen waren nicht wirksam.

Diese Situationen verursachen keine Fehler, aber für die Geschäftslogik wird der Betrieb nicht erfolgreich wirksam.


Wie kann ich genau bestimmen, ob der Datenbankvorgang wirklich erfolgreich ist?

1. Verwenden Sie RowCount (), um die Anzahl der betroffenen Zeilen zu bestimmen

Pdostatement :: rowCount () gibt die Anzahl der von der zuletzt ausgeführten SQL -Anweisung betroffenen Zeilen zurück. Es ist eine wichtige Grundlage, um zu beurteilen, ob Update und Löschen die Daten wirklich ändern.

 <?php
$pdo = new PDO('mysql:host=m66.net;dbname=testdb;charset=utf8', 'username', 'password');

$sql = "UPDATE users SET status = 1 WHERE id = :id";
$stmt = $pdo->prepare($sql);
$stmt->execute([':id' => 123]);

if ($stmt->errorCode() === '00000') {
    $affectedRows = $stmt->rowCount();
    if ($affectedRows > 0) {
        echo "Erfolgreich aktualisieren,Es hat betroffen {$affectedRows} OK。";
    } else {
        echo "执OK成功,但没有OK被更新。";
    }
} else {
    echo "Bei der Datenbankoperation trat ein Fehler auf,Fehlercode:" . $stmt->errorCode();
}
?>

Obwohl ERRORCODE () '00000' ist, wird nur, wenn RowCount () größer als Null ist, als wirklich modifiziert.


2. Überprüfen

Für den Insertionsbetrieb des automatischen Primärschlüssels kann die eingefügte Datensatz -ID über pdo :: lastInsertid () erhalten werden. Wenn eine nicht leere und angemessene ID zurückgegeben wird, ist die Einfügung erfolgreich.

 <?php
$pdo = new PDO('mysql:host=m66.net;dbname=testdb;charset=utf8', 'username', 'password');

$sql = "INSERT INTO users (name, email) VALUES (:name, :email)";
$stmt = $pdo->prepare($sql);
$stmt->execute([':name' => 'Zhang San', ':email' => 'zhangsan@example.com']);

if ($stmt->errorCode() === '00000') {
    $lastId = $pdo->lastInsertId();
    if ($lastId) {
        echo "Erfolgreich einfügen,Neue BenutzerIDfür:{$lastId}";
    } else {
        echo "执OK成功,Aber es wurde kein neuer Einsatz zurückgegebenID。";
    }
} else {
    echo "Bei der Datenbankoperation trat ein Fehler auf,Fehlercode:" . $stmt->errorCode();
}
?>

Beachten Sie, dass der Primärschlüssel von lastInserStId () von der Datenbanktabelle abhängt, andernfalls kann der Rückgabewert leer sein.


3.. Fangen Sie Ausnahmen an und verwenden Sie die Transaktionskontrolle, um sicherer zu sein

Bei der Durchführung mehrerer Operationen oder komplexer Operationen ist das Einschalten von Transaktionen und das Fangen von Ausnahmen die sicherste Möglichkeit, um eine operative Atomizität zu gewährleisten.

 <?php
try {
    $pdo = new PDO('mysql:host=m66.net;dbname=testdb;charset=utf8', 'username', 'password');
    $pdo->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

    $pdo->beginTransaction();

    $sql1 = "UPDATE accounts SET balance = balance - 100 WHERE user_id = :user_id";
    $stmt1 = $pdo->prepare($sql1);
    $stmt1->execute([':user_id' => 1]);
    if ($stmt1->rowCount() === 0) {
        throw new Exception("Kontoabzug fehlgeschlagen,无受影响OK数");
    }

    $sql2 = "UPDATE accounts SET balance = balance + 100 WHERE user_id = :user_id";
    $stmt2 = $pdo->prepare($sql2);
    $stmt2->execute([':user_id' => 2]);
    if ($stmt2->rowCount() === 0) {
        throw new Exception("Kontoaufladung ist fehlgeschlagen,无受影响OK数");
    }

    $pdo->commit();
    echo "Erfolgreich übertragen";
} catch (Exception $e) {
    $pdo->rollBack();
    echo "Operation fehlgeschlagen,Grund:" . $e->getMessage();
}
?>

Hier ist jede Operation ungültig und bringt eine Ausnahme, rollt die Transaktion zurück und vermeidet Datenkonsistenz.


Zusammenfassen

  • PDO :: ERRORCODE () gibt '00000' zurück, um keine Fehler anzugeben, bedeutet jedoch nicht, dass der Betrieb den tatsächlichen Effekt hat.

  • Die Kombination von Pdostatement :: RowCount (), um die Anzahl der betroffenen Zeilen zu bestimmen, ist der Schlüssel zur Bestimmung, ob der Modifikationsvorgang wirklich effektiv ist.

  • Verwenden Sie für den Einfügungsvorgang PDO :: lastInserStid (), um zu bestätigen, ob die Einfügung erfolgreich ist oder nicht.

  • Es wird empfohlen, Transaktions- und Ausnahmeberichte für komplexe Operationen zu verwenden, um die Integrität und Genauigkeit von Datenvorgängen sicherzustellen.

Durch die oben genannten Methoden können wir genauer bestimmen, ob der Datenbankvorgang wirklich erfolgreich ist, wodurch logische Schwachstellen vermieden werden, die durch die Ausnahme von ERRORCODE () verursacht werden.