Lekcja 11. Wyświetlanie danych z bazy na stronie (SELECT)
ŚredniPo co się tego uczymy?
To jest dokładnie ten moment, w którym Twoja strona przestaje pokazywać dane "na sztywno" i zaczyna wyświetlać PRAWDZIWY, aktualny katalog filmów wprost z bazy danych — dodasz nowy film przez formularz z Lekcji 10, a od razu pojawi się on na liście, bez zmiany choćby jednej linijki kodu strony.
Teoria
Teraz odwrotny kierunek: pobierzesz dane Z bazy i wyświetlisz je na stronie. To połączenie Lekcji 4 (pętle), Lekcji 5 (tablice asocjacyjne) i Lekcji 9 (połączenie z bazą).
Schemat pracy:
1. Wykonaj zapytanie SELECT przez mysqli_query() — wynik to tzw. "zestaw wyników" (result set), nie same dane.
2. W pętli while pobieraj KOLEJNO każdy wiersz funkcją mysqli_fetch_assoc($wynik) — zwraca ona jeden wiersz jako tablicę asocjacyjną (dokładnie taką, jakiej uczyłeś się w Lekcji 5) ALBO false, gdy wierszy już nie ma.
3. Wewnątrz pętli wypisujesz dane z tego wiersza.
while ($wiersz = mysqli_fetch_assoc($wynik)) { ... } — to bardzo częsty wzorzec: pętla wykonuje się, dopóki funkcja zwraca kolejny wiersz (czyli coś "prawdziwego"), a kończy się, gdy zwróci false.
Przykład z życia
Strona główna serwisu filmowego z katalogiem wszystkich dostępnych tytułów — niezależnie od tego, czy w bazie jest 10 czy 10 000 filmów, ten sam kod PHP z pętlą wyświetli je wszystkie, zawsze aktualne.
Kod (PHP)
<?php
$polaczenie = mysqli_connect("localhost", "root", "", "serwis_filmowy");
if (!$polaczenie) {
die("Błąd połączenia: " . mysqli_connect_error());
}
$zapytanie = "SELECT tytul, rok_produkcji, gatunek FROM Filmy ORDER BY rok_produkcji DESC";
$wynik = mysqli_query($polaczenie, $zapytanie);
if (mysqli_num_rows($wynik) > ) {
echo "<ul>";
while ($wiersz = mysqli_fetch_assoc($wynik)) {
echo "<li>" . htmlspecialchars($wiersz["tytul"])
. " (" . $wiersz["rok_produkcji"] . ") - "
. htmlspecialchars($wiersz["gatunek"]) . "</li>";
}
echo "</ul>";
} else {
echo "Brak filmów w bazie danych.";
}
mysqli_close($polaczenie);
Komentarz i wyjaśnienie kodu
mysqli_num_rows($wynik) sprawdza z góry, ile wierszy zwróciło zapytanie — dzięki temu możemy pokazać komunikat "Brak filmów", zamiast pustej listy. Pętla while ($wiersz = mysqli_fetch_assoc($wynik)) w każdym przebiegu pobiera KOLEJNY wiersz jako tablicę asocjacyjną — $wiersz["tytul"] odpowiada dokładnie nazwie kolumny tytul z tabeli Filmy. htmlspecialchars() na wypisywanych danych chroni przed sytuacją, w której ktoś zapisał w bazie tytuł zawierający znaki HTML — to nawyk, który powinieneś stosować przy KAŻDYM wypisywaniu danych z bazy na stronę.
Ćwiczenie samodzielne
Dodaj do zapytania SELECT warunek WHERE pokazujący tylko filmy z ostatnich 5 lat.
Zadania do pracy własnej
Napisz skrypt wyświetlający listę wszystkich klientów z tabeli Klienci (imię i nazwisko) jako listę HTML.
Napisz skrypt wyświetlający katalog filmów w formie tabeli HTML (
) z kolumnami: tytuł, rok, gatunek, ocena — nagłówek tabeli (
) na sztywno, wiersze ( ) z pętli. Napisz skrypt wyświetlający katalog filmów pogrupowany wizualnie po gatunku: dla każdego gatunku osobny nagłówek
, a pod nim lista pasujących filmów (podpowiedź: możesz to zrobić dwoma zapytaniami — jedno pobierające listę gatunków, drugie wewnątrz pętli po gatunkach pobierające filmy danego gatunku).
Typowe błędy
Częsty błąd to pomylenie nazwy klucza w $wiersz[...] z rzeczywistą nazwą kolumny w bazie (wielkość liter ma znaczenie!). Drugi błąd: użycie foreach zamiast while z mysqli_fetch_assoc — $wynik z mysqli_query to nie zwykła tablica, tylko specjalny obiekt wyniku, więc trzeba go "rozpakowywać" pętlą while. Trzeci: zapomnienie sprawdzenia mysqli_num_rows(), przez co pusta baza powoduje wyświetlenie pustej, myloną z błędem listy zamiast czytelnego komunikatu.
Nawiązanie do egzaminu zawodowego
To razem z Lekcją 10 stanowi trzon efektu INF.03.5.4.5 ("stosuje biblioteki do obsługi bazy danych") w praktycznym zastosowaniu — wyświetlanie danych z bazy to jeden z najczęściej wymaganych elementów aplikacji internetowej na egzaminie INF.03.