środa,
Obsługa błędów w MySQLi
Baza danych jest zewnętrznym zasobem i z różnych przyczyn może być niedostępna, zwłaszcza kiedy fizycznie znajduje się na innej maszynie. Z tego powodu istotną kwestią jest uwzględnienie w skrypcie ewentualnych błędów dotyczących połączenia. Język PHP i rozszerzenie MySQLi zapewniają odpowiednie do realizacji tego celu mechanizmy.
W przykładowym kodzie po próbie nawiązania połączenia następuje wywołanie funkcji mysqli_connect_errno(), która w przypadku wystąpienia błędu zwraca jego numeryczny kod. Jeśli nie udało się nawiązać połączenia, wyświetlana jest informacja o błędzie (mysqli_connect_error()), a skrypt zostaje bezwarunkowo zakończony (die()). W przypadku skryptu wdrożonego na publicznie dostępnej stronie internetowej obsługę błędu połączenia należy rozwiązać trochę inaczej, użytkownik nie jest specjalnie zainteresowany komunikatami zwracanymi przez bazę danych, wystarczy jakaś ogólna informacja o chwilowym braku możliwości pracy z aplikacją. Funkcja mysqli_connect_error() jest przydatna dla programisty szukającego przyczyny problemu.
include 'config.php';
$link = mysqli_connect(DBHOST, DBUSER, DBPASS, DBNAME);
if (mysqli_connect_errno()) {
printf("Błąd połączenia: %sn", mysqli_connect_error());
die();
}
W kolejnej fazie wykonania skryptu kontrolowane jest poprawne wykonanie zapytania. W przypadku wystąpienia wywoływana jest funkcja mysqli_error(), która zwraca komunikat opisujący ostatni zgłoszony błąd. Jeśli zapytanie zakończyło się sukcesem, wyświetlane są uzyskane informacje. Czasami sukces to brak wyników, w takim wypadku zapytanie SQL było poprawne, jednak nie odnaleziono rekordów spełniających jego warunki. Funkcja mysqli_num_rows() zwraca liczbę wierszy otrzymanych w wyniku zapytania. Instrukcja mysqli_fetch_row($result)[0] zwróci pierwszy otrzymany wiersz, w prezentowanym skrypcie jest on jedyny. Zbiór danych pobranych w zapytaniu może być duży, dlatego po wykonaniu wymaganych operacji warto zadbać o zwolnienie pamięci (funkcja mysqli_free_result()).
if ($result = mysqli_query($link, "SELECT POW(2,12)")) {
printf("Liczba zwróconych wierszy: %d
", mysqli_num_rows($result));
printf("Wynik zapytania: %d", mysqli_fetch_row($result)[0]);
mysqli_free_result($result);
} else {
printf("Błąd: %s", mysqli_error($link));
}
Po wykonaniu całego skryptu połączenie z bazą danych jest automatycznie zamykane, jednak dobrym zwyczajem jest jawne zamykanie połączenia (funkcja mysqli_close()).
mysqli_close($link);
Prezentowany skrypt w całości:
include 'config.php';
$link = mysqli_connect(DBHOST, DBUSER, DBPASS, DBNAME);
if (mysqli_connect_errno()) {
printf("Błąd połączenia: %sn", mysqli_connect_error());
die();
}
if ($result = mysqli_query($link, "SELECT POW(2,12)")) {
printf("Liczba zwróconych wierszy: %d
", mysqli_num_rows($result));
printf("Wynik zapytania: %d", mysqli_fetch_row($result)[0]);
mysqli_free_result($result);
} else {
printf("Błąd: %s", mysqli_error($link));
}
mysqli_close($link);