Ricevendo dati da un form è doveroso validare gli input ma farlo in modo quanto più sicuro possibile non è semplice; io da tempo utilizzo una classe in PHP che mi sono costruito negli anni e sembra funzionare bene, qui posto il metodo (ridotto a funzione) per verificare se un dato input è un numero intero, e possibilmente anche se è compreso tra un minimo e un massimo.
Il codice crudo:
Spiegazione:
Se $min o $max sono nulli o uno dei due, non importa quale, dichiara il corrispondente range in $options da passare al filtro.
Filtri:
Il codice crudo:
PHP:
function validateInt(mixed $valore, ?int $min = null, ?int $max = null): ?int
{
$options = ['options' => []];
if ($min !== null) {
$options['options']['min_range'] = $min;
}
if ($max !== null) {
$options['options']['max_range'] = $max;
}
$sanitize = filter_var($valore, FILTER_SANITIZE_NUMBER_INT);
$validato = filter_var( $sanitize, FILTER_VALIDATE_INT, $options );
return $validato === false ? null : $validato;
}
- $valore è il valore da passare per la verifica.
- $min è il valore intero minimo che $input può assumere;
- puoi utilizzare sia un numero intero negativo;
- opure null (predefinito) se non vuoi inserire un numero di controllo minimo.
- $max è ovviamente il valore intero massimo che $valore può assumere, valgono le stesse regole di $min.
Se $min o $max sono nulli o uno dei due, non importa quale, dichiara il corrispondente range in $options da passare al filtro.
Filtri:
- FILTER_SANITIZE_NUMBER_INT sanitizza una stringa, eliminando tutti i caratteri tranne i numeri, il + e il -
- FILTER_VALIDATE_INT valida $valore passato dal filtro precedente e se valido lo converte in intero
- return: se valido ritorna il numero, se no null.
PHP:
// In modo diretto:
if (validateInt(20)
{
echo 'Il numero passato è un intero';
}
else
{
echo 'Devi passare un intero per ...';
}
$risposta = validateInt(20, 5, 100); // Con un minimo e un massimo
$risposta = validateInt(20, -5); // Con un minimo negativo e nessun valore massimo
$risposta = validateInt(20, null, 100); // Senza un minimo ma con un massimo
// In callback se si vuole utilizzarla in un batch con chiamata ricorsiva per verificare una serie di numeri:
$input = [5, 20, 150, 'abc'];
$results = array_map('validateInt', $input); // L'ultimo valore darà per risposta null
// Tramite i filtri:
$_POST['eta' => '63'];
$eta = filter_input(INPUT_POST, 'eta', FILTER_CALLBACK, ['options' => 'validateInt']);
$options = [
'eta' => [
'filter' => FILTER_CALLBACK,
'options' => function( $valore ) {
return ValidateInt( $valore, null, null );
}
],
'altro' => [ .. ]
];
$eta = filter_input_array(INPUT_POST, $options);
// E chi più ne ha più ne metta