Mysql
 sql >> Datenbank >  >> RDS >> Mysql

Fehlerberichte für vorbereitete MySQLi-Anweisungen

Jede Methode von mysqli kann fehlschlagen. Sie sollten jeden Rückgabewert testen. Wenn einer fehlschlägt, überlegen Sie, ob es sinnvoll ist, mit einem Objekt fortzufahren, das nicht in dem Zustand ist, den Sie erwarten. (Möglicherweise nicht in einem "sicheren" Zustand, aber ich denke, das ist hier kein Problem.)

Da nur die Fehlermeldung für die letzte Operation pro Verbindung/Anweisung gespeichert wird, verlieren Sie möglicherweise Informationen darüber, was den Fehler verursacht hat, wenn Sie fortfahren, nachdem etwas schief gelaufen ist. Möglicherweise möchten Sie diese Informationen verwenden, um das Skript entscheiden zu lassen, ob es es erneut versucht (nur ein vorübergehendes Problem), etwas ändert oder vollständig aussteigt (und einen Fehler meldet). Und es macht das Debuggen viel einfacher.

$stmt = $mysqli->prepare("INSERT INTO testtable VALUES (?,?,?)");
// prepare() can fail because of syntax errors, missing privileges, ....
if ( false===$stmt ) {
  // and since all the following operations need a valid/ready statement object
  // it doesn't make sense to go on
  // you might want to use a more sophisticated mechanism than die()
  // but's it's only an example
  die('prepare() failed: ' . htmlspecialchars($mysqli->error));
}

$rc = $stmt->bind_param('iii', $x, $y, $z);
// bind_param() can fail because the number of parameter doesn't match the placeholders in the statement
// or there's a type conflict(?), or ....
if ( false===$rc ) {
  // again execute() is useless if you can't bind the parameters. Bail out somehow.
  die('bind_param() failed: ' . htmlspecialchars($stmt->error));
}

$rc = $stmt->execute();
// execute() can fail for various reasons. And may it be as stupid as someone tripping over the network cable
// 2006 "server gone away" is always an option
if ( false===$rc ) {
  die('execute() failed: ' . htmlspecialchars($stmt->error));
}

$stmt->close();

Nur ein paar Notizen sechs Jahre später...

Die mysqli-Erweiterung ist perfekt in der Lage, Operationen zu melden, die über Ausnahmen zu einem anderen (mysqli-)Fehlercode als 0 führen, siehe mysqli_driver::$report_mode .
die() ist wirklich, wirklich grob und ich würde es nicht einmal mehr für Beispiele wie dieses verwenden.
Also bitte, nimm nur die Tatsache weg, dass jeder (mysql)-Operation kann scheitern aus einer Reihe von Gründen; auch wenn genau das gleiche ging schon tausendmal gut....