INF.03 · Aplikacje internetowe PHP
Walidacja danych z formularza w PHP
Walidacja nie jest kosmetyką.
- PHP8.3
- mysqli · MariaDB
- Praktyka i diagnoza
Po tej lekcji: Sprawdzisz obecność, typ, format i zakres po stronie serwera oraz odróżnisz to od ochrony przed XSS i SQLi.
Zrozum mechanizm
Walidacja odpowiada: czy dane spełniają reguły? Najpierw sprawdź typ wejścia, potem usuń zewnętrzne spacje tam, gdzie to ma sens, następnie format i zakres. Nie przycinaj hasła przez trim. FILTER_VALIDATE_EMAIL sprawdza format, nie istnienie skrzynki. FILTER_VALIDATE_INT może zwrócić 0 albo false — porównuj przez === false. Empty uznaje tekst"0" za pusty, więc nie jest uniwersalną kontrolą liczby.
strlen() liczy bajty, mb_strlen() znaki. Kodowanie HTML przez h() chroni kontekst tekstu/atrybutu HTML, a nie zapytanie SQL. Parametryzacja SQL chroni granicę kodu zapytania i danych, lecz nie określa dozwolonego wieku czy ceny. To odrębne działania. Zwracaj 422 dla niepoprawnych danych oraz zrozumiały komunikat bez surowych szczegółów bazy.
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.
Walidacja: trzy osobne pytania
Czy wartość ma poprawny kształt, format i zakres? Na każdym etapie może odpaść z innego powodu.
Podstawowa forma: filter_var(wartosc, FILTER_VALIDATE_INT) → liczba albo false
<?php
$tekst = '0';
$ilosc = filter_var($tekst, FILTER_VALIDATE_INT);
if ($ilosc === false) {
echo 'To nie jest liczba całkowita';
} elseif ($ilosc < 1 || $ilosc > 10) {
echo 'Podaj od 1 do 10';
} else {
echo 'Poprawna ilość: ' . $ilosc;
}
Podaj od 1 do 10
- filter_var sprawdza tekst i przy sukcesie zwraca int. false oznacza porażkę.
-
=== falseodróżnia niepowodzenie od poprawnej liczby 0. Zapisif (!$ilosc)pomyliłby te sytuacje. - Liczba 0 ma poprawny format, ale w tym zadaniu nieprawidłowy zakres.
||odrzuca wartość za małą LUB za dużą. - W daneFilmu() wynik
return [$tytul, $rok, $gatunek, $cena]to tablica czterech sprawdzonych wartości. Przypisanie[$tytul, ...] = ...rozpakowuje ją w tej samej kolejności.
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") |
===, !==, &&, ||, ! | Identyczne, nieidentyczne, i, lub, zaprzeczenie. Porównanie ścisłe obejmuje typ; &&/|| nie sprawdzają drugiej części, gdy wynik jest już rozstrzygnięty. | $rok === false || $rok < 1888 |
Sprawdź w działaniu
Walidacja nie jest kosmetyką — 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
W formularz.php sprawdź pustą wiadomość, samą spację, wiadomość 501 znaków, poprawny komplet i email jako tablicę. Po stronie HTML pozostaw required/maxlength jako pomoc, ale wykonaj również bezpośrednie żądania pomijające przeglądarkową kontrolę. W src/dane-filmu.php porównaj walidację tekstu, liczby i listy dozwolonych gatunków.
Walidacja tekstu, liczby i listy dozwolonych wartości
<?php
function daneFilmu(array $dane): array
{
$tytul = trim(pole($dane, 'tytul'));
$rok = filter_var(pole($dane, 'rok'), FILTER_VALIDATE_INT);
$gatunek = pole($dane, 'gatunek');
$cena = filter_var(pole($dane, 'cena_grosze'), FILTER_VALIDATE_INT);
if ($tytul === '' || mb_strlen($tytul) > 100 || $rok === false || $rok < 1888 || $rok > 2100
|| ! in_array($gatunek, ['przygodowy', 'science fiction', 'familijny'], true)
|| $cena === false || $cena < 0 || $cena > 100000) {
http_response_code(422);
exit('Sprawdź tytuł, rok1888–2100, gatunek i cenę0–100000 groszy.');
}
return [$tytul, $rok, $gatunek, $cena];
}
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 walidację oceny całkowitej 1–10 i komentarza 1–500 znaków.
0,11 i 1.5 odrzucone;1 i 10 przyjęte; same spacje komentarza odrzucone.
? 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ć
- Sprawdzisz obecność, typ, format i zakres po stronie serwera oraz odróżnisz to od ochrony przed XSS i SQLi.
- 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ę →