KWALIFIKACJA INF3 - STYCZEŃ 2020

PYTANIE NR 38.
Jaką wartość przyjmie zmienna x po wykonaniu kodu PHP przedstawionego poniżej?

mysqli_query($db, "DELETE FROM produkty WHERE status < 0");
$x = mysqli_affected_rows($db);

A.
B.
C.
D.
Wyjaśnienie poprawnej odpowiedzi:
Funkcja mysqli_affected_rows() zwraca liczbę wierszy zmodyfikowanych przez ostatnie zapytanie wykonane na danym połączeniu. Ponieważ wykonano DELETE z warunkiem status < 0, zmienna x przyjmie liczbę usuniętych rekordów (0, gdy nic nie spełnia warunku; -1 przy błędzie).

Pełne wyjaśnienie:

W pokazanym kodzie najpierw wykonywane jest zapytanie SQL typu DML:

DELETE FROM produkty WHERE status < 0

Następnie wynik działania operacji jest "mierzony" funkcją mysqli_affected_rows($db). Ta funkcja zwraca liczbę wierszy, które zostały zmienione przez ostatnie zapytanie wykonane na danym połączeniu z bazą (czyli na uchwycie $db).

  • Dla DELETE oznacza to liczbę faktycznie usuniętych wierszy spełniających warunek WHERE status < 0.
  • Jeżeli żaden rekord nie spełnia warunku, wynik będzie równy 0 (zapytanie wykonało się poprawnie, ale nie usunęło żadnych danych).
  • W przypadku błędu wykonania zapytania lub połączenia funkcja może zwrócić -1, co jest sygnałem do sprawdzenia błędu (np. poprzez mechanizmy diagnostyczne MySQLi).

Odpowiedź "Liczby wierszy przetworzonych zapytaniem DELETE FROM" jest poprawna, bo dokładnie opisuje semantykę affected rows dla operacji usuwania.

Pozostałe odpowiedzi są błędne, ponieważ:

  • "Liczby wierszy znajdujących się w bazie danych." sugeruje rozmiar bazy lub tabel, a mysqli_affected_rows() nie służy do zliczania wszystkich rekordów.
  • "Liczby wierszy dodanych do tabeli produkty." pasowałoby do sytuacji po INSERT, ale tutaj wykonywany jest DELETE, więc nie ma dodawania.
  • "Liczby wierszy tabeli produkty, dla których pole status jest większe od zera." myli znak nierówności: zapytanie dotyczy status < 0, a ponadto mysqli_affected_rows() nie liczy rekordów spełniających dowolny warunek, tylko te faktycznie zmienione przez ostatnie zapytanie.

W praktyce taka konstrukcja bywa używana w aplikacjach do komunikatu dla użytkownika, np. "Usunięto X produktów", oraz do rozróżnienia sytuacji: "nie było czego usuwać" (0) od realnego błędu (-1).

Dodatkowe pytania

Dodatkowe pytania (FAQ):
mysqli_affected_rows() zwraca liczbę wierszy zmodyfikowanych przez ostatnie zapytanie wykonane na danym połączeniu MySQLi. Dla DELETE jest to liczba usuniętych rekordów, dla INSERT liczba dodanych, a dla UPDATE liczba wierszy objętych aktualizacją.
Wynik 0 oznacza, że zapytanie DELETE wykonało się poprawnie, ale żaden rekord nie spełniał warunku w klauzuli WHERE. To częsta sytuacja w aplikacjach (np. próba usunięcia nieistniejących lub już przetworzonych danych) i nie jest to błąd.
-1 zwykle sygnalizuje błąd operacji (np. problem z zapytaniem lub połączeniem), a 0 oznacza brak zmodyfikowanych wierszy przy poprawnym wykonaniu. W praktyce po uzyskaniu -1 należy dodatkowo sprawdzić diagnostykę błędów MySQLi, zamiast traktować to jako "nic nie zmieniono".
Dla SELECT nie uzyskasz w ten sposób wiarygodnej liczby rekordów wyniku. Do liczenia wierszy w rezultacie zapytania SELECT używa się mysqli_num_rows() na obiekcie wyniku. mysqli_affected_rows() jest przeznaczona głównie do zapytań modyfikujących dane (DML).
mysqli_num_rows() dotyczy liczby wierszy w wyniku SELECT (czyli rekordów zwróconych przez zapytanie). mysqli_affected_rows() dotyczy liczby wierszy, które zostały zmienione przez INSERT/UPDATE/DELETE/REPLACE. Mylenie tych funkcji to jeden z najczęstszych błędów na egzaminach.
Najczęściej chodzi o operacje modyfikujące dane: INSERT (dodawanie), UPDATE (aktualizacja), DELETE (usuwanie) oraz REPLACE. Po takich zapytaniach sensownie jest sprawdzić liczbę zmienionych rekordów, aby potwierdzić efekt działania.
Warunek status < 0 ogranicza usuwanie tylko do tych rekordów, w których pole status ma wartość mniejszą od zera. W efekcie nie usuwa się całej tabeli, a jedynie podzbiór danych. To właśnie liczba rekordów spełniających ten warunek (i usuniętych) trafi do wyniku affected rows.
Po wykonaniu DELETE odczytaj mysqli_affected_rows(). Jeśli wynik jest > 0, to usunięto co najmniej jeden rekord. Jeśli wynik to 0, zapytanie mogło wykonać się poprawnie, ale nic nie pasowało do WHERE. Jeśli wynik to -1, należy przejść do obsługi błędu.
Najczęstsze pomyłki to: mylenie z mysqli_num_rows(), interpretowanie wyniku jako liczby wszystkich rekordów w tabeli, ignorowanie warunku WHERE, oraz nieuwzględnianie sytuacji, że wynik może być 0. Częsty jest też błąd literówki w nazwie funkcji.
Ćwicz krótkie fragmenty kodu CRUD w PHP: INSERT/UPDATE/DELETE plus sprawdzanie efektu funkcjami typu mysqli_affected_rows(). Równolegle powtórz podstawy SQL (szczególnie WHERE) i rozróżniaj funkcje liczące wynik SELECT od funkcji opisujących zmiany w bazie.
info

To pytanie poprawnie rozwiązuje 64% zdających egzamin. średnie

Według specjalistów z branży: "Funkcja mysqli_affected_rows() zwraca liczbę wierszy zmodyfikowanych przez ostatnie zapytanie wykonane na danym połączeniu."

Źródła:

  • PHP Manual: mysqli_affected_rows — Returns the number of affected rows in a previous MySQL operation, https://www.php.net/manual/en/mysqli.affected-rows.php (dostęp: 2026-03-02)
  • PHP Manual: mysqli_query — Performs a query on the database, https://www.php.net/manual/en/mysqli.query.php (dostęp: 2026-03-02)
  • PHP Manual: mysqli_num_rows — Gets the number of rows in a result, https://www.php.net/manual/en/mysqli-result.num-rows.php (dostęp: 2026-03-02)

Materiały:

  • Dokumentacja PHP: MySQLi (opis funkcji affected_rows oraz query)
  • Ćwiczenia SQL: zapytania DELETE z różnymi warunkami WHERE
  • Materiały o różnicach między "affected rows" a "num rows" w kontekście SELECT vs DML

Aktualizacja pytania: 03.04.2026



Aktualizacja pytania: 03.04.2026
📡 Brak połączenia internetowego