$_GET to tablica z query stringa adresu URL, więc article.php?id=42&lang=en daje $_GET['id'] === '42' i $_GET['lang'] === 'en'. $_POST to tablica pól formularza wysłanego z method="post". Oba odczytuj z wartością domyślną, $_GET['id'] ?? null, bo klucza brakuje zawsze, gdy brakuje parametru.
Uruchom blok, a potem klikaj linki: każde kliknięcie uruchamia skrypt ponownie z $_GET wypełnionym z query stringa linku.
$_GET['lang'] to cokolwiek mówi adres URL, a nie tylko trzy wypisane linki. Każdy może wpisać ?lang=<script> w pasek adresu, dlatego blok wyszukuje wartość w $languages zamiast jej wypisywać i escapuje jedyne miejsce, w którym wypisuje dane z żądania.
Odczyt liczby z query stringa
Każda wartość w $_GET to string. Dla numeru strony zwaliduj i przekonwertuj w jednym kroku przez filter_var(), a gdy wartości brakuje, nie jest liczbą albo jest poza zakresem, użyj wartości domyślnej. Przeklikaj strony, a potem spróbuj linków Page 999 i Page abc.
filter_var() zwraca liczbę całkowitą 3 dla "3" i opcję default dla każdego innego stringa, więc $page zawsze jest użytecznym intem. Pozostałe walidatory wymienia strona o filter_var.
Odczyt danych formularza przez $_POST
Formularz z method="post" wysyła pola w treści żądania, a PHP umieszcza je w $_POST pod name każdego pola. $_SERVER['REQUEST_METHOD'] mówi, czy bieżące żądanie to pierwsza wizyta (GET), czy wysłanie (POST). Wypełnij formularz i naciśnij Send, aby zobaczyć oba.
Puste pole tekstowe nadal jest wysyłane, jako "", więc po wysłaniu $_POST['title'] istnieje, nawet jeśli odwiedzający nic nie wpisał. Na serwerze REQUEST_METHOD jest zawsze ustawione; ?? 'GET' tylko ucisza skrypt, gdy uruchamiasz plik przez php w wierszu poleceń. Pełny wzorzec walidacji i ponownego wyświetlania formularza opisuje strona o formularzach.
Formularz wyszukiwania z method="get"
Używaj GET dla formularza, którego wynik ma być adresem URL do udostępnienia, jak pole wyszukiwania. Przeglądarka zamienia pola w query string (?q=sort&level=beginner), a skrypt odczytuje je z $_GET, dokładnie jak w przypadku linku. Wyszukaj array albo string.
Budowanie linków przez http_build_query
Ręczne pisanie "?q=$q&page=2" psuje się, gdy tylko $q zawiera spację, & albo #. http_build_query() koduje za ciebie każdą wartość, a wynik przechodzi przez htmlspecialchars(), gdy trafia do href, bo & w HTML powinno być &.
parse_str() z dwoma argumentami to sposób, w jaki PHP buduje $_GET z query stringa, więc przydaje się do testów. Zawsze przekazuj drugi argument; stara forma z jednym argumentem, która tworzyła zmienne, została usunięta w PHP 8.
$_REQUEST i dlaczego go unikać
$_REQUEST to $_GET i $_POST połączone w jedną tablicę. Pliki php.ini dostarczane z PHP ustawiają request_order = "GP", więc gdy oba zawierają ten sam klucz, wygrywa POST; bez tego ustawienia dołączane są też ciasteczka:
<?php
// POST /save.php?id=1 with a form field id=2
echo $_GET['id']; // "1"
echo $_POST['id']; // "2"
echo $_REQUEST['id']; // "2"
Wygląda to wygodnie, ale ukrywa pochodzenie wartości. Obsługa, która usuwa rekord na podstawie $_REQUEST['id'], może zostać uruchomiona zwykłym linkiem, a temu właśnie mają zapobiegać akcje dostępne tylko przez POST. Zamiast tego odczytuj $_GET albo $_POST po nazwie.
GET vs POST: którego użyć
| GET | POST | |
|---|---|---|
| Gdzie wędrują dane | W adresie URL: ?q=php&page=2 | W treści żądania |
| Odczytuj przez | $_GET | $_POST |
| Zakładka, udostępnianie, przycisk wstecz | Tak | Nie (przeglądarka pyta o ponowne wysłanie) |
| Długość | Ograniczona przez URL (kilka tysięcy znaków jest bezpieczne) | Ograniczona przez post_max_size (domyślnie 8M) |
| Przesyłanie plików | Nie | Tak, z enctype="multipart/form-data" (odczyt z $_FILES) |
| Używaj do | Wyszukiwania, filtrów, sortowania, stronicowania | Logowania, rejestracji, zapisywania, usuwania, płatności |
Zasada, która się liczy: żądanie GET nie może niczego zmieniać. Przeglądarki wczytują linki z wyprzedzeniem, roboty za nimi podążają, a ludzie je udostępniają, więc link ?delete=5 w końcu zostanie otwarty przez coś, co nie miało niczego usuwać. Żadna z metod sama w sobie nie jest szyfrowana: obie chroni HTTPS, a POST tylko trzyma dane poza adresem URL, historią przeglądarki i logami serwera.
Najczęściej zadawane pytania
Jak pobrać parametr z adresu URL w PHP?
Odczytaj go z $_GET z wartością domyślną: dla page.php?id=42 $id = $_GET['id'] ?? null; daje string "42". Każda wartość to string (albo tablica dla id[]=), więc ją przekonwertuj i zwaliduj, na przykład przez filter_var($id, FILTER_VALIDATE_INT).
Czym różni się $_GET od $_POST?
$_GET pochodzi z query stringa adresu URL, więc jest widoczne, można je zapisać w zakładce i ma ograniczoną długość; używaj go do wyszukiwania, filtrów i stron. $_POST pochodzi z treści żądania formularza wysłanego z method="post"; używaj go do wszystkiego, co zmienia dane, jak zapisywanie, zakupy czy logowanie.
Jak sprawdzić, czy parametr GET istnieje w PHP?
Użyj isset($_GET['q']), które daje fałsz, gdy klucza brakuje albo ma wartość null. Aby pustą wartość (?q=) też traktować jak brak, porównaj przyciętą wartość: trim($_GET['q'] ?? '') !== ''.
Czy używać $_REQUEST w PHP?
Zwykle nie. $_REQUEST łączy $_GET i $_POST (a zależnie od request_order także ciasteczka), więc nie wiesz, skąd pochodzi wartość, a link może dostarczyć wartość, której spodziewałeś się z formularza. Odczytuj jawnie $_GET albo $_POST.
Jak sprawdzić, czy żądanie to GET czy POST w PHP?
Porównaj $_SERVER['REQUEST_METHOD']: if ($_SERVER['REQUEST_METHOD'] === 'POST') { ... }. To pewniejsze niż isset($_POST['submit']), które zawodzi, gdy przycisk nie ma name albo gdy formularz wysyła JavaScript lub inny skrypt bez tego pola.