Hosting e Domini

Guide, Consigli e Recensioni per Webmaster

PHP

Realizzare un form PHP e HTML

Quando ci troviamo a realizzare un sito web vetrina sicuramente avremo la necessità di creare una pagina dei contatti, permettendo ai visitatori del sito di poter contattare facilmente l’azienda, senza che l’utente debba per forza avere a disposizione un software di posta per poter spedire un email.

Nella realizzazione di un form html ci sono due fasi da seguire, la prima è quella di realizzare il modulo in codice HTML e la seconda è quella di realizzare la pagina che processa i dati inseriti dall’utente con un codice PHP appositamente scritto per costruire il messaggio e spedirlo via email all’indirizzo feedback dell’azienda.

Le principali problematiche da considerare sono il controllo di inserimento dei dati (check del formato) e l’eventuale inserimento di un codice CAPTCHA per evitare i messaggi di spam inviati da sistemi automatici detti robot. In questa guida analizzeremo anche questi due aspetti.

Cominciamo con il nostro form html composto da elementi standard richiesti per la maggior parte dei casi in cui stiamo realizzando un semplice sito vetrina.

[code]

<form id="form1" name="form1" method="post" action="esito.php">
<p>
<label for="nome">Nome</label>
<input type="text" name="nome" id="nome" />
</p>
<p>
<label for="email">Email</label>
<input type="text" name="email" id="email" />
</p>
<p>
<label for="messaggio">Messaggio</label>
<textarea name="messaggio" id="messaggio" cols="45" rows="5"></textarea>
</p>
<p>
<input name="privacy" type="checkbox" id="privacy" value="1" />
<label for="privacy">….Testo della Privacy….</label></p>
<p>
<label for="captcha">Digita il Codice di verifica</label>
<input type="text" name="captcha" id="captcha" />
<img src="captcha.php" alt="captcha image"></p>
<p>
<input type="submit" name="submit" id="submit" value="Invia Messaggio" />
</p>
</form>

[/code]

Adesso passiamo alla creazione della pagina con il codice PHP che provvede al controllo dei dati inseriti e all’ invio del messaggio.

Il linguaggio PHP prevede l’accesso ad una variabile ambiente adibita allo scopo di recuperare i valori inseriti in un modulo inviato al server con la modalità POST (method=”post”). La variabile ambiente che ci interessa in questo caso è $_POST, sostanzialmente è un array associativo dove a ogni indice corrisponde il valore contenuto in esso, quindi il valore scritto nel campo di testo “nome” potrà essere recuperato con la variabile $_POST[‘nome’] e via via tutti gli altri.

Creiamo un file e chiamiamolo “esito.php” e incolliamo il codice

[code]
<?php

function isValidEmail($email){
return eregi("^[_a-z0-9-]+(\.[_a-z0-9-]+)*@[a-z0-9-]+(\.[a-z0-9-]+)*(\.[a-z]{2,3})$", $email);
}

if (isset($_POST[‘submit’])) {
$nome=$_POST[‘nome’];
$email=$_POST[‘email’];
$messaggio=$_POST[‘messaggio’];
$privacy=$_POST[‘privacy’];
if (!empty($nome)) {
if (!empty($email)) {
if (isValidEmail($email)) {
if (!empty($messaggio)) {
if ($privacy==1) {
if($_SESSION["captcha"]==$_POST["captcha"]) {
$testo_del_messaggio="Nome: $nome\n";
$testo_del_messaggio.="Email: $email\n";
$testo_del_messaggio.="Messaggio: $messaggio\n";
$testo_del_messaggio.="Privacy: $privacy\n";
$esito=mail("[email protected]","Messaggio di $nome ($email)", $testo_del_messaggio);
if ($esito) {
echo "Esito: Messaggio inviato, ripsonderemo appena possibile!";
} else {
echo "Errore: Non &egrave; stato possibile inviare il messaggio!";
}
} else {
echo "Errore: Il Codice di verifica non &egrave; corretto!";
}
} else {
echo "Errore: Bisogna dare il consenso sulla Privacy!";
}
} else {
echo "Errore: Manca il Messaggio!";
}
} else {
echo "Errore: Formato Email non corretto!";
}
} else {
echo "Errore: Manca un indirizzo Email!";
}
} else {
echo "Errore: Manca il Nome!";
}
} else {
echo "Errore: Modulo di invio non valido!";
}

