sql >> Database >  >> RDS >> Mysql

MySQLi voorbereide verklaringen foutrapportage

Elke methode van mysqli kan mislukken. U moet elke retourwaarde testen. Als er een faalt, bedenk dan of het zin heeft om door te gaan met een object dat zich niet in de staat bevindt die u verwacht. (Mogelijk niet in een "veilige" staat, maar ik denk dat dat hier geen probleem is.)

Aangezien alleen de foutmelding voor de laatste bewerking per verbinding/instructie wordt opgeslagen, kunt u informatie verliezen over wat de fout heeft veroorzaakt als u doorgaat nadat er iets mis is gegaan. Misschien wilt u die informatie gebruiken om het script te laten beslissen of u het opnieuw wilt proberen (slechts een tijdelijk probleem), iets wilt wijzigen of het volledig moet redden (en een bug moet melden). En het maakt foutopsporing een stuk eenvoudiger.

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

Slechts een paar opmerkingen zes jaar later...

De mysqli-extensie is perfect in staat om bewerkingen te rapporteren die resulteren in een (mysqli) foutcode anders dan 0 via uitzonderingen, zie mysqli_driver::$report_mode .
die() is echt heel grof en ik zou het zelfs niet meer voor dit soort voorbeelden gebruiken.
Dus alsjeblieft, neem alleen het feit weg dat elk (mysql) bewerking kan mislukken om een ​​aantal redenen; zelfs als precies hetzelfde ging duizend keer eerder goed....



  1. Eén record verwijderen uit Entity Framework?

  2. SQL Server 2008 Verticale gegevens naar Horizontaal

  3. SQLite selecteert rijen als tijdstempel overeenkomt met de datum van vandaag

  4. Oracle DBA realtime vragen