sql >> Databasteknik >  >> RDS >> Mysql

MySQLi förberedde felrapportering för uttalanden

Varje metod för mysqli kan misslyckas. Du bör testa varje returvärde. Om en misslyckas, fundera på om det är vettigt att fortsätta med ett föremål som inte är i det tillstånd du förväntar dig att det ska vara. (Potentiellt inte i ett "säkert" tillstånd, men jag tror att det inte är ett problem här.)

Eftersom endast felmeddelandet för den senaste operationen lagras per anslutning/påstående kan du förlora information om vad orsakade felet om du fortsätter efter att något gick fel. Du kanske vill använda den informationen för att låta skriptet bestämma om det ska försöka igen (endast ett tillfälligt problem), ändra något eller rädda helt (och rapportera ett fel). Och det gör felsökningen mycket enklare.

$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();

Bara några anteckningar sex år senare...

Mysqli-tillägget är perfekt kapabelt att rapportera operationer som resulterar i en (mysqli) felkod annan än 0 via undantag, se mysqli_driver::$report_mode .
die() är riktigt, riktigt grovt och jag skulle inte använda det ens för exempel som det här längre.
Så snälla, ta bara bort det faktum att var och en (mysql) operation kan misslyckas av ett antal skäl; även om exakt samma sak gick bra tusen gånger förut....



  1. Vad är DTU i Azure SQL Database och hur man räknar ut hur mycket vi behöver

  2. Anropar lagrad procedur med returvärde

  3. Oracle lagrad procedur med parametrar för IN-sats

  4. Hur SQLite Total() fungerar