Verifica di una stringa o di un nome proveniente da form

MarcoGrazia

Utente Attivo
15 Dic 2009
785
16
18
58
Udine
www.stilisticamente.com
Ciao, come spesso capita, bisogna verificare ed eventualmente validare quanto proviene da form, dato che non conosciamo la nostra utenza e il non farlo, potrebbe complicare l'esistenza stessa e l'integrità del nostro lavoro online.
Quindi qual'è il modo migliore per farlo? Automatizzare ovviamente; usiamo i computer mica per niente.

Quello che segue è una funzione che permette di verificare e validate una qualsiasi stringa di caratteri, sia un nome di persona, che una frase o una password ( infondo è una stringa ).

Prima di tutto le funzioni che useremo per callback ( si immagina uno script in PHP che utilizza i filtri per il controllo )
PHP:
/**
    *    Effettua il trimming dei dati passati alla funezione
    */
    function trimValue( &$value )
    {
        if ( !is_array( $value )) $value = trim( $value );
    }    //    trimValue()

/**
    *    Verifica una stringa per il tipo di caratteri passati
    *    Controlla che sia formata solo da lettere, maiuscole e minuscole, e numeri, tutti gli altri caratteri
    *    saranno riportati come encode
    */
    function verificaStringa( $valore )
    {
        $options = array ( 'flags' => array('FILTER_FLAG_ENCODE_LOW', 'FILTER_FLAG_ENCODE_HIGH'));
    return filter_var( $valore, FILTER_SANITIZE_STRING, $options ); 
    }    //    verificaStringa()

    /**
    *    Verifica un nome per il tipo di caratteri passati
    *    Come sopra, ma le iniziali delle parole saranno rese in maiuscolo.
    */
    function verificaNome( $valore )
    {
        $options = array ( 'flags' => array( 'FILTER_FLAG_ENCODE_LOW', 'FILTER_FLAG_ENCODE_HIGH' ));
        $valore = filter_var( $valore, FILTER_SANITIZE_STRING, $options );
        //  Verifica se sono installate le funzioni Multibyte, se no usa quelle normali.
        if ( function_exists( 'mb_convert_case' ) )
            return mb_convert_case($valore, MB_CASE_TITLE, 'UTF-8');
        else
            return ucwords( $valore );
    }    //    verificaNome()
Le funzioni di callback, dato che possono essere usate anche da altre pagine php, conviene sempre metterle in un file a parte.
Io uso un dile chiamato fantasiosamente genericFunction.inc.php :D

Si usano così:
PHP:
array_walk_recursive( $_POST, 'trimValue' );  //  Pulisce la POST da spazi bianchi non voluti, tabulazioni orizontali e/o verticali, prima della validazione.

//  Controllo se è stato premuto il tasto di invio, se sì, entro in validazione.
if ( filter_has_var( INPUT_POST, 'invio' ) && filter_has_var( INPUT_POST, 'invio' ) == 'salvami' )
{
    //  Se esiste la chiave invio in POST e se il suo valore è salvami, vuol dire che è stato premuto il tasto di invio sul form e sono arrivato qui.
    $options = [
       'nome' => ['filter' => FILTER_CALLBACK, 'options' => 'verificaNome'],
       'cognome' => ['filter' => FILTER_CALLBACK, 'options' => 'verificaNome'],
       'password' => ['filter' => FILTER_CALLBACK, 'options' => 'verificaStringa']
    ];
    $input = filter_input_array( INPUT_POST, $opt );
}
In pratica, per prima cosa effettuo il trimming di tutto ciò che sta nell'array POST, poi verifico se è stato premuto il tasto di invio sul form e se sì, entro in validazione.
Manco a dirlo, i nomi del campi dei vari elementi di input del form, beh, ognuno ci mette quelli che vuole, l'importante è riportarli nello script.
Quindi ogni campo richiama la sua funzione di CALLBACK e questa ritornerà o un valore vuoto, oppure una stringa con i caratteri passati se ritenuti validi.
Nel caso della verificaNome, i valori saranno ritornati in maiuscoletto, cioè con le iniziali in maiuscolo. E' solo un valore aggiunto.
Verifica anche se sono installate le funzioni Multi Byte, in quel caso usa quelle, più precise, soprattutto con lingue esoteriche, se non ci sono, usa la ucwords().