filter_var_array()
PHP offre una serie di funzioni integrate per filtrare e validare i dati di input. filter_var_array() applica filtri a più variabili contemporaneamente.
Introduzione
PHP offre una serie di funzioni integrate per filtrare e validare i dati di input dell'utente. Una di queste è filter_var_array(), che applica filtri a molte variabili contemporaneamente invece di chiamare filter_var() ripetutamente. È lo strumento principale per l'elaborazione pulita dei form: si descrivono le regole per ogni campo in un singolo array, si passa l'input grezzo e si ottiene un risultato completamente validato e sanificato.
Questo capitolo tratta la sintassi, i tre modi per definire i filtri, il comportamento del flag $add_empty, come leggere il valore restituito e le insidie comuni — con esempi eseguibili.
Sintassi
La sintassi di filter_var_array() è la seguente:
La sintassi PHP di filter_var_array()
filter_var_array ( array $data , mixed $definition [, bool $add_empty = true ] ) : mixed| Parametro | Significato |
|---|---|
$data | Un array associativo di valori di input da filtrare (ad esempio $_POST o $_GET). |
$definition | Come filtrare. Può essere una singola costante di filtro applicata a ogni valore, oppure un array che mappa ciascuna chiave al proprio filtro/opzioni. |
$add_empty | Se true (predefinito), le chiavi presenti in $definition ma assenti da $data vengono aggiunte al risultato con valore null. Se false, vengono saltate. |
La funzione restituisce l'array filtrato in caso di successo, o false in caso di errore (ad esempio, se $data non è un array).
I tre modi per definire i filtri
Il parametro $definition è il cuore di questa funzione. Può assumere tre forme.
1. Un filtro per ogni valore — si passa una singola costante di filtro:
<?php
$data = ['a' => '1', 'b' => 'not-a-number', 'c' => '42'];
$result = filter_var_array($data, FILTER_VALIDATE_INT);
print_r($result);Output — i valori che non superano il filtro diventano false:
Array
(
[a] => 1
[b] =>
[c] => 42
)2. Una mappa di filtri per chiave — si mappa ciascuna chiave al proprio filtro costante:
<?php
$data = [
'name' => ' John ',
'age' => '30',
'email' => '[email protected]',
];
$definition = [
'name' => FILTER_SANITIZE_FULL_SPECIAL_CHARS,
'age' => FILTER_VALIDATE_INT,
'email' => FILTER_VALIDATE_EMAIL,
];
print_r(filter_var_array($data, $definition));Array
(
[name] => John
[age] => 30
[email] => [email protected]
)3. Un array per chiave con filtro, flag e opzioni — per un controllo granulare, si mappa una chiave a un array che specifica il filter insieme a flags e options:
<?php
$data = ['age' => '150', 'tags' => ['php', 'mysql']];
$definition = [
'age' => [
'filter' => FILTER_VALIDATE_INT,
'options' => ['min_range' => 0, 'max_range' => 120],
],
'tags' => [
'filter' => FILTER_SANITIZE_FULL_SPECIAL_CHARS,
'flags' => FILTER_REQUIRE_ARRAY,
],
];
var_dump(filter_var_array($data, $definition));array(2) {
["age"]=>
bool(false)
["tags"]=>
array(2) {
[0]=>
string(3) "php"
[1]=>
string(5) "mysql"
}
}age è false perché 150 è fuori dall'intervallo 0–120, e FILTER_REQUIRE_ARRAY indica al filtro di trattare tags come un array e sanificare ogni elemento.
Utilizzo con l'input del form
Nel codice reale l'array $data è solitamente una superglobale come $_POST. La stessa definizione vista poc'anzi applica le regole e memorizza i valori puliti in $result:
Esempio di PHP filter_var_array()
<?php
$filters = [
'name' => FILTER_SANITIZE_FULL_SPECIAL_CHARS,
'age' => FILTER_VALIDATE_INT,
'email' => FILTER_VALIDATE_EMAIL,
];
// $add_empty = false skips keys missing from $_POST instead of adding them as null
$result = filter_var_array($_POST, $filters, false);
if ($result === false || $result['email'] === false) {
// Handle missing or invalid input
echo 'Please correct the form.';
} else {
// $result now holds clean, validated values
}Si noti che una validazione fallita produce false per quella chiave, mentre la funzione restituisce false complessivamente solo quando $data stesso non è valido. Ispezionare sempre entrambi. Per filtrare $_POST o $_GET direttamente dallo stream di input, si veda la funzione strettamente correlata filter_input_array().
Nota:
FILTER_SANITIZE_STRINGè stata rimossa in PHP 8.0. Utilizzare inveceFILTER_SANITIZE_FULL_SPECIAL_CHARS.
Vantaggi
L'utilizzo di filter_var_array() migliora la sicurezza e l'affidabilità dell'applicazione PHP elaborando molte variabili in un'unica chiamata. Validare l'input prima di ulteriori elaborazioni garantisce che l'applicazione accetti solo dati attesi, riducendo il rischio di injection e bug causati da dati malformati. Mantenere le regole in un array $definition dichiarativo separa inoltre la validazione dalla logica di business, rendendo gli script più modulari e facili da mantenere.
Conclusione
filter_var_array() è il modo efficiente per validare e sanificare un intero insieme di variabili in un'unica operazione. Scegliere la forma di definizione più adatta alle proprie esigenze — un filtro per tutti, una mappa per chiave, o array di opzioni per chiave — e controllare sempre false per ogni campo. Per approfondire, si legga il capitolo sulla panoramica dei filtri PHP e quello sulla validazione dei form PHP.