Przejdź do głównej treści

Kwalifikacja: INF.03 - Tworzenie i administrowanie stronami i aplikacjami internetowymi oraz bazami danych

Zawód: Technik informatyk, Technik programista

Kategorie: Programowanie webowe Bazy danych PHP

W przedstawionym kodzie PHP komunikat w miejscu znaków zapytania wyświetla się wtedy, gdy zmienna $x ma wartość true. Który komunikat opisuje tę sytuację zgodnie z prawdą niezależnie od zawartości tabeli?

$x = mysqli_query($polaczenie, 'DELETE FROM mieszkancy WHERE id = 5');
if ($x)
    echo '???';
A. Nie udało się połączyć z serwerem bazy danych.
Źle. Bez połączenia zapytanie nie zostałoby wykonane i nie zwróciłoby true.
B. Tabela mieszkancy została usunięta z bazy.
Źle. Tabelę usuwa DROP TABLE, a DELETE kasuje tylko wybrane wiersze.
C. Rekord o identyfikatorze 5 został usunięty z tabeli.
Źle. Wartość true pojawi się także wtedy, gdy rekordu o id 5 nie ma i nic nie usunięto.
D. Polecenie DELETE zostało wykonane bez błędu.
Dobrze. Dla DELETE funkcja mysqli_query() zwraca true po poprawnym wykonaniu polecenia.

Dla poleceń, które nie zwracają wierszy, takich jak DELETE, UPDATE czy INSERT, funkcja mysqli_query() zwraca true, gdy serwer wykonał polecenie bez błędu. Nie oznacza to jednak, że coś zostało usunięte. Jeśli w tabeli nie ma rekordu o id = 5, zapytanie też jest poprawne, tylko obejmuje zero wierszy.

Liczbę rekordów, których dotyczyła zmiana, podaje mysqli_affected_rows($polaczenie). Dopiero sprawdzenie, czy ta wartość jest większa od zera, pozwala uczciwie napisać, że rekord usunięto. W nowszych wersjach PHP błąd zapytania domyślnie zgłaszany jest wyjątkiem, ale sens wartości true pozostaje ten sam.

Ta sama zasada dotyczy poleceń UPDATE i INSERT.

Najbardziej kusi komunikat o usunięciu rekordu nr 5, bo właśnie tego oczekuje autor kodu. Wartość true mówi jednak tylko, że polecenie było poprawne i serwer je wykonał. Gdy rekordu o takim identyfikatorze nie ma, DELETE kończy się sukcesem i nie usuwa niczego. Żeby to rozróżnić, sprawdza się mysqli_affected_rows().

Usunięcie całej tabeli to zupełnie inne polecenie, DROP TABLE mieszkancy. DELETE z warunkiem WHERE usuwa wyłącznie wiersze spełniające warunek, a struktura tabeli zostaje.

Komunikat o braku połączenia też tu nie pasuje. Gdyby połączenia nie było, zapytanie zakończyłoby się błędem i $x nie miałoby wartości true. Bez zastrzeżeń prawdziwe jest więc tylko zdanie o poprawnym wykonaniu polecenia.

Przy czytaniu kodu warto więc odróżniać sukces wykonania polecenia od tego, czy polecenie faktycznie zmieniło jakiekolwiek dane w tabeli.

Wymagane logowanie

Ocenianie trudności pytań jest dostępne tylko dla zalogowanych użytkowników. Zaloguj się, aby skorzystać z pełni możliwości platformy.

Twoja ocena pomoże innym uczniom w przygotowaniu do egzaminu, a Tobie pozwoli na dostęp do spersonalizowanych statystyk.

Zgłoś błąd w pytaniu

Rozwiń sekcję i zmień pole, którego dotyczy błąd. Wysłane zostaną tylko zmienione sekcje.

Błędna kwalifikacja
Błąd w treści pytania
Błąd w treści odpowiedzi
Błąd w obrazie
Dane kontaktowe (opcjonalnie)
Podaj email, jeśli chcesz otrzymać informację o rozpatrzeniu zgłoszenia.