KWALIFIKACJA INF3 - CZERWIEC 2018

PYTANIE NR 39.
W prezentowanym kodzie PHP w miejscu kropek powinno znaleźć się polecenie

$zapytanie = mysqli_query($db, “SELECT imie, nazwisko FROM uzytkownik");
$ile = mysqli_num_rows($zapytanie);
for ($i = 0; $i < $ile; $i++)
{
$wiersz = ……………………………….;
echo “$wiersz[0] $wiersz[1]";
}

A.
B.
C.
D.
Wyjaśnienie poprawnej odpowiedzi:
W pętli trzeba pobierać kolejny wiersz z wyniku zapytania i zapisać go do zmiennej $wiersz. Funkcja mysqli_fetch_row zwraca tablicę indeksowaną (np. [0], [1]) z wartościami kolumn, więc późniejsze użycie $wiersz[0] $wiersz[1] zadziała poprawnie.

Pełne wyjaśnienie:

W zaprezentowanym fragmencie kodu wykonywane jest zapytanie SQL:

SELECT imie, nazwisko FROM uzytkownik

Następnie liczba zwróconych rekordów jest wyznaczana przez mysqli_num_rows($zapytanie) i używana jako granica pętli for. Skoro pętla ma przejść po wszystkich rekordach, to w jej wnętrzu trzeba za każdym obrotem pobrać następny wiersz z obiektu wyniku zapytania.

Odpowiedź mysqli_fetch_row($zapytanie); jest poprawna, ponieważ:

  • pobiera jeden rekord (jeden wiersz) z wyniku zapytania,
  • zwraca go jako tablicę indeksowaną numerycznie,
  • dzięki temu odwołania $wiersz[0] i $wiersz[1] odpowiadają kolejno kolumnom imie i nazwisko wybranym w SELECT.

Pozostałe propozycje nie spełniają tego celu:

  • mysqli_free_result($zapytanie); służy do zwolnienia pamięci zajmowanej przez wynik zapytania. Wywołanie jej w pętli zniszczyłoby wynik zamiast pobierać dane do wyświetlenia.
  • mysqli_num_fields($zapytanie); zwraca liczbę kolumn w wyniku (tu: 2), czyli metadane, a nie kolejny rekord. Nie da się z tego zbudować $wiersz[0] i $wiersz[1] jako wartości imienia i nazwiska.
  • mysqli_query($zapytanie); jest błędne, bo ta funkcja oczekuje połączenia i tekstu zapytania SQL, a nie samego wyniku. Ponowne "odpytywanie" w miejscu pobierania rekordu jest inną operacją niż iteracja po już otrzymanych danych.

W praktyce często spotkasz też alternatywę mysqli_fetch_assoc, która zwraca tablicę asocjacyjną i pozwala odwoływać się do kolumn po nazwie (np. 'imie'), ale w tym zadaniu kod używa indeksów liczbowych, więc właściwy jest wariant zwracający tablicę numeryczną.

Dodatkowe pytania

Dodatkowe pytania (FAQ):
mysqli_fetch_row pobiera jeden (następny) rekord z wyniku zapytania i zwraca go jako tablicę indeksowaną numerycznie, np. [0], [1]. Nadaje się do pętli, w której kolejno przetwarzasz wiersze zwrócone przez SELECT.
Najpierw uzyskujesz obiekt wyniku zapytania, potem w pętli wielokrotnie wywołujesz funkcję pobierającą kolejny rekord (np. mysqli_fetch_row). Każde wywołanie przesuwa "wskaźnik" na następny wiersz aż do wyczerpania danych.
Ponieważ mysqli_fetch_row zwraca tablicę numeryczną. Element $wiersz[0] odpowiada pierwszej kolumnie z SELECT, a $wiersz[1] drugiej. To działa, gdy kolejność kolumn w zapytaniu jest znana i stała.
mysqli_fetch_row zwraca tablicę numeryczną, a mysqli_fetch_assoc tablicę asocjacyjną z kluczami będącymi nazwami kolumn (np. 'imie'). fetch_assoc jest czytelniejsze, ale w zadaniu użyto indeksów liczbowych, więc pasuje fetch_row.
Nie jest to dobry pomysł. mysqli_free_result zwalnia zasoby wyniku, więc po jej użyciu nie możesz dalej pobierać kolejnych rekordów. Zwykle wywołuje się ją dopiero po zakończeniu przetwarzania wszystkich wierszy.
mysqli_num_fields zwraca liczbę kolumn w wyniku zapytania (metadane). Używa się jej np. do dynamicznego generowania nagłówków tabeli lub sprawdzania struktury wyniku. Nie służy do pobierania wartości danych z kolejnych rekordów.
mysqli_query wykonuje zapytanie SQL na połączeniu z bazą. W miejscu, gdzie potrzebujesz kolejnego wiersza wyniku, zapytanie jest już wykonane i masz obiekt wyniku. Ponowne wywołanie query nie pobiera "następnego rekordu", tylko uruchamia nowe zapytanie.
Traktuj dane jako potencjalnie niebezpieczne: przy wyświetlaniu stosuj odpowiednie kodowanie znaków (np. funkcję do escapowania w HTML), a przy budowie zapytań używaj zapytań przygotowanych. W samym przetwarzaniu wyniku dobieraj funkcję pobierającą wiersz zgodnie z typem tablicy.
Pętla while z pobieraniem wiersza (np. "dopóki da się pobrać rekord") bywa prostsza i nie wymaga wcześniejszego liczenia wierszy. for ma sens, gdy potrzebujesz indeksu i znasz liczbę iteracji z góry, np. z mysqli_num_rows.
Najczęściej myli się funkcję pobierającą rekord z funkcją zwalniającą wynik albo z funkcją zwracającą metadane. Częsty błąd to też niedopasowanie typu tablicy do sposobu odwołań: użycie indeksów liczbowych przy pobieraniu asocjacyjnym (lub odwrotnie).
info

Statystycznie 64% uczniów zna prawidłową odpowiedź. średnie

Według specjalistów z branży: "W pętli trzeba pobierać kolejny wiersz z wyniku zapytania i zapisać go do zmiennej $wiersz."

Źródła:

  • PHP Manual: mysqli_fetch_row — https://www.php.net/manual/en/mysqli-result.fetch-row.php (dostęp: 2026-02-28)
  • PHP Manual: mysqli_num_rows — https://www.php.net/manual/en/mysqli-result.num-rows.php (dostęp: 2026-02-28)
  • PHP Manual: mysqli_free_result — https://www.php.net/manual/en/mysqli-result.free.php (dostęp: 2026-02-28)

Materiały:

  • Oficjalna dokumentacja PHP: dział MySQLi (pobieranie wyników zapytań)
  • Ćwiczenia: iteracja po wynikach SELECT i wyświetlanie wierszy w pętli
  • Przykłady porównujące mysqli_fetch_row, mysqli_fetch_assoc i mysqli_fetch_array

Aktualizacja pytania: 31.03.2026



Aktualizacja pytania: 31.03.2026
📡 Brak połączenia internetowego