GET i POST — jak przeglądarka wysyła dane
🎯 Po tej lekcji będziesz rozumieć różnicę między GET i POST, odczytasz dane z obu tablic i wyjaśnisz, dlaczego danych od użytkownika nie można ślepo ufać.
W poprzedniej lekcji nauczyłeś się wyświetlać dane w szablonach HTML. Teraz czas na pytanie: skąd te dane się biorą? Najczęstszym źródłem są formularze i linki — a PHP odbiera je przez dwie superglobalne tablice: $_GET i $_POST.
Superglobalne tablice
PHP udostępnia kilka superglobalnych tablic — zmiennych dostępnych w każdym miejscu skryptu, bez importowania. Dwie najważniejsze to:
$_GET— dane przesłane metodą GET (z URL)$_POST— dane przesłane metodą POST (z formularza)
Obie są zwykłymi tablicami asocjacyjnymi — możesz odczytać wartość przez klucz odpowiadający nazwie pola.
Metoda GET i query string
Gdy klikasz w link strona.php?imie=Ola&wiek=25, przeglądarka dodaje dane do adresu URL po znaku ?. To właśnie query string (łańcuch zapytania).
PHP umieszcza te dane w tablicy $_GET:
<?php
declare(strict_types=1);
// URL: skrypt.php?imie=Ola&wiek=25
$imie = $_GET['imie'] ?? '';
$wiek = $_GET['wiek'] ?? '';
echo htmlspecialchars($imie, ENT_QUOTES, 'UTF-8'); // wynik: Ola
echo htmlspecialchars($wiek, ENT_QUOTES, 'UTF-8'); // wynik: 25
Operator ?? (null coalescing) zwraca pustą wartość, gdy klucz nie istnieje w $_GET — zamiast generować ostrzeżenie PHP.
sklep.php?kategoria=buty&strona=2 da się przekleić, wpisać w zakładki i udostępnić znajomym.Metoda POST
POST wysyła dane w treści żądania HTTP — nie w URL. Formularz HTML z atrybutem method="post" używa właśnie tej metody:
<form method="post" action="skrypt.php">
<input type="text" name="wiadomosc">
<button type="submit">Wyślij</button>
</form>
Po wysłaniu formularza PHP odbiera dane w $_POST:
<?php
declare(strict_types=1);
// Dane z formularza (method="post")
$wiadomosc = $_POST['wiadomosc'] ?? '';
echo htmlspecialchars($wiadomosc, ENT_QUOTES, 'UTF-8');
GET czy POST? Prosta zasada
| Sytuacja | Metoda | |---|---| | Wyszukiwanie, filtrowanie, stronicowanie | GET | | Wyniki mają być zakładkowane / linkowane | GET | | Rejestracja, logowanie, wysłanie formularza | POST | | Usuwanie lub zmiana danych | POST | | Przesyłanie danych wrażliwych (hasło, email) | POST |
Krótka reguła: GET = bezpieczne pobieranie, POST = zmiana stanu. GET nie powinien mieć skutków ubocznych (nie zmienia danych), a POST nie powinien być powtarzany bezkarnie.
Dane od użytkownika nigdy nie są zaufane
To najważniejsza zasada bezpieczeństwa web:
<?php
declare(strict_types=1);
// NIGDY tak nie rób:
// echo $_GET['szukaj']; // atak XSS!
// echo $_POST['komentarz']; // atak XSS!
// ZAWSZE tak:
$szukaj = $_GET['szukaj'] ?? '';
$komentarz = $_POST['komentarz'] ?? '';
echo htmlspecialchars($szukaj, ENT_QUOTES, 'UTF-8');
echo htmlspecialchars($komentarz, ENT_QUOTES, 'UTF-8');
Użytkownik mógł wpisać <script>alert(1)</script> zamiast imienia. Przeglądarka wykonałaby ten skrypt — chyba że użyjesz htmlspecialchars. Zasada prosta: dane wejściowe = niezaufane, dane wyjściowe = zawsze escaped.
W następnej lekcji zbudujesz prawdziwy formularz — z obsługą, walidacją i bezpiecznym wyświetlaniem danych.
Sprawdź się
Gdzie trafiają dane wysłane metodą GET?
Metoda GET dołącza dane do URL w postaci query string: strona.php?imie=Ola&wiek=25. Są widoczne w pasku adresu i historii przeglądarki.
Kiedy należy użyć metody POST zamiast GET?
POST służy do operacji zmieniających stan (zapis danych, logowanie, wysłanie formularza). GET do bezpiecznego pobierania danych, które można zakładać bez skutków ubocznych.
Jak bezpiecznie wyświetlić wartość $_GET['szukaj'] w PHP?
Danych z $_GET nigdy nie wyświetlamy bezpośrednio — zawsze przez htmlspecialchars. W przeciwnym razie ryzykujemy atak XSS.
Ćwiczenie
Napisz skrypt PHP, który odczytuje parametr 'miasto' z query string (metoda GET) i wyświetla komunikat: 'Pogoda dla miasta: [miasto]'. Jeśli parametr nie istnieje, wyświetl: 'Nie podano miasta.'. Pamiętaj o htmlspecialchars!
Pokaż rozwiązanie
<?php
declare(strict_types=1);
$miasto = trim($_GET['miasto'] ?? '');
if ($miasto !== '') {
echo 'Pogoda dla miasta: ' . htmlspecialchars($miasto, ENT_QUOTES, 'UTF-8');
} else {
echo 'Nie podano miasta.';
}
// Wywołanie: skrypt.php?miasto=Warszawa
// wynik: Pogoda dla miasta: Warszawa