Nella prima parte di questo articolo vi ho presentato come realizzare un form per effettuare, ad esempio, la registrazione ad un sito immettendo dei dati molto semplici quali nome, cognome, password etc. Vi ho, inoltre, mostrato come effettuare la validazione del form utilizzando sempre PHP e senza ricorrere a tecniche più sofisticate quali potrebbero essere quelle che fanno uso di javascript o ajax.
In questa seconda parte voglio mostrarvi come inserire i dati nel database e inviarne alcuni per e-mail.
Parto, innanzitutto, esaminando la struttura della tabella in cui andare ad archiviare e ad inserire i dati presi dal form. In questa prevedo i seguenti campi:
id, cognome, nome, mail, nickname, pwd, abilitato, data_inserimento, ultimo_accesso, ora_ultimo_accesso.
Qualche spiegazione. In grassetto ho evidenziato i campi che ho inserito nel form. Ho aggiunto oltre all’id ho aggiunto altri campi: il campo abilitato, che può servire per bloccare un utente, i campi di tipo data, per inserire la data quando l’utente si registra e quella di ultimo accesso (che aggiornerò con un file relativo al login, ricordo che sto simulando la situazione di registrazione ad un sito) che si traducono in una data e un’ora mediante i campi, rispettivamente, ultimo_accesso e ora_ultimo_accesso, forniscono qualche informazione in più che non guasta inserire e tenerne traccia. Osservo che la password non viene memorizzata in chiaro, ma viene codificata. Vi darò qualche dettaglio in più nella fase di descrizione dell’inserimento dei dati nel database.
Un esempio della tabella, che denominerò utenti, può essere dato in questa immagine:
Per poter effettuare l’inserimento dei dati nel database uso ancora una volta la variabile di invio ($_REQUEST[invia]==”Invia”) combinata al fatto che non ci siano errori, cioè la variabile $errore (come detto nella prima parte) uguale a 0. Per poter inserire i dati nella tabella uso l’istruzione include e il file che si occupa di inserire i dati nel database cioè insert_intodb.php.
Un esempio di questo file può essere rappresentato da questo codice:
< ?php include("include/config.php"); if ($errore == 0) { // Codificio la pwd $pwd_codificata=base64_encode($_REQUEST[pwd]); // Converto le prime lettere di cognome e nome in maiuscolo $_REQUEST[cognome]=ucfirst($_REQUEST[cognome]); $_REQUEST[nome]=ucfirst($_REQUEST[nome]); // Inserisco nel db i dati recuperati dal form $query_insert_utente="INSERT INTO utenti( cognome, nome, mail, nickname, pwd, abilitato, data_inserimento, ultimo_accesso, ora_ultimo_accesso ) VALUES ( '$_REQUEST[cognome]', '$_REQUEST[nome]', '$_REQUEST[mail]', '$_REQUEST[nick]', '$pwd_codificata', 'si', CURDATE(), CURDATE(), CURTIME() )"; $result_insert_utente=mysql_query($query_insert_utente) or die ("Non riesco ad eseguire la query $query_insert_utente"); } ?>
Come al solito includo il file di configurazione config.php, controllo che la variabile di errore, $errore, sia uguale a 0 e solo in questo caso effettuo l’inserimento dei dati nel DB. Come detto in precedenza la password viene codificata tramite l’istruzione
$pwd_codificata=base64_encode($_REQUEST[pwd]);
che effettua la codifica della stringa della password( memorizzata nella variabile $_REQUEST[pwd]) con una codifica di tipo MIME base64.
Un ulteriore miglioramento dei dati lo faccio convertendo la prima lettera del nome e del cognome in lettere maiuscole facendo uso dell’istruzione ucfirst: può capitare, infatti, che l’utente immetta i dati con lettere minuscole, quindi, per migliorare l’aspetto visivo posso fare questo intervento. Inserisco, in ultimo, i dati nel DB preparando la query e eseguendola con il comando mysql_query.
In questo modo ho inserito i dati dell’utente che si è registrato al sito nel database. Ora voglio mostrare come sia possibile inviare, all’indirizzo mail con cui l’utente si è registrato, alcuni dei dati immessi. Per fare questo posso semplicemente usare il comando mail del linguaggio PHP; in alternativa (se voglio qualcosa di più raffinato), si può usare uno script PHP che invia mail e ve ne sono diversi, anche di tipo free, che svolgono tale funzione.
Il contenuto del file che si occupa dell’invio mail, e che ho denominato inviamail.php, può essere molto semplice e di questo tipo:
<? $header = "To: Ricevente \n"; $header = "From: amministratore del sito \n"; $oggetto = "Ti sei registrato"; $messaggio = "Complimenti ".$nome $cognome ."ti sei registrato al nostro sito!"; @mail("$email", $oggetto, $messaggio, $header); ?>
Anche per questo file qualche breve commento. Nella variabile $header carico i dati relativi agli indirizzi mail del ricevente e del destinatario.
Non ho presentato qui il codice relativo al recupero dei dati dell’utente. E’ possibile, dunque, integrare questo codice con una query in grado di recuperare il record dell’utente che ci interessa. Suppongo di aver recuperato dal database il nome, il cognome e l’indirizzo e-mail (e memorizzati rispettivamente nelle variabili: $nome, $cognome ed $email) del destinatario della e-mail e, chiaramente, corrispondente alla persona che si è registrata.
Oltre ai due indirizzi e-mail, inserisco l’oggetto della mail e il contenuto della mail stessa. Inserisco le variabili relative al nome e cognome dell’utente nel corpo della mail, concatenandole con il testo fisso della e-mail. Per inviare la mail uso il comando mail fornendogli l’indirizzo e-mail del destinatario, l’oggetto, il messaggio e l’header. Il carattere di @ (chiocciola) serve per fare in modo che, nel caso di errori, non vengano visualizzati messaggi di errore che potrebbero essere indesiderati.
Ti consiglio vivamente di fare dei maggiori controlli per proteggerti da sql injection.
Basta che il cognome contenga un apostrofo per mandare tutto in tilt (la query assumerà una sintassi inesatta).
ciao,
è vero! Ho dimenticato nella parte di codice del form di inserire nel campo value il comando stripslash che inserisce gli slash davanti agli apici. Poi è possibile fare altri controlli più specifici che esulano un po dal compito dell’articolo. Potrebbe essere un argomento per i prossimi articoli.
grazie per la segnalazione.
ciao.