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

MySQLi udarbejdede erklæringer fejlrapportering

Hver metode til mysqli kan mislykkes. Du bør teste hver returværdi. Hvis man fejler, så tænk over, om det giver mening at fortsætte med et objekt, der ikke er i den tilstand, du forventer, at det er. (Potentielt ikke i en "sikker" tilstand, men jeg tror, ​​det ikke er et problem her.)

Da kun fejlmeddelelsen for den sidste handling gemmes pr. forbindelse/udsagn, kan du miste information om hvad forårsagede fejlen, hvis du fortsætter efter noget gik galt. Du vil måske bruge disse oplysninger til at lade scriptet beslutte, om det skal prøve igen (kun et midlertidigt problem), ændre noget eller for at redde fuldstændigt (og rapportere en fejl). Og det gør fejlfinding meget nemmere.

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

Bare et par bemærkninger seks år senere...

Mysqli-udvidelsen er perfekt i stand til at rapportere operationer, der resulterer i en anden (mysqli) fejlkode end 0 via undtagelser, se mysqli_driver::$report_mode .
die() er virkelig, virkelig groft, og jeg ville ikke bruge det selv til eksempler som dette længere.
Så venligst, fjern kun det faktum, at hver og (mysql) operation kan mislykkes af en række årsager; selv hvis præcis det samme gik godt tusinde gange før....



  1. Udlevering af julegaver:Julemandens datamodel

  2. En oversigt over pgModeler til PostgreSQL

  3. Sådan rangeres rækker i en partition i SQL

  4. Rækketælling med BOB