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)

select.phpphp
<?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>';
}
  1. execute uruchamia SELECT, get_result daje obiekt wyniku (wymagany mysqlnd), fetch_all daje tablicę wszystkich wierszy.
  2. MYSQLI_ASSOC oznacza klucze nazwane według kolumn: $film["tytul"] i $film["rok"]. fetch_assoc zamiast wszystkich odczytuje następny pojedynczy wiersz.
  3. foreach odwiedza kolejne wiersze. Przy braku wyników tablica jest pusta, więc osobno pokaż np. if($filmy === []) echo "Brak filmów".
  4. 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

ZapisZnaczeniePrzykł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.

Ta interakcja wymaga włączonego JavaScriptu.

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

public/index.phpphp
<?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.

Oczekiwany rezultat
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ć

  1. Pobierzesz rekordy, obsłużysz pusty wynik i bezpiecznie wyświetlisz tekst na stronie.
  2. Potrafisz wskazać w kodzie przyczynę wyniku i zaplanować próbę błędnych danych.
  3. 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ę →
Źródła i dalsza nauka