?>[/code]

Analizziamo i vari punti del codice qui sopra:

1) Abbiamo prima di tutto raccolto per comodità le variabili ambiente in alcune variabili locali che cesseranno di esistere al termine dello script;

2) Abbiamo controllato i valori di ogni variabile obbligatoria con una serie di if-then-else così da essere sicuri che l’utente non possa commettere errori;

3) la funzione isValidEmail() ci permette di controllare la formattazione dell’indirizzo email, ossia: [email protected];

4) Controlliamo se l’utente ha correttamente spuntato l’approvazione del trattamento sulla privacy;

5) Verifichiamo che il codice di verifica sia quello visualizzato nell’immagine generata dal file captcha.php

6) Abbiamo costruito il messaggio da spedire, in questo caso abbiamo optato per un messaggio in formato ASCII e con una serie di \n ci assicuriamo che non vi siano testi consecutivi così da rendere il messaggio recapitato sufficientemente leggibile;

7) Infine inviamo il messaggio con la funzione mail() di PHP preposta all’invio di messaggi di testo tramite il servizio sendmail del server dove il sito risiede.

La funzione “mail()” come si può dedurre dal codice prevede come primo parametro l’indirizzo email di destinazione, quindi l’Oggetto del messaggio come secondo parametro e infine il corpo del messaggio che passiamo tramite la variabile $testo_del_messaggio.

A questo punto possiamo procedere alla creazione dello script CAPTCHA per impedire i robot di inviare messaggi di spam

Creiamo un file chiamato “captcha.php” e incolliamo questo codice:

[code]<?php
session_start();
header("Expires: Mon, 26 Jul 1997 05:00:00 GMT");
header("Last-Modified: " . gmdate("D, d M Y H:i:s") . " GMT");
header("Cache-Control: no-store, no-cache, must-revalidate");
header("Cache-Control: post-check=0, pre-check=0", false);
header("Pragma: no-cache");

function _generateRandom($length=6)
{
$_rand_src = array(
array(48,57) //digits
, array(97,122) //lowercase chars
// , array(65,90) //uppercase chars
);
srand ((double) microtime() * 1000000);
$random_string = "";
for($i=0;$i<$length;$i++){
$i1=rand(0,sizeof($_rand_src)-1);
$random_string .= chr(rand($_rand_src[$i1][0],$_rand_src[$i1][1]));
}
return $random_string;
}

$im = @imagecreatefromjpeg("captcha.jpg");
$rand = _generateRandom(3);
$_SESSION[‘captcha’] = $rand;
ImageString($im, 5, 2, 2, $rand[0]." ".$rand[1]." ".$rand[2]." ", ImageColorAllocate ($im, 0, 0, 0));
$rand = _generateRandom(3);
ImageString($im, 5, 2, 2, " ".$rand[0]." ".$rand[1]." ".$rand[2], ImageColorAllocate ($im, 255, 0, 0));
Header (‘Content-type: image/jpeg’);
imagejpeg($im,NULL,100);
ImageDestroy($im);
?>[/code]

Questo file provvederà alla creazione di una immagine jpg contenente un codice numerico che l’utente dovrà trascrivere in una casella di testo prima di inviare il modulo.

Adesso riprendiamo il file “esito.php” con il codice per l’invio del messaggio e aggiungiamo all’inizio del file questa riga:

[code]<?php session_start() ?>[/code]

Assicuriamoci che sia la prima riga del file, deve essere inserita prima di “<!DOCTYPE…”.

Il nostro modulo dei contatti è finalmente pronto, possiamo pubblicarlo e provare tutte le possibili situazioni reali e controllare che tutto funzioni correttamente.

Hosting con WordPress e Joomla a partire da 24 €
3.3/5 - (6 votes)

