Mysql
 sql >> Baza danych >  >> RDS >> Mysql

Raportowanie błędów przygotowanych przez MySQLi

Każda metoda mysqli może zawieść. Powinieneś przetestować każdą zwracaną wartość. Jeśli coś się nie powiedzie, zastanów się, czy ma sens kontynuowanie z obiektem, który nie jest w takim stanie, w jakim się spodziewasz. (Potencjalnie nie w „bezpiecznym” stanie, ale myślę, że nie stanowi to problemu.)

Ponieważ dla każdego połączenia/wypowiedzi jest przechowywany tylko komunikat o błędzie dla ostatniej operacji, możesz utracić informacje o co spowodował błąd, jeśli będziesz kontynuować po tym, jak coś poszło nie tak. Możesz chcieć wykorzystać te informacje, aby skrypt mógł zdecydować, czy spróbować ponownie (tylko tymczasowy problem), coś zmienić lub całkowicie zrezygnować (i zgłosić błąd). I znacznie ułatwia debugowanie.

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

Zaledwie kilka notatek sześć lat później...

Rozszerzenie mysqli doskonale nadaje się do raportowania operacji, które skutkują kodem błędu (mysqli) innym niż 0 za pośrednictwem wyjątków, zobacz mysqli_driver::$report_mode .
die() jest naprawdę, bardzo prymitywne i nie użyłbym go już nawet do przykładów takich jak ten.
Więc proszę, usuń tylko fakt, że każdy (mysql) operacja może porażka z wielu powodów; nawet jeśli dokładnie to samo poszło dobrze tysiąc razy wcześniej....



  1. Database
  2.   
  3. Mysql
  4.   
  5. Oracle
  6.   
  7. Sqlserver
  8.   
  9. PostgreSQL
  10.   
  11. Access
  12.   
  13. SQLite
  14.   
  15. MariaDB
  1. Grupuj według MySQL i zamawiaj według

  2. Zapytanie MySQL — rekordy od dnia dzisiejszego do ostatnich 30 dni

  3. Zrzut MySQL według zapytania

  4. Jak uzyskać rekordy bieżącego miesiąca w MySQL?

  5. Najlepszy typ danych do przechowywania wartości walut w bazie danych MySQL