Menu

PHP $_GET und $_POST: Query-Strings und Formulardaten

$_GET enthält den Query-String der URL (?page=2 ergibt $_GET['page']), und $_POST enthält die Felder eines Formulars, das mit method="post" gesendet wurde. Hier: beide sicher lesen, Links mit http_build_query bauen, $_SERVER['REQUEST_METHOD'] prüfen und zwischen GET und POST wählen.

Diese Seite enthält ausführbare Editoren - bearbeiten, ausführen und Ausgabe sofort sehen.

$_GET ist ein Array aus dem Query-String der URL, also ergibt article.php?id=42&lang=en die Werte $_GET['id'] === '42' und $_GET['lang'] === 'en'. $_POST ist ein Array aus den Feldern eines Formulars, das mit method="post" gesendet wurde. Lies beide mit einem Standardwert, $_GET['id'] ?? null, denn der Schlüssel fehlt, wann immer der Parameter fehlt.

Führe den Block aus und klicke dann auf die Links: Jeder Klick führt das Skript erneut aus, mit $_GET aus dem Query-String des Links.

$_GET['lang'] ist das, was in der URL steht, nicht nur die drei Links, die du ausgegeben hast. Jeder kann ?lang=<script> in die Adressleiste tippen, und deshalb schlägt der Block den Wert in $languages nach, statt ihn auszugeben, und escapt die eine Stelle, an der er Request-Daten ausgibt.

Eine Zahl aus dem Query-String lesen

Jeder Wert in $_GET ist ein String. Für eine Seitennummer validierst und wandelst du in einem Schritt mit filter_var() um und fällst auf einen Standardwert zurück, wenn der Wert fehlt, keine Zahl ist oder außerhalb des Bereichs liegt. Klick dich durch die Seiten und probier dann die Links Page 999 und Page abc.

filter_var() liefert die Ganzzahl 3 für "3" und für jeden anderen String die Option default, also ist $page immer ein brauchbarer int. Die Seite zu filter_var listet die anderen Validatoren auf.

Formulardaten mit $_POST lesen

Ein Formular mit method="post" sendet seine Felder im Request-Body, und PHP legt sie unter dem name jedes Eingabefelds in $_POST ab. $_SERVER['REQUEST_METHOD'] sagt dir, ob die aktuelle Anfrage der erste Besuch (GET) oder ein Absenden (POST) ist. Füll das Formular aus und klicke auf Send, um beides zu sehen.

Ein leeres Textfeld wird trotzdem gesendet, als "", also existiert $_POST['title'] nach einem Absenden, selbst wenn der Besucher nichts getippt hat. Auf einem Server ist REQUEST_METHOD immer gesetzt; das ?? 'GET' hält das Skript nur ruhig, wenn du die Datei mit php auf der Kommandozeile ausführst. Das vollständige Muster zum Validieren und erneuten Anzeigen eines Formulars steht auf der Seite zu Formularen.

Ein Suchformular mit method="get"

Verwende GET für ein Formular, dessen Ergebnis eine teilbare URL sein soll, etwa ein Suchfeld. Der Browser macht aus den Feldern einen Query-String (?q=sort&level=beginner), und das Skript liest sie aus $_GET, genau wie bei einem Link. Such nach array oder string.

"?q=$q&page=2" von Hand zu schreiben geht kaputt, sobald $q ein Leerzeichen, & oder # enthält. http_build_query() kodiert jeden Wert für dich, und das Ergebnis läuft durch htmlspecialchars(), wenn es in einem href landet, denn & sollte in HTML &amp; sein.

parse_str() mit zwei Argumenten ist der Weg, wie PHP $_GET aus einem Query-String baut, und ist damit praktisch zum Testen. Übergib immer das zweite Argument; die alte Form mit einem Argument, die Variablen erzeugt hat, wurde in PHP 8 entfernt.

$_REQUEST und warum du es meiden solltest

