INF.03 · Aplikacje internetowe PHP
Wyświetlanie danych z bazy na stronie (SELECT)
Z wierszy bazy zbuduj stronę.
- PHP8.3
- mysqli · MariaDB
- Praktyka i diagnoza
Po tej lekcji: Pobierzesz rekordy, obsłużysz pusty wynik i bezpiecznie wyświetlisz tekst na stronie.
Zrozum mechanizm
SELECT zwraca zestaw wyników. Fetch_assoc odczytuje wiersz jako tablicę z nazwami kolumn; fetch_all(MYSQLI_ASSOC) daje tablicę wierszy. W projekcie get_result() wymaga mysqlnd. Przejście foreach buduje kolejne karty, a pusty wynik powinien mieć własny komunikat.
Dane z bazy także mogą zawierać HTML — h() stosuj przy wypisywaniu tytułu i gatunku, nie tylko bezpośrednio dla $_POST. Parametr wyszukiwarki trafia do prepare. LIKE z% oznacza dopasowanie fragmentu; znaki% i_ w podanej wartości mają znaczenie wzorca, to nie jest wstrzyknięcie SQL. Jeśli potrzebujesz dosłownego szukania tych znaków, musisz osobno określić regułę escapowania LIKE. Nazw kolumn ORDER BY nie parametryzujesz przez? — wybierasz je z zamkniętej listy.
Jak uruchamiać krótkie przykłady?
Każdy krótki przykład oznaczony własnym plikiem uruchamiaj osobno, nie doklejaj wszystkich definicji do jednego pliku. W edytorze zapisz go jako .php, a w terminalu tego folderu wpisz np. php for.php. Wtedy pokazane końce wierszy PHP_EOL są widoczne. W odpowiedzi HTML znak końca wiersza sam nie robi nowej linii na ekranie: użyj <br> albo znacznika <pre>. Wyświetl źródło pozwala zobaczyć tekst odpowiedzi.
Przykłady opisane jako fragment projektu wymagają paczki KINO / LAB i wcześniejszej konfiguracji. Nie uruchamiaj ich jako samodzielnych endpointów. Pełny plik niżej pokazuje kontekst. Funkcje h(), pole() i wymagajPost() są nasze; ich definicje wczytuje bootstrap.php.
SELECT: zapytanie nie jest jeszcze wierszem
Najpierw wykonujesz zapytanie, następnie odczytujesz wyniki. Te metody zwracają różne rzeczy, dlatego rozdzielamy je w przykładzie.
Podstawowa forma: execute() → get_result() → fetch_assoc() lub fetch_all(MYSQLI_ASSOC)
<?php
// Fragment projektu po utworzeniu $polaczenie:
$zapytanie = $polaczenie->prepare('SELECT tytul, rok FROM Filmy WHERE rok >= ?');
$rokOd = 2024;
$zapytanie->bind_param('i', $rokOd);
$zapytanie->execute();
$wynik = $zapytanie->get_result();
$filmy = $wynik->fetch_all(MYSQLI_ASSOC);
foreach ($filmy as $film) {
echo h($film['tytul']) . ' — ' . (int) $film['rok'] . '<br>';
}
- execute uruchamia SELECT, get_result daje obiekt wyniku (wymagany mysqlnd), fetch_all daje tablicę wszystkich wierszy.
- MYSQLI_ASSOC oznacza klucze nazwane według kolumn:
$film["tytul"]i$film["rok"]. fetch_assoc zamiast wszystkich odczytuje następny pojedynczy wiersz. - foreach odwiedza kolejne wiersze. Przy braku wyników tablica jest pusta, więc osobno pokaż np. if($filmy === []) echo "Brak filmów".
- h() to nasza funkcja wywołująca htmlspecialchars: koduje znaki przy wypisywaniu do HTML.
(int)jawnie zamienia rok na liczbę całkowitą.<br>w odpowiedzi HTML przełamuje wiersz.
Jak czytać pozostałe zapisy w pełnym przykładzie
| Zapis | Znaczenie | Przykład użycia |
|---|---|---|
pole($dane, $nazwa) | Nasza funkcja: pobiera wskazany klucz tylko wtedy, gdy ma wartość string; inaczej oddaje pusty napis. isset sprawdza obecność i brak null, is_string typ. | pole($_POST, "email") |
dirname(__DIR__) | dirname daje katalog nadrzędny; __DIR__ to katalog bieżącego pliku. W public prowadzi to do katalogu projektu, a dopisana ścieżka wskazuje src. | dirname(__DIR__)."/src/bootstrap.php" |
-> oraz :: | -> wybiera właściwość lub metodę obiektu; :: odnosi się do elementu statycznego klasy. To nie jest zapis dostępu do tablicy. | $zapytanie->execute(); |
Sprawdź w działaniu
Z wierszy bazy zbuduj stronę — sprawdź w modelu
Model w przeglądarce wyjaśnia mechanizm na fikcyjnych danych. Nie wykonuje PHP ani zapytań SQL i nie tworzy kont. Prawdziwe skrypty uruchomisz lokalnie z paczki.
Przewidź rezultat, wykonaj próbę i wyjaśnij, która decyzja po stronie serwera decyduje o wyniku.
Uruchom krok po kroku
Otwórz index.php, znajdź Podróż, następnie wpisz tytuł, którego nie ma. Porównaj przygotowane zapytanie, tablicę filmy i pętlę HTML. Dopisz we własnym rekordzie tekst <script> i potwierdź, że na stronie jest widoczny jako tekst, a nie wykonywany kod.
SELECT i bezpieczne generowanie kart
<?php
require_once dirname(__DIR__).'/src/db.php';
$szukaj = trim(pole($_GET, 'szukaj'));
if (mb_strlen($szukaj) > 100) {
http_response_code(422);
exit('Wpisz do 100 znaków.');
}
$wzorzec = '%'.$szukaj.'%';
$zapytanie = $polaczenie->prepare('SELECT id, tytul, rok, gatunek, cena_grosze FROM Filmy WHERE tytul LIKE ? ORDER BY rok DESC, id');
$zapytanie->bind_param('s', $wzorzec);
$zapytanie->execute();
$filmy = $zapytanie->get_result()->fetch_all(MYSQLI_ASSOC);
Pobierz i odtwórz projekt
W „Źródłach i materiałach” na końcu pobierz KINO / LAB.zip. Rozpakuj całość; instrukcja START.txt opisuje konfigurację. Pierwsze 6 przykładów w public/podstawy działa bez bazy. Dalsze wymagają lokalnej MariaDB 11.4, importu schema.sql i lokalnego konta bazy z minimalnymi prawami. Gotowa paczka pokazuje całość, ale w tej lekcji wykonaj opisane kroki i własne zadanie.
Ćwiczenie z pomocą · samodzielna praca
Twoja próba — podpowiedzi otwieraj po kolei
Dodaj filtr gatunku z trzema dozwolonymi wartościami i pustą opcją Wszystkie.
Poprawne dane dają właściwe rekordy, nieznany gatunek odrzucony, pusty wynik ma komunikat.
? Potrzebujesz pomocy? Rozwiązuj krok po kroku.
Krok 1 — pokaż podpowiedź
Odszukaj wskazany plik i zapisz przewidywany rezultat przed zmianą.
Krok 2 — pokaż podpowiedź
Zmień jedną rzecz. Sprawdź metodę żądania, dane i odpowiedź lub wynik programu.
Krok 3 — pokaż podpowiedź
Wykonaj próbę graniczną lub błędną. Porównaj także stan bazy lub sesji, nie tylko komunikat.
Otwórz tylko tyle podpowiedzi, ile potrzebujesz. Po każdym kroku wróć do zadania i sprawdź wynik.
Podsumowanie
Co warto zapamiętać
- Pobierzesz rekordy, obsłużysz pusty wynik i bezpiecznie wyświetlisz tekst na stronie.
- Potrafisz wskazać w kodzie przyczynę wyniku i zaplanować próbę błędnych danych.
- Nie oddajesz haseł, pliku config.local.php ani wartości cookie.
Dalej na swoim koncie
Rozgrzewki, quiz i zadania są w biurku ucznia.
Teoria jest otwarta dla wszystkich. Żeby rozwiązywać zadania, zapisywać szkice i widzieć swój postęp, zaloguj się.
Zaloguj się →