Wer Daten von einer Seite zur nächsten weiterleiten möchte, kann sie direkt in die URL schreiben. PHP stellt dafür die superglobale Variable $_GET bereit, die alle Parameter aus der URL als assoziatives Array enthält. Diese Methode kommt immer dann zum Einsatz, wenn Werte sichtbar in der Adresszeile stehen dürfen, zum Beispiel bei Suchbegriffen, Seitennummern oder Filtereinstellungen.
Aufbau einer URL mit Parametern
Parameter werden an die URL angehängt, getrennt durch ein Fragezeichen. Jeder Parameter besteht aus einem Schlüssel und einem Wert, verbunden durch ein Gleichheitszeichen. Mehrere Parameter werden mit & aneinandergereiht.
seite.php?name=Max&alter=30
seite.php?suche=php+tutorial&seite=2
In diesen Beispielen enthält die URL jeweils zwei Parameter. Die Reihenfolge spielt keine Rolle, da PHP die Zuordnung über den Schlüsselnamen vornimmt.
Werte aus $_GET auslesen
In der Zieldatei stehen die übergebenen Werte im Array $_GET zur Verfügung. Bevor ein Wert verwendet wird, sollte immer geprüft werden, ob der erwartete Schlüssel tatsächlich vorhanden ist. Andernfalls erzeugt PHP eine Warnung wegen eines undefinierten Array-Index.
<?php
if (isset($_GET['name'])) {
$name = $_GET['name'];
echo 'Hallo, ' . htmlspecialchars($name);
}
?>
Die Funktion htmlspecialchars() wandelt Sonderzeichen wie < und > in harmlose HTML-Entities um. Das ist wichtig, weil der Inhalt von $_GET direkt vom Benutzer manipuliert werden kann. Ohne diese Absicherung wäre die Seite anfällig für Cross-Site-Scripting (XSS).
Sonderzeichen in URLs mit urlencode()
Bestimmte Zeichen haben in URLs eine feste Bedeutung. Das Fragezeichen leitet die Parameter ein, das Gleichheitszeichen trennt Schlüssel von Wert, und das kaufmännische Und trennt Parameter voneinander. Wenn solche Zeichen im Wert selbst vorkommen, muss der Wert vorher kodiert werden.
<?php
$suchbegriff = 'PHP & MySQL';
$seite = 'ergebnisse.php?suche='
. urlencode($suchbegriff);
echo $seite;
/* Ausgabe: ergebnisse.php?suche=PHP+%26+MySQL */
?>
Die Funktion urlencode() ersetzt alle problematischen Zeichen durch ihre prozentkodierten Entsprechungen. Leerzeichen werden zu +, das &-Zeichen wird zu %26. Beim Auslesen über $_GET dekodiert PHP die Werte automatisch. Ein manueller Aufruf von urldecode() ist nicht nötig und würde sogar zu einer doppelten Dekodierung führen.
Praxisbeispiel: Einfache Suchfunktion
Ein typischer Anwendungsfall für $_GET ist eine Suchfunktion. Der Suchbegriff wird per Formular abgeschickt und landet als URL-Parameter auf der Ergebnisseite. So lässt sich das Suchergebnis als Link teilen oder als Lesezeichen speichern.
<?php
/* Suchformular (HTML) */
?>
<form method="get" action="suche.php">
<input type="text" name="q">
<button type="submit">Suchen</button>
</form>
<?php
/* suche.php: Ergebnisse anzeigen */
$suchbegriff = '';
if (isset($_GET['q']) && $_GET['q'] !== '') {
$suchbegriff = trim($_GET['q']);
echo '<p>Ergebnisse für: '
. htmlspecialchars($suchbegriff)
. '</p>';
}
?>
Das Formular verwendet method="get", wodurch der Browser die Eingabe automatisch als URL-Parameter anhängt. Die URL sieht dann zum Beispiel so aus: suche.php?q=php+arrays.
Praxisbeispiel: Pagination
Bei längeren Listen oder Suchergebnissen werden die Daten auf mehrere Seiten verteilt. Die aktuelle Seitennummer wird dabei über $_GET gesteuert.
<?php
$seite = 1;
if (isset($_GET['seite'])) {
$seite = (int) $_GET['seite'];
if ($seite < 1) {
$seite = 1;
}
}
$pro_seite = 20;
$offset = ($seite - 1) * $pro_seite;
echo 'Zeige Einträge ab Position '
. $offset;
/* Navigation ausgeben */
echo '<a href="?seite=' . ($seite - 1)
. '">Zurück</a> ';
echo '<a href="?seite=' . ($seite + 1)
. '">Weiter</a>';
?>
Durch den Cast auf (int) wird sichergestellt, dass nur ganzzahlige Werte in die Berechnung einfließen. Egal was ein Benutzer in die URL schreibt, das Script erhält immer eine gültige Zahl.
Eingaben sicher validieren mit filter_input()
Neben isset() und manuellen Casts bietet PHP mit filter_input() eine elegante Möglichkeit, GET-Parameter direkt beim Auslesen zu validieren und zu bereinigen.
<?php
/* Ganzzahl auslesen und validieren */
$id = filter_input(
INPUT_GET,
'id',
FILTER_VALIDATE_INT
);
if ($id === false || $id === null) {
echo 'Ungültige oder fehlende ID.';
} else {
echo 'Artikel-ID: ' . $id;
}
/* String bereinigen */
$name = filter_input(
INPUT_GET,
'name',
FILTER_SANITIZE_SPECIAL_CHARS
);
?>
FILTER_VALIDATE_INT gibt false zurück, wenn der Wert keine gültige Ganzzahl ist, und null, wenn der Parameter gar nicht existiert. FILTER_SANITIZE_SPECIAL_CHARS kodiert HTML-Sonderzeichen und schützt so vor XSS-Angriffen.
Sicherheitshinweise
GET-Parameter stehen sichtbar in der Adresszeile und werden in der Browser-History, in Server-Logs und in Referrer-Headern gespeichert. Daraus ergeben sich einige Regeln für den sicheren Umgang:
Passwörter, Session-Tokens und andere vertrauliche Daten gehören nie in die URL. Für solche Daten ist $_POST die richtige Wahl, weil POST-Daten nicht in der Adresszeile erscheinen.
Jeder Wert aus $_GET muss vor der Ausgabe im HTML mit htmlspecialchars() behandelt werden. Ohne diese Maßnahme kann ein Angreifer beliebigen JavaScript-Code in die Seite einschleusen.
Bei der Verwendung in Datenbankabfragen sollten ausschließlich Prepared Statements zum Einsatz kommen. Das direkte Einfügen von GET-Werten in SQL-Queries ermöglicht SQL-Injection-Angriffe.
Die URL-Länge ist technisch begrenzt. Die meisten Browser und Webserver akzeptieren URLs bis etwa 2000 Zeichen. Für größere Datenmengen sollte stattdessen $_POST verwendet werden.
$_GET und $_POST im Vergleich
$_GET eignet sich für alle Daten, die in der URL sichtbar sein dürfen: Suchbegriffe, Seitennummern, Filter, Sortieroptionen. Ein großer Vorteil ist, dass sich die URL als Lesezeichen speichern und per Link teilen lässt.
$_POST ist die bessere Wahl für Formulare, die Daten verändern (zum Beispiel Registrierung, Bestellung, Login) oder vertrauliche Informationen übertragen. POST-Daten erscheinen weder in der Adresszeile noch in der Browser-History.
Als Faustregel gilt: Aktionen, die nur Daten lesen, verwenden GET. Aktionen, die Daten schreiben oder verändern, verwenden POST.