Come integrare un sistema CAPTCHA in un form
Come promesso ora vi spiego come utilizzare il nostro script captcha.php che ho introdotto nel post di ieri per sfruttarlo con un form per l’invio di una richiesta tramite mail. La fantasia nell’implementazione del form la lascio a voi anche se metterò un piccolissimo esempio.

Pronti? Cominciamo...
Innanzi tutto apriamo la sessione:
<?php
session_start();
?>
Ora inseriamo il nostro semplicissimo form. Costruiamo una tabella al cui interno inseriremo i campi “Nome”, “Cognome”, “Email” e “Richiesta”. Da notare che i primi tre campi sono obbligatori:
<form method=”post” action=”send.php” id=”davide”>
<table>
<tr>
<th>Nome <small style=”color:red;”>*</small></th>
<th><input id=”element_0″ name=”element_0″ value=”<?php echo $_SESSION['dati']['element_0']; ?>” size=”25″ type=”text”></th>
</tr>
<tr>
<th>Cognome <small style=”color:red;”>*</small></th>
<th><input id=”element_1″ name=”element_1″ value=”<?php echo $_SESSION['dati']['element_1']; ?>” size=”25″ type=”text”></th>
</tr>
<tr>
<th>Email <small style=”color:red;”>*</small></th>
<th><input id=”element_2″ name=”element_2″ value=”<?php echo $_SESSION['dati']['element_2']; ?>” size=”25″ type=”text”></th>
</tr>
<tr valign=”top”>
<th>Richiesta</th>
<th><textarea id=”element_10″ name=”element_10″ cols=”23″ rows=”10″><?php echo $_SESSION['dati']['element_10']; ?></textarea></th>
</tr>
A questo punto inseriamo il codice che richiama lo script captcha.php. Da notare che ho implementato anche una semplice funzione per cambiare il testo del captcha se per caso non si dovesse leggere:
<tr>
<th colspan=”2″>Perfavore inserisci il testo dell’immagine</th>
</tr>
<tr>
<td> </td>
</tr>
<tr valign=”top”>
<td><img id=”captcha_image” src=”captcha.php” alt=”captcha”></td>
<th>
<div><input id=”element_12″ name=”element_12″ size=”25″ type=”text”><br>[<a href="javascript:void(0);" onclick="document.getElementById('captcha_image').src = 'captcha.php?sid=' + Math.random(); return false">Cambia Immagine</a>]
</div>
</th>
</tr>
<tr>
<td> </td>
</tr>
Ora inseriamo un bottone per l’invio della richiesta tramite mail e chiudiamo i tag “table” e “form”:
<tr>
<td colspan=”2″><input name=”element_counts” value=”11″ type=”hidden”><input type=”submit” value=”Invia la richiesta” name=”Invia la richiesta”></td>
</tr>
</table>
</form>
E adesso? Adesso dobbiamo implementare “send.php”, lo script che permetterà di controllare eventuali errori nell’immissione dei dati nei campi di input (soprattutto in quello de captcha).
Anche in questo caso apriamo la sessione:
<?php
session_start();
Ora non ci resta che salvare i dati inseriti dall’utente in variabili scelte da noi che successivamente ci serviranno per fare i dovuti controlli:
if (isset($_POST['element_0']) and isset($_POST['element_1']) and isset($_POST['element_2']) and isset($_POST['element_10']) and isset($_POST['element_12'])) {
$nome=htmlentities(trim($_POST['element_0']),ENT_QUOTES);
$cognome=htmlentities(trim($_POST['element_1']),ENT_QUOTES);
$email_mittente=htmlentities(trim($_POST['element_2']),ENT_QUOTES);
$richiesta=htmlentities(trim($_POST['element_10']),ENT_QUOTES);
$captcha=$_POST['element_12'];
$presenza_errori=false;
Da qui parte il blocco degli errori. Nei casi del nome e del cognome abbiamo un errore se l’utente non ha inserito il dato oppure entrambe le stringhe sono minori di 3 caratteri. Nel caso dell’email facciamo un controllo con la fuznione preg_match che controlla se l’indirizzo email che è stato inserito è un indirizzo valido.
if (strlen($nome)<3) {
$_SESSION['errore']['element_0']=true;
$presenza_errori=true;
}
else {
$_SESSION['errore']['element_0']=false;
}
if (strlen($cognome)<3) {
$_SESSION['errore']['element_1']=true;
$presenza_errori=true;
}
else {
}
if(!preg_match( ‘/^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$/’, $email_mittente)) {
$_SESSION['errore']['element_2']=true;
$presenza_errori=true;
}
else {
$_SESSION['errore']['element_2']=false;
}
Eccoci arrivati al fulcro dello script. Atrraverso il comando strcmp controllo se il contenuto della variabile $captcha coincide con il contenuto di $_SESSION['code']. In caso affermativo la mail verrà spedita altrimenti abbiamo sbagliato ad inserire il codice oppure chi sta tentando di inviare la mail è un bot. $_SESSION['code'] è una variabile di sessione che viene valorizzata nello script captcha.php che abbiamo spiegato nel post precedente.
if (strcmp($captcha, $_SESSION['code']) != 0) {
$_SESSION['errore']['element_12']=true;
$presenza_errori=true;
}
else {
$_SESSION['errore']['element_12']=false;
}
Ora siamo pronti a spedire la nostra mail attraverso questo semplicissimo blocco di codice. Naturalmente se non ci sono errori la mail verrà inviata altrimenti verranno riportati gli errori:
if ($presenza_errori==false) {
// to
$to = “mail@mia_mail.com”;
// Subject
$subject = “Salve”;
// Body
$body = “<b>Nome:</b> “ . stripslashes($nome) . “<br>”;
$body .= “<b>Cognome:</b> “ . stripslashes($cognome) . “<br>”;
$body .= “<b>Email:</b> “ . stripslashes($email_mittente) . “<br>”;
$body .= “<b>Richiesta:</b> “ . stripslashes($richiesta) . “<br>”;
// Headers
$headers = “MIME-Version: 1.0\r\n” ;
$headers .= “Content-Type: text/html; charset=iso-8859-1\r\n”;
$headers .= “From: $nome $cognome < “.$email_mittente.”>\r\n”;
if (mail($to, $subject, $body, $headers)) {
$_SESSION['errore']=’no_errors’;
header(‘Location: ../form.php’);
}
else {
$_SESSION['errore']['server']=true;
header(‘Location: ../form.php’);
}
}
else {
$_SESSION['dati']=$_POST;
header(‘Location: ../form.php’);
}
}
?>
Ma dove vengono comunicati all’utente gli errori che ha commesso? Nella nostra pagina html, prima del form, inseriamo queste righe di codice:
if (isset($_SESSION['errore']) and $_SESSION['errore']!=’no_errors’) {
echo ‘<div><b>Si sono verificati i seguenti errori:</b><ul>’;
if ($_SESSION['errore']['element_0']==true) {
echo ‘<li>Non hai inserito il tuo NOME o il nome è più corto di 3 caratteri.</li>’;
}
if ($_SESSION['errore']['element_1']==true) {
echo ‘<li>Non hai inserito il tuo COGNOME o il cognome è più corto di 3 caratteri.</li>’;
}
if ($_SESSION['errore']['element_2']==true) {
echo ‘<li>Non hai inserito il tuo indirizzo EMAIL o non è un indirizzo email valido.</li>’;
}
if ($_SESSION['errore']['element_12']==true) {
echo ‘<li>Il TESTO inserito non è corretto.</li>’;
}
if ($_SESSION['errore']['server']==true) {
echo ‘<li>La mail non è stata inviata.</li>’;
}
echo ‘</ul></div>’;
}
else {
if (isset($_SESSION['errore']) and $_SESSION['errore']==’no_errors’) {
echo ‘<div class=”send_ok”>La tua richiesta è stata inoltrata con successo.</div>’;
session_destroy();
}
}
E il gioco è fatto ![]()
Se volete una dimostrazione potete visionare questa pagina. Il form è più complicato e ci sono più campi ma il risultato è lo stesso.
Alla prossima.
-
http://toastedtech.wordpress.com/ montoya
