filter_has_var()
Découvrez la fonction PHP filter_has_var() : syntaxe, constantes de source d'entrée, différences avec isset() et pièges courants.
filter_has_var() vérifie si une variable provenant d'une source d'entrée spécifique (GET, POST, cookies, serveur ou environnement) existe. Cette page couvre sa syntaxe, les constantes de source d'entrée, ses différences avec isset(), et les pièges courants.
Ce que fait filter_has_var()
filter_has_var() répond à une seule question : cette source d'entrée a-t-elle réellement envoyé une variable avec ce nom ? Elle retourne true ou false.
Elle ne lit pas la valeur, ne la désinfecte pas et ne la valide pas — pour cela, vous utiliserez filter_input() ou filter_var(). Pensez à filter_has_var() comme une vérification de présence qui examine le flux d'entrée original plutôt que les superglobales $_GET / $_POST, que votre code a pu modifier au moment de l'exécution.
Syntaxe
filter_has_var(int $input_type, string $var_name): bool| Paramètre | Description |
|---|---|
$input_type | La source d'entrée dans laquelle chercher. L'une des constantes INPUT_* ci-dessous. |
$var_name | Le nom de la variable à vérifier. |
Elle retourne true si une variable nommée $var_name est présente dans la source d'entrée donnée, et false sinon.
Constantes de source d'entrée
| Constante | Source |
|---|---|
INPUT_GET | Paramètres de la chaîne de requête ($_GET) |
INPUT_POST | Corps du formulaire ($_POST) |
INPUT_COOKIE | Cookies de la requête ($_COOKIE) |
INPUT_SERVER | Variables serveur ($_SERVER) |
INPUT_ENV | Variables d'environnement ($_ENV) |
Attention :
INPUT_REQUESTetINPUT_SESSIONsont définis comme constantes mais ne sont pas implémentés. Les passer retourne toujoursfalse. Utilisez explicitementINPUT_GET/INPUT_POSTà la place.
Exemple de base
Imaginez une requête comme [email protected]. Vous pouvez vérifier quelles variables de la chaîne de requête ont été envoyées :
<?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 sentRésultat (lorsque cette requête est réellement envoyée au serveur) :
bool(true)
bool(false)Important :
filter_has_var()inspecte les données que PHP a capturées au début de la requête, et non le contenu actuel des superglobales$_GET/$_POST. Une affectation à$_GETplus tard dans votre script ne change pas ce quefilter_has_var()voit. Cela signifie également qu'elle retournefalsepour tout lorsque PHP s'exécute depuis la ligne de commande, car il n'y a pas de requête HTTP à lire.
Valider qu'un champ a été soumis
L'utilisation la plus courante est la protection du traitement des formulaires : confirmer qu'un champ existe avant d'essayer de le valider. Ici, filter_has_var() distingue « le champ est manquant » de « le champ est présent mais invalide ».
<?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.';
}Si le champ email n'apparaît jamais dans le corps POST, vous entrez dans la branche « manquant ». S'il apparaît mais est mal formé, filter_input() retourne false et vous entrez dans la branche « invalide ».
filter_has_var() vs. isset()
Les gens se demandent souvent pourquoi ne pas simplement utiliser isset($_POST['email']). Ces fonctions se recoupent, mais il existe deux vraies différences :
- Source de vérité.
isset($_POST['x'])lit le tableau$_POST, que votre application a peut-être désassigné ou écrasé.filter_has_var()examine les données de la requête originale capturées par PHP, ce qui la rend plus difficile à tromper. - Les valeurs vides comptent quand même comme « présentes ». Une valeur soumise vide (
newsletter=) existe, doncfilter_has_var()retournetrue. Si vous avez besoin de « présent et non vide », vérifiez la valeur avecempty():
<?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 emptyRésultat :
bool(true)
bool(true)Ainsi, filter_has_var() confirme la présence ; associez-la à empty() lorsqu'une chaîne vide doit être traitée comme « non fournie ».
Pourquoi l'utiliser
- Intention claire. Elle documente qu'un chemin de code dépend d'une source d'entrée spécifique, et pas seulement de ce qui se trouve dans une superglobale.
- Gardes plus sûres. Lire le flux d'entrée brut évite les faux positifs provenant de variables que votre propre code a ajoutées au moment de l'exécution.
- Validation composable. Séparer la vérification de présence (
filter_has_var()) de la vérification de valeur (filter_input()/filter_var()) maintient la logique de validation modulaire et facile à lire, ce qui réduit le risque d'accepter une entrée inattendue pouvant mener à des problèmes comme l'injection SQL ou les XSS.
Conclusion
filter_has_var() est une vérification de présence ciblée pour les entrées de requête : elle vous indique si une variable INPUT_GET, INPUT_POST, INPUT_COOKIE, INPUT_SERVER ou INPUT_ENV a été envoyée, et rien de plus. Combinez-la avec filter_input() ou filter_var() pour valider la valeur, et avec empty() lorsqu'une valeur vide doit être considérée comme manquante.