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"]

get-post.phpphp
<?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);
}
Wynik
ala@example.test
  1. W działającym formularzu zamiast $dane odczytasz $_POST. Klucz email pochodzi z atrybutu name="email".
  2. ?? "" zapobiega odczytowi brakującego klucza, ale samo nie gwarantuje typu. is_string sprawdza, czy wartość jest tekstem.
  3. trim usuwa białe znaki z początku i końca tekstu; nie usuwa spacji w środku. Nie stosuj go do haseł.
  4. 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

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")
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.

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 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

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

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

  1. Odbierzesz dane GET i POST bez mylenia ich z zaufanymi wartościami PHP.
  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