Mysql
 sql >> Base de données >  >> RDS >> Mysql

Rapport d'erreurs des instructions préparées MySQLi

Chaque méthode de mysqli peut échouer. Vous devez tester chaque valeur de retour. En cas d'échec, demandez-vous s'il est logique de continuer avec un objet qui n'est pas dans l'état auquel vous vous attendez. (Potentiellement pas dans un état "sûr", mais je pense que ce n'est pas un problème ici.)

Étant donné que seul le message d'erreur de la dernière opération est stocké par connexion/instruction, vous risquez de perdre des informations sur quoi a causé l'erreur si vous continuez après un problème. Vous voudrez peut-être utiliser ces informations pour laisser le script décider de réessayer (seulement un problème temporaire), de changer quelque chose ou de renflouer complètement (et de signaler un bogue). Et cela rend le débogage beaucoup plus facile.

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

Quelques notes six ans plus tard...

L'extension mysqli est parfaitement capable de signaler les opérations qui aboutissent à un code d'erreur (mysqli) autre que 0 via des exceptions, voir mysqli_driver::$report_mode .
die() est vraiment, vraiment grossier et je ne l'utiliserais plus même pour des exemples comme celui-ci. (mysql) opération peut échouer pour un certain nombre de raisons ; même si la même chose s'est bien passée mille fois auparavant...