$_REQUEST ist $_GET und $_POST zu einem Array zusammengeführt. Die php.ini-Dateien, die PHP mitliefert, setzen request_order = "GP", also gewinnt POST, wenn beide denselben Schlüssel enthalten; ohne diese Einstellung werden auch Cookies hineingemischt:

<?php
// POST /save.php?id=1 with a form field id=2
echo $_GET['id'];      // "1"
echo $_POST['id'];     // "2"
echo $_REQUEST['id'];  // "2"

Es wirkt bequem, versteckt aber, woher ein Wert kam. Ein Handler, der bei $_REQUEST['id'] einen Datensatz löscht, lässt sich durch einen einfachen Link auslösen, und genau das sollen Aktionen nur über POST verhindern. Lies stattdessen $_GET oder $_POST beim Namen.

GET vs POST: was du verwenden solltest

GETPOST
Wo die Daten reisenIn der URL: ?q=php&page=2Im Request-Body
Lesen mit$_GET$_POST
Lesezeichen, Teilen, Zurück-ButtonJaNein (der Browser fragt, ob er erneut senden soll)
LängeBegrenzt durch die URL (ein paar tausend Zeichen sind sicher)Begrenzt durch post_max_size (standardmäßig 8M)
Datei-UploadsNeinJa, mit enctype="multipart/form-data" (lies $_FILES)
Verwenden fürSuche, Filter, Sortierung, SeitenaufteilungAnmelden, Registrieren, Speichern, Löschen, Zahlungen

Die Regel, die zählt: Eine GET-Anfrage darf nichts ändern. Browser laden Links vorab, Crawler folgen ihnen, und Leute teilen sie, also wird einem Link ?delete=5 irgendwann etwas folgen, das nichts löschen sollte. Keine der beiden Methoden ist für sich verschlüsselt: HTTPS schützt beide, und POST hält die Daten nur aus der URL, dem Browserverlauf und den Server-Logs heraus.

Häufig gestellte Fragen

Wie bekomme ich in PHP einen Parameter aus der URL?

Lies ihn mit einem Standardwert aus $_GET: Bei page.php?id=42 ergibt $id = $_GET['id'] ?? null; den String "42". Jeder Wert ist ein String (oder ein Array bei id[]=), also wandelst du ihn um und validierst ihn, zum Beispiel mit filter_var($id, FILTER_VALIDATE_INT).

Was ist der Unterschied zwischen $_GET und $_POST?

$_GET kommt aus dem Query-String der URL, ist also sichtbar, als Lesezeichen speicherbar und in der Länge begrenzt; verwende es für Suchen, Filter und Seiten. $_POST kommt aus dem Request-Body eines Formulars mit method="post"; verwende es für alles, was Daten ändert, etwa Speichern, Kaufen oder Anmelden.

Wie prüfe ich in PHP, ob ein GET-Parameter existiert?

Mit isset($_GET['q']), das falsch ist, wenn der Schlüssel fehlt oder null ist. Um auch einen leeren Wert (?q=) als fehlend zu behandeln, vergleichst du den getrimmten Wert: trim($_GET['q'] ?? '') !== ''.

Sollte ich in PHP $_REQUEST verwenden?

Meistens nicht. $_REQUEST führt $_GET und $_POST zusammen (und je nach request_order auch Cookies), also kannst du nicht erkennen, woher ein Wert kam, und ein Link kann einen Wert liefern, den du aus einem Formular erwartet hast. Lies $_GET oder $_POST ausdrücklich.

Wie prüfe ich in PHP, ob eine Anfrage GET oder POST ist?

Vergleiche $_SERVER['REQUEST_METHOD']: if ($_SERVER['REQUEST_METHOD'] === 'POST') { ... }. Das ist zuverlässiger als isset($_POST['submit']), das scheitert, wenn der Button kein name hat oder das Formular von JavaScript oder einem anderen Skript ohne dieses Feld gesendet wird.

Illustration der Programmiersprachen bei Coddy

Lerne mit Coddy zu programmieren

LOS GEHT'S