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.

💡 Query string w praktyce: Wyszukiwarki, filtry w sklepach, stronicowanie — to wszystko używa GET. Adres 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.

⚠️ GET i bezpieczeństwo: Dane z GET są widoczne w URL, logach serwera i historii przeglądarki. Nigdy nie wysyłaj przez GET haseł, numerów kart kredytowych ani innych wrażliwych danych.

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?

Kiedy należy użyć metody POST zamiast GET?

Jak bezpiecznie wyświetlić wartość $_GET['szukaj'] w PHP?

Ć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