sql >> Base de Datos >  >> RDS >> Mysql

Informe de errores de declaraciones preparadas de MySQLi

Cada método de mysqli puede fallar. Debe probar cada valor de retorno. Si uno falla, piensa si tiene sentido continuar con un objeto que no está en el estado que esperas que esté. (Posiblemente no en un estado "seguro", pero creo que eso no es un problema aquí).

Dado que solo se almacena el mensaje de error de la última operación por conexión/declaración, es posible que pierda información sobre qué causó el error si continúa después de que algo salió mal. Es posible que desee utilizar esa información para permitir que el script decida si intentarlo de nuevo (solo un problema temporal), cambiar algo o abandonar por completo (e informar un error). Y facilita mucho la depuración.

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

Solo unas pocas notas seis años después...

La extensión mysqli es perfectamente capaz de informar operaciones que resultan en un código de error (mysqli) distinto de 0 a través de excepciones, consulte mysqli_driver::$report_mode .
die() es muy, muy crudo y ya no lo usaría ni siquiera para ejemplos como este.
Así que por favor, solo quite el hecho de que todos y cada uno (mysql) operación can fallar por varias razones; incluso si exactamente lo mismo salió bien mil veces antes....