filter_has_var()
Erfahren Sie, wie die PHP-Funktion filter_has_var() funktioniert, welche Syntax sie hat und wie sie sich von isset() unterscheidet.
filter_has_var() prüft, ob eine Variable aus einer bestimmten Eingabequelle (GET, POST, Cookies, dem Server oder der Umgebung) vorhanden ist. Diese Seite behandelt die Syntax, die Eingabequellen-Konstanten, den Unterschied zu isset() und häufige Stolperfallen.
Was filter_has_var() tut
filter_has_var() beantwortet eine einzige Frage: Hat diese Eingabequelle tatsächlich eine Variable mit diesem Namen gesendet? Es gibt true oder false zurück.
Es liest den Wert nicht aus, bereinigt ihn nicht und validiert ihn nicht — dafür verwendet man filter_input() oder filter_var(). Betrachten Sie filter_has_var() als eine Präsenzprüfung, die auf den ursprünglichen Eingabestrom schaut und nicht auf die Superglobalen $_GET / $_POST, die Ihr Code zur Laufzeit möglicherweise verändert hat.
Syntax
filter_has_var(int $input_type, string $var_name): bool| Parameter | Beschreibung |
|---|---|
$input_type | Die zu durchsuchende Eingabequelle. Eine der INPUT_*-Konstanten unten. |
$var_name | Der Name der zu prüfenden Variable. |
Gibt true zurück, wenn eine Variable namens $var_name in der angegebenen Eingabequelle vorhanden ist, andernfalls false.
Eingabequellen-Konstanten
| Konstante | Quelle |
|---|---|
INPUT_GET | Query-String-Parameter ($_GET) |
INPUT_POST | Formulardaten ($_POST) |
INPUT_COOKIE | Request-Cookies ($_COOKIE) |
INPUT_SERVER | Server-Variablen ($_SERVER) |
INPUT_ENV | Umgebungsvariablen ($_ENV) |
Achtung:
INPUT_REQUESTundINPUT_SESSIONsind als Konstanten definiert, aber nicht implementiert. Die Übergabe dieser Konstanten gibt immerfalsezurück. Verwenden Sie stattdessen explizitINPUT_GET/INPUT_POST.
Einfaches Beispiel
Stellen Sie sich eine Anfrage wie [email protected] vor. Sie können prüfen, welche Query-String-Variablen gesendet wurden:
<?php
// Given the query string: [email protected]
var_dump(filter_has_var(INPUT_GET, 'email')); // bool(true) — sent
var_dump(filter_has_var(INPUT_GET, 'username')); // bool(false) — not sentAusgabe (wenn diese Anfrage tatsächlich an den Server gestellt wird):
bool(true)
bool(false)Wichtig:
filter_has_var()untersucht die Daten, die PHP zu Beginn der Anfrage erfasst hat, nicht den aktuellen Inhalt der Superglobalen$_GET/$_POST. Eine spätere Zuweisung an$_GETin Ihrem Skript ändert nicht, wasfilter_has_var()sieht. Das bedeutet auch, dass es für allesfalsezurückgibt, wenn PHP von der Befehlszeile aus ausgeführt wird, da es keine HTTP-Anfrage zum Lesen gibt.
Validieren, ob ein Feld übermittelt wurde
Die häufigste Verwendung ist die Absicherung der Formularverarbeitung: Prüfen Sie, ob das Feld vorhanden ist, bevor Sie es validieren. Hier unterscheidet filter_has_var() zwischen „das Feld fehlt" und „das Feld ist vorhanden, aber ungültig".
<?php
if (filter_has_var(INPUT_POST, 'email')) {
$email = filter_input(INPUT_POST, 'email', FILTER_VALIDATE_EMAIL);
if ($email !== false && $email !== null) {
echo "Valid email: $email";
} else {
echo 'Invalid email address.';
}
} else {
echo 'Email field is missing.';
}Wenn das Feld email nie im POST-Körper erscheint, wird der „fehlend"-Zweig ausgeführt. Wenn es erscheint, aber falsch formatiert ist, gibt filter_input() false zurück und der „ungültig"-Zweig wird ausgeführt.
filter_has_var() vs. isset()
Oft fragt man sich, warum man nicht einfach isset($_POST['email']) verwenden sollte. Beide überschneiden sich, aber es gibt zwei wesentliche Unterschiede:
- Wahrheitsquelle.
isset($_POST['x'])liest das$_POST-Array, das Ihre Anwendung möglicherweise mitunsetentfernt oder überschrieben hat.filter_has_var()schaut auf die ursprünglichen Anfragedaten, die PHP erfasst hat, und ist daher schwerer zu täuschen. - Leere Werte zählen als „vorhanden". Ein übermittelter leerer Wert (
newsletter=) ist vorhanden, daher gibtfilter_has_var()truezurück. Wenn Sie „vorhanden und nicht leer" benötigen, prüfen Sie den Wert mitempty():
<?php
// Simulate a present-but-empty submitted field.
$_GET['newsletter'] = '';
var_dump(isset($_GET['newsletter'])); // bool(true) — the key exists
var_dump(empty($_GET['newsletter'])); // bool(true) — but the value is emptyAusgabe:
bool(true)
bool(true)filter_has_var() bestätigt also die Präsenz; kombinieren Sie es mit empty(), wenn ein leerer string als „nicht angegeben" behandelt werden soll.
Warum es verwenden
- Klare Absicht. Es dokumentiert, dass ein Code-Pfad von einer bestimmten Eingabequelle abhängt und nicht nur davon, was sich gerade in einer Superglobalen befindet.
- Sicherere Absicherungen. Das Lesen des rohen Eingabestroms vermeidet falsch-positive Ergebnisse durch Variablen, die Ihr eigener Code zur Laufzeit hinzugefügt hat.
- Komponierbare Validierung. Die Trennung der Präsenzprüfung (
filter_has_var()) von der Wertprüfung (filter_input()/filter_var()) hält die Validierungslogik modular und leicht lesbar, was wiederum die Wahrscheinlichkeit verringert, unerwartete Eingaben zu akzeptieren, die zu Problemen wie SQL-Injection oder XSS führen.
Fazit
filter_has_var() ist eine fokussierte Präsenzprüfung für Request-Eingaben: Es teilt Ihnen mit, ob eine INPUT_GET-, INPUT_POST-, INPUT_COOKIE-, INPUT_SERVER- oder INPUT_ENV-Variable gesendet wurde, und nichts weiter. Kombinieren Sie es mit filter_input() oder filter_var(), um den Wert zu validieren, und mit empty(), wenn ein leerer Wert als fehlend gewertet werden soll.