Verifica input utente di un numero intero

MarcoGrazia

Utente Attivo
15 Dic 2009
853
21
28
63
Udine
www.stilisticamente.com
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:
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;
    }
Spiegazione:
  • $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.
La funzione ritorna il valore intero se validato o null se no.
Se $min o $max sono nulli o uno dei due, non importa quale, dichiara il corrispondente range in $options da passare al filtro.
Filtri:
  1. FILTER_SANITIZE_NUMBER_INT sanitizza una stringa, eliminando tutti i caratteri tranne i numeri, il + e il -
  2. FILTER_VALIDATE_INT valida $valore passato dal filtro precedente e se valido lo converte in intero
  3. return: se valido ritorna il numero, se no null.
Come la si richiama:
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
 
  • Like
Reactions: WmbertSea

Discussioni simili