INF.03 · Aplikacje internetowe PHP
Formularze HTML i odbiór danych (GET, POST)
Formularz → żądanie → odpowiedź.
- PHP8.3
- mysqli · MariaDB
- Praktyka i diagnoza
Po tej lekcji: Odbierzesz dane GET i POST bez mylenia ich z zaufanymi wartościami PHP.
Zrozum mechanizm
Formularz wysyła pary name=value do action. GET pasuje do wyszukiwania i filtrów: parametry są częścią adresu. POST służy m.in. do przesyłania formularzy zmieniających stan. POST sam nie szyfruje — szyfrowanie transmisji zapewnia HTTPS. Nie przekazuj haseł przez GET.
$_GET i $_POST są tablicami. Kontroluj REQUEST_METHOD i sprawdzaj, czy spodziewana wartość naprawdę jest tekstem: napastnik może wysłać email[]=x. Funkcja pole() odrzuca taki kształt. Brak danych nie powinien kończyć się ostrzeżeniem Undefined array key. Token CSRF opisany przy formularzu jest sprawdzany na serwerze przed zmianą danych.
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.
name w HTML → klucz w $_POST
Najpierw zobacz sam przepływ danych. Formularz ma method i action; pole ma name, po którym serwer rozpoznaje wartość. id służy etykiecie i DOM, ale nie zastępuje name.
Podstawowa forma: <input name="email"> → $_POST["email"]
<?php
// Przykładowe dane, tak jak po wysłaniu formularza:
$dane = ['email' => 'ala@example.test'];
$email = $dane['email'] ?? '';
if (is_string($email)) {
echo trim($email);
}
ala@example.test
- W działającym formularzu zamiast
$daneodczytasz$_POST. Klucz email pochodzi z atrybutu name="email". -
?? ""zapobiega odczytowi brakującego klucza, ale samo nie gwarantuje typu. is_string sprawdza, czy wartość jest tekstem. - trim usuwa białe znaki z początku i końca tekstu; nie usuwa spacji w środku. Nie stosuj go do haseł.
- W pełnym pliku formularz.php
$_SERVER["REQUEST_METHOD"]określa metodę żądania, wymagajPost sprawdza POST i token, a pole bezpiecznie odczytuje tekst.
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") |
h($tekst) | Nasza funkcja kodująca tekst/atrybut HTML przez htmlspecialchars; nie wykonuje walidacji zakresu ani zabezpieczenia SQL. | h($film["tytul"]) |
wymagajPost() | Nasza funkcja: sprawdza metodę POST oraz CSRF; przy błędzie przerywa odpowiedź z405/403. | wymagajPost(); |
tokenFormularza() | Nasza funkcja zwraca HTML ukrytego pola csrf z wartością sesji zakodowaną przez h. | <?= tokenFormularza() ?> |
naglowek($tytul), stopka() | Nasze funkcje wypisujące wspólny HTML strony. void oznacza brak zwracanego wyniku do użycia w wyrażeniu. | naglowek("Katalog"); |
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" |
===, !==, &&, ||, ! | 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
Formularz → żądanie → odpowiedź — 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 formularz.php i podaj fikcyjny email oraz wiadomość. W Network odszukaj żądanie POST, zakładkę danych i odpowiedź. Następnie użyj wyszukiwarki index.php — porównaj parametry w URL i metodę GET. W treści odpowiedzi dane są kodowane przez h(), więc tekst z nawiasami HTML pozostaje tekstem.
Plik wzorcowy: public/formularz.php
<?php
require_once dirname(__DIR__).'/src/bootstrap.php';
$wynik = '';
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
wymagajPost();
$email = trim(pole($_POST, 'email'));
$wiadomosc = trim(pole($_POST, 'wiadomosc'));
if (! filter_var($email, FILTER_VALIDATE_EMAIL) || $wiadomosc === '' || mb_strlen($wiadomosc) > 500) {
http_response_code(422);
$wynik = 'Popraw email i wiadomość (1–500 znaków).';
} else {
$wynik = 'Odebrano od '.$email.': '.$wiadomosc;
}
}
naglowek('Odbierz i sprawdź formularz');
echo '<p>'.h($wynik).'</p>';
?>
<form method="post" action="/formularz.php">
<?= tokenFormularza() ?>
<label for="email">Email fikcyjny</label><input id="email" name="email" type="email" required>
<label for="wiadomosc">Wiadomość</label><textarea id="wiadomosc" name="wiadomosc" maxlength="500" required></textarea>
<button>Sprawdź dane</button>
</form>
<?php stopka();
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
Zbuduj formularz imienia i wiadomości przez POST. Sprawdź brak pól, pusty tekst oraz imię zawierające <b>.
Brak ostrzeżeń PHP; <b> nie staje się znacznikiem HTML w odpowiedzi.
? 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ć
- Odbierzesz dane GET i POST bez mylenia ich z zaufanymi wartościami PHP.
- 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ę →