filter_has_var()
Scopri la funzione PHP filter_has_var(): sintassi, costanti di input, differenze con isset() e casi d'uso pratici.
filter_has_var() verifica se una variabile proveniente da una specifica sorgente di input (GET, POST, cookie, server o ambiente) esiste. Questa pagina tratta la sintassi, le costanti per le sorgenti di input, le differenze rispetto a isset() e le insidie più comuni.
Cosa fa filter_has_var()
filter_has_var() risponde a una sola domanda: questa sorgente di input ha effettivamente inviato una variabile con questo nome? Restituisce true o false.
Non legge il valore, non lo sanitizza e non lo valida — per quelle operazioni si usano filter_input() o filter_var(). Pensa a filter_has_var() come a un controllo di presenza che esamina lo stream di input originale anziché i superglobali $_GET / $_POST, che il tuo codice potrebbe aver modificato in fase di esecuzione.
Sintassi
filter_has_var(int $input_type, string $var_name): bool| Parametro | Descrizione |
|---|---|
$input_type | La sorgente di input in cui cercare. Una delle costanti INPUT_* elencate di seguito. |
$var_name | Il nome della variabile da cercare. |
Restituisce true se una variabile di nome $var_name è presente nella sorgente di input specificata, false altrimenti.
Costanti per le sorgenti di input
| Costante | Sorgente |
|---|---|
INPUT_GET | Parametri della query string ($_GET) |
INPUT_POST | Corpo del form ($_POST) |
INPUT_COOKIE | Cookie della richiesta ($_COOKIE) |
INPUT_SERVER | Variabili del server ($_SERVER) |
INPUT_ENV | Variabili d'ambiente ($_ENV) |
Attenzione:
INPUT_REQUESTeINPUT_SESSIONsono definite come costanti ma non sono implementate. Passarle restituisce semprefalse. Usa esplicitamenteINPUT_GET/INPUT_POST.
Esempio di base
Considera una richiesta come [email protected]. Puoi verificare quali variabili della query string sono state inviate:
<?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 sentOutput (quando la richiesta viene effettivamente inviata al server):
bool(true)
bool(false)Importante:
filter_has_var()ispeziona i dati catturati da PHP all'inizio della richiesta, non il contenuto attuale dei superglobali$_GET/$_POST. Assegnare un valore a$_GETin seguito nel tuo script non cambia ciò chefilter_has_var()vede. Questo significa anche che restituiscefalseper tutto quando PHP viene eseguito da riga di comando, poiché non c'è alcuna richiesta HTTP da cui leggere.
Verificare che un campo sia stato inviato
L'uso più comune è proteggere la gestione dei form: confermare che il campo esista prima di tentare di validarlo. In questo caso filter_has_var() distingue tra "il campo è assente" e "il campo è presente ma non valido".
<?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.';
}Se il campo email non compare mai nel corpo POST, si entra nel ramo "mancante". Se compare ma è malformato, filter_input() restituisce false e si entra nel ramo "non valido".
filter_has_var() vs. isset()
Spesso ci si chiede perché non usare semplicemente isset($_POST['email']). Si sovrappongono, ma ci sono due differenze reali:
- Fonte di verità.
isset($_POST['x'])legge l'array$_POST, che l'applicazione potrebbe aver eliminato o sovrascritto.filter_has_var()esamina i dati originali della richiesta catturati da PHP, quindi è più difficile da ingannare. - I valori vuoti contano come "presenti". Un valore vuoto inviato (
newsletter=) esiste, quindifilter_has_var()restituiscetrue. Se hai bisogno di "presente e non vuoto", controlla il valore conempty():
<?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 emptyOutput:
bool(true)
bool(true)Quindi filter_has_var() conferma la presenza; abbinalo a empty() quando una stringa vuota deve essere trattata come "non fornita".
Perché usarla
- Intenzione chiara. Documenta che un percorso del codice dipende da una specifica sorgente di input, non semplicemente da ciò che si trova in un superglobale.
- Guardie più sicure. Leggere lo stream di input grezzo evita falsi positivi causati da variabili aggiunte dal proprio codice in fase di esecuzione.
- Validazione componibile. Separare il controllo di presenza (
filter_has_var()) dal controllo del valore (filter_input()/filter_var()) mantiene la logica di validazione modulare e facile da leggere, riducendo il rischio di accettare input imprevisti che possono portare a problemi come SQL injection o XSS.
Conclusione
filter_has_var() è un controllo di presenza mirato per l'input della richiesta: indica se una variabile INPUT_GET, INPUT_POST, INPUT_COOKIE, INPUT_SERVER o INPUT_ENV è stata inviata, e nulla di più. Combinala con filter_input() o filter_var() per validare il valore, e con empty() quando un valore vuoto deve essere considerato come assente.