Mysql
 sql >> Base de Dados >  >> RDS >> Mysql

Relatório de erros de instruções preparadas MySQLi


Cada método do mysqli pode falhar. Você deve testar cada valor de retorno. Se um falhar, pense se faz sentido continuar com um objeto que não está no estado que você espera que esteja. (Potencialmente não em um estado "seguro", mas acho que isso não é um problema aqui.)

Como apenas a mensagem de erro da última operação é armazenada por conexão/instrução, você pode perder informações sobre o que causou o erro se você continuar depois que algo deu errado. Você pode querer usar essas informações para permitir que o script decida se tenta novamente (apenas um problema temporário), altera algo ou sai completamente (e relata um bug). E torna a depuração muito mais fácil.
$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();

Apenas algumas notas seis anos depois...


A extensão mysqli é perfeitamente capaz de relatar operações que resultam em um código de erro (mysqli) diferente de 0 via exceções, veja mysqli_driver::$report_mode .
die() é muito, muito grosseiro e eu não o usaria mais nem mesmo para exemplos como este.
Então, por favor, apenas tire o fato de que todos e todos (mysql) operação pode falhar por uma série de razões; mesmo se exatamente a mesma coisa correu bem mil vezes antes....