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

walidacja.phpphp
<?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;
}
Wynik
Podaj od 1 do 10
  1. filter_var sprawdza tekst i przy sukcesie zwraca int. false oznacza porażkę.
  2. === false odróżnia niepowodzenie od poprawnej liczby 0. Zapis if (!$ilosc) pomyliłby te sytuacje.
  3. Liczba 0 ma poprawny format, ale w tym zadaniu nieprawidłowy zakres. || odrzuca wartość za małą LUB za dużą.
  4. 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

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")
===, !==, &&, ||, !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.

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

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

src/dane-filmu.phpphp
<?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.

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

  1. Sprawdzisz obecność, typ, format i zakres po stronie serwera oraz odróżnisz to od ochrony przed XSS i SQLi.
  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