W3docs

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
ParameterBeschreibung
$input_typeDie zu durchsuchende Eingabequelle. Eine der INPUT_*-Konstanten unten.
$var_nameDer 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

KonstanteQuelle
INPUT_GETQuery-String-Parameter ($_GET)
INPUT_POSTFormulardaten ($_POST)
INPUT_COOKIERequest-Cookies ($_COOKIE)
INPUT_SERVERServer-Variablen ($_SERVER)
INPUT_ENVUmgebungsvariablen ($_ENV)

Achtung: INPUT_REQUEST und INPUT_SESSION sind als Konstanten definiert, aber nicht implementiert. Die Übergabe dieser Konstanten gibt immer false zurück. Verwenden Sie stattdessen explizit INPUT_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 sent

Ausgabe (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 $_GET in Ihrem Skript ändert nicht, was filter_has_var() sieht. Das bedeutet auch, dass es für alles false zurü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:

  1. Wahrheitsquelle. isset($_POST['x']) liest das $_POST-Array, das Ihre Anwendung möglicherweise mit unset entfernt oder überschrieben hat. filter_has_var() schaut auf die ursprünglichen Anfragedaten, die PHP erfasst hat, und ist daher schwerer zu täuschen.
  2. Leere Werte zählen als „vorhanden". Ein übermittelter leerer Wert (newsletter=) ist vorhanden, daher gibt filter_has_var() true zurück. Wenn Sie „vorhanden und nicht leer" benötigen, prüfen Sie den Wert mit empty():
<?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 empty

Ausgabe:

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.

Übungen

Übung
Was macht die PHP-Funktion filter_has_var()?
Was macht die PHP-Funktion filter_has_var()?
Was this page helpful?