Mysql
 sql >> Database >  >> RDS >> Mysql

MySQLi ha preparato le istruzioni per la segnalazione degli errori

Ogni metodo di mysqli può fallire. Dovresti testare ogni valore restituito. Se uno fallisce, pensa se ha senso continuare con un oggetto che non è nello stato in cui ti aspetti che sia. (Potenzialmente non in uno stato "sicuro", ma penso che non sia un problema qui.)

Poiché per connessione/istruzione viene memorizzato solo il messaggio di errore relativo all'ultima operazione, potresti perdere informazioni su cosa ha causato l'errore se si continua dopo che qualcosa è andato storto. Potresti voler utilizzare queste informazioni per consentire allo script di decidere se riprovare (solo un problema temporaneo), modificare qualcosa o salvare completamente (e segnalare un bug). E rende il debug molto più semplice.

$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 poche note sei anni dopo...

L'estensione mysqli è perfettamente in grado di segnalare operazioni che generano un codice di errore (mysqli) diverso da 0 tramite eccezioni, vedere mysqli_driver::$report_mode .
die() è davvero, davvero grezzo e non lo userei più nemmeno per esempi come questo.
Quindi, per favore, togli solo il fatto che tutti (mysql) operazione can fallire per una serie di motivi; anche se la stessa identica cosa è andata bene mille volte prima....