Attenzione nell'uso di empty() http://de2.php.net/manual/it/function.empty.php
Nel controllo dell'array post si va facilmente in errore perché il protocollo http non passa tutto.
In particolare: una input text con value vuoto viene passato effettivamente come valore vuoto ( esistente ma vuoto ) una checkbox o radiobutton non verificato non passa proprio, cioè si comporta come se la variabile non esiste.
In un array di campi ( text, button, checkbox, ecc. ) vale sempre il campo ( o i campi ) valorizzato quindi se:
Codice HTML:
<input type="text" name="campo[]" value="">
<input type="text" name="campo[]" value="">
<input type="text" name="campo[]" value="">
<input type="text" name="campo[]" value="">
<input type="text" name="campo[]" value="">
<input type="text" name="campo[]" value="">
e riempite solo il secondo e l'ultimo campo, l'array risultante sarà comunque $_POST['campo'][0] e $_POST['campo'][1] perché sono gli unici valorizzati.
E non come si può pensare un array di 6 valori di cui solo due valorizzati.
Nel tuo caso, come si legge nel manuale del PHP ciò che fai non viene verificato:
Codice PHP:
if (isset($_POST['cognome']) && !empty($_POST['cognome'])) { ... }
perché se $_POST['cognome'] è uguale a un valore vuoto il primo caso viene verificato ( isset() è verificato comunque ) ma poi deve essere verificato pure empty(), ma in questo caso empty è vero in quanto per una variabile vuota empty() risponde true ( sì, la variabile è vuota! ). Quindi non passa perché isset( true) AND !empty(true).
La via migliore per la verifica? Prova con i filtri il cui risultato sarà sempre FALSE o il valore cercato.
Nel tuo caso se vuoi verificare se cognome esiste ed è conforme a quanto richiesto:
Codice PHP:
function verificaNome( $valore ) {
$options = array ( 'flags' => array( 'FILTER_FLAG_STRIP_LOW', 'FILTER_FLAG_STRIP_HIGH' ));
$valore = filter_var( $valore, FILTER_SANITIZE_STRING, $options );
return ucwords( $valore );
} // verificaNome()
if ( filter_has_var( INPUT_POST, 'cognome' ) && filter_has_var( INPUT_POST, 'cognome' ) != '' ){
$cognome = filter_input( INPUT_POST, 'cognome', FILTER_CALLBACK, array('options' => array( 'options' => 'verificaNome' ));
}
Praticamente funziona così:
la selezione ( if ) verifica se la variabile esiste e se non è vuota, se validata ne controlla comunque la validità passandola alla funzione di callback che torna un valore con le iniziali maiuscole, ( che so se inserisci rossi, torna Rossi ) o false se sbagliato ( tipo: '1#@()]' ).
$cognome ha la forma di un array, quindi $cognome['cognome']. In genere uso una forma più complessa che mi torna un intero array nella forma $input['nomi dei campi controllati'].
Riferimenti:
http://de2.php.net/manual/en/function.filter-input.php