23 COMMENTS

  1. è possibile inserire una protezione per l’indirizo mail in modo da non essere visibile nel codice?

    grazie!

  2. scusa, che senso ha mettere all’pinizio di esito.php????

    Comunque sia non riesco a far funzionare la cosa

  3. dall’errore che vedo sul tuo link sembra che non venga creato l’oggetto Image correttamente

  4. infatti, ma vorrei capire perchè, inoltre continuo a non capire perchè devo aggiungere “?php session_start() ?” in esito.php, non bastrebbe aggiungere semplicemente “session_start();”?

  5. salve
    ho provato anche io ma mi da lo stesso problema di roberto
    sono andato sul suo link ma in effetti l’immagini ora si vede .
    deduco che deve avere risolto.
    quale era il problema, così riesco a far funzionare anche il mio codice ?
    grazie

  6. Ciao l’articolo mi è stato molto utile.. vorrei sapere però come inserisco un menù a tendina per selezionare una categoria d’argomento dentro il form.. ho trovato un codice online ma differenzia in parte da quello scritto da te e non riesco a coniugarli grazie in anticipo!

  7. Io ho lo stesso problema di Giuseppe, non mi si vede l’immagine con il Captcha, qualcuno mi può aiutare?

  8. anche io ho notato lo stesso problema dell’immagine capta che non esce! … ma vedo che non ci rispondono!

  9. Normale che non visualizzi lìimmagine

    sostituisci

    con

    Mai vista un’immagine con estensione .php
    :)

  10. Sorry ho detto una bagianata
    Volevo scrivere “avete creato l’immagine captcha.jpg ?

  11. Ciao, stesso problema di stefano e giuseppe, non mi vede l’immagine Captcha, come risolvo? grazie…

  12. questa immagine captcha sarà la nostra rovina. funziona ma per metà e non rispondono

  13. Nel file captcha.php si devono modificare in questo modo le seguenti righe.

    $rand = _generateRandom(6);
    $_SESSION[‘captcha’] = $rand;
    ImageString($im, 5, 2, 2, $rand[0].” “.$rand[2].” “.$rand[4].” “, ImageColorAllocate ($im, 0, 0, 0));
    //$rand = _generateRandom(3);
    ImageString($im, 5, 2, 2, ” “.$rand[1].” “.$rand[3].” “.$rand[5], ImageColorAllocate ($im, 255, 0, 0));

  14. La guida non specifica è necessario creare un immagine nominata captcha.jpg nella cartella. L’immagine deve avere solo lo sfondo poichè i numeri/lettere vengono stampati con PHP.
    Ciao

  15. allora, nel codice del captcha c’è bisogno di una immagine di solo sfondo anche a puntini. Nel codice dell’esito c’è un = in più che non fa funzionare il captcha.
    riporto codice:
    if($_SESSION[“captcha”]==$_POST[“captcha”]) {
    la stringa corretta è
    if($_SESSION[“captcha”]=$_POST[“captcha”]) {
    grazie per il php :)

  16. Scusate ma si deve inserire il codice ” ” nel file con estensione html?

    Adesso riprendiamo il file “esito.php” con il codice per l’invio del messaggio e aggiungiamo all’inizio del file questa riga:

    1

    Assicuriamoci che sia la prima riga del file, deve essere inserita prima di “<!DOCTYPE…”.

    Ciao

  17. Ciao a tutti, premetto che non so quasi nulla di codice html ma per lavoro ho dovuto inserire in un sito “prefabbricato” di 1&1 un codice html per il form di contatto che prevedesse la spunta del consenso al trattaemento dei dati. Ho inserito nel così detto widget html del sito il codice ma non funziona l’invio del messaggio. Una volta chiesto l’invio mi compare la mappa del sito in cui si dice che la pagina forse non esiste più.
    Cosa sbaglio?
    Grazie mille!

  18. scusate qualcuno mi puo dire come si crea la pagina dei contatti sto provando ma non ci riesco ho seguito tutto cio che cera scritto sopra ma non ci sono riuscita il form si vede ma non mi arrivano le mail non capisco dove sbaglio
    grazie

  19. Ciao A tutti, mi chiedo…ma come faccio a richiamare captcha.php per generare l’immagina?

  20. Io ho provato ma quando premio invio mi compare una pagina bianca. come mai?

  21. Io vedo il captcha, l’ho inserisco corretto, ma mi viene un messaggio che mi dice che il cocide di verifica non è corretto, come mai?

LEAVE A RESPONSE