Come realizzare un modulo contatti in PHP?

Negli articoli della guida sulla progettazione dei form, abbiamo visto tutti i vari elementi che compongono il markup degli elementi, come strutturarli in modo valido, e come integrare tali form con jQuery. In questa lezione vedremo come interfacciare un semplice modulo contatti con PHP, realizzando tutti i controlli da zero.
Partiremo da un semplice form, con quattro campi: Nome, Email, Sito Web e Messaggio, a cui applichiamo un foglio di stile, preso dall’articolo “Form Design”. Apri dunque il tuo editor preferito e crea il file contatti.php, incollando il codice seguente:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Modulo contatti in PHP | Your Inspiration Web</title>
<link rel="stylesheet" type="text/css" href="stile.css" />
</head>
<body>
<form action="" method="post" id="formYIW">
<fieldset>
<legend><span>Inviaci un messaggio</span></legend>
<ol>
<li>
<label for="nome">Nome <abbr title="campo obbligatorio">*</abbr></label>
<input type="text" name="nome" id="nome" tabindex="1"/>
</li>
<li>
<label for="email">Email <abbr title="campo obbligatorio">*</abbr></label>
<input type="text" name="email" id="email" tabindex="2"/>
</li>
<li>
<label for="sito">Sito web</label>
<input type="text" name="sito" id="sito" tabindex="3"/>
</li>
<li>
<label for="messaggio">Messaggio <abbr title="campo obbligatorio">*</abbr></label>
<textarea name="messaggio" id="messaggio" rows="10" cols="30" tabindex="4"></textarea>
</li>
</ol>
</fieldset>
<p class="controls">
<input type="submit" name="submit" id="submit" value="Invia Mail" tabindex="5" />
</p>
</form>
</body>
</html>
Questo form sarà il nostro punto di partenza per la creazione del codice PHP di supporto.
Mettiamoci in “azione”
La prima questione da risolvere è il valore da inserire nel campo action del form. Possiamo operare due scelte: la prima prevede di utilizzare un file per ospitare il form che punterà ad un altro script, responsabile del processo di validazione. In caso di errore, si viene reindirizzati alla pagina contenente il form, altrimenti alla pagina di conferma.
La seconda scelta, invece, prevede di inserire sia il form che la logica per l’invio della mail in un unico script. Attraverso l’esame delle metodo di richiesta, si offre al browser una sezione diversa: se la richiesta è di tipo GET, viene mostrato il form; in caso contrario (ovvero in caso di richiesta POST), il form viene processato.
Ogni metodo ha i suoi pro e contro: ad esempio gli script multipli soffrono sul piano della manutenibilità. Infatti bisogna tener traccia di più file, e in caso di modifiche ad uno, bisognerà con buona probabilità modificare anche l’altro. D’altro canto, in molte circostanze la modularità è un punto di forza. Insomma, come spesso accade, non esiste il metodo migliore: dipende dalle circostanze.
Detto questo, in questo esempio la visualizzazione del form e la relativa gestione conviveranno nello stesso file. Dunque l’attributo action dovrà puntare proprio a contatti.php.
...
<form action="contatti.php" method="post" id="formYIW">
<fieldset>
<legend><span>Inviaci un messaggio</span></legend>
...
Voglio però fare una riflessione. Cosa accadrebbe se rinominassimo il file in modulo_contatti.php? Esatto: il form non funzionerebbe più, e saremmo costretti a modificare il campo “action”. Esiste una soluzione più flessibile: attraverso l’array superglobale $_SERVER possiamo delegare questo compito a PHP. Infatti tale array tiene traccia di tutti gli elementi che intervengono nell’interazione tra il Server e lo script, tra cui anche il nome dello script stesso. La variabile interessata è chiamata PHP_SELF e possiamo integrarla nel form in questo modo:
...
<form action="<?php $_SERVER['PHP_SELF'] ?>" method="post" id="formYIW">
<fieldset>
<legend><span>Inviaci un messaggio</span></legend>
...
In questo modo il nostro form punterà sempre al file corretto, anche in caso di rinomina e/o spostamento dello stesso.
Parola d’ordine: modularità
Come ha spiegato molto bene Nando nel suo articolo rendere dinamiche alcune sezioni del proprio sito porta solo vantaggi. Ad esempio, potremmo voler riutilizzare questo form più di una volta sul sito; quindi lo sposteremo in un file separato, che chiameremo appunto form.php. Tale file verrà poi incluso in contatti.php tramite la direttiva require_once, in questo modo:
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN"
"http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">
<html>
<head>
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />
<title>Modulo contatti in PHP | Your Inspiration Web</title>
<link rel="stylesheet" type="text/css" href="stile.css" />
</head>
<body>
<?php
//include il form
require_once 'form.php';
?>
</body>
</html>
Come differenziare le richieste POST e GET?
Ora che ci siamo accertati che il nostro modulo sarà effettivamente inviato ad uno script in grado di gestirlo e richiamato da un file esterno, passiamo ad una questione più delicata, ovvero come fare per differenziare una richiesta POST da una GET.
Ogni volta che un form viene inviato con un metodo “post”, PHP crea automaticamente un array superglobale chiamato $_POST, in cui sono contenute tutte le coppie nome-valore del form. Ad esempio, se abbiamo un campo con “email” in cui inseriamo “ciccio@formaggio.com” e inviamo il form, verrà creato l’array $_POST e la variabile $_POST['email'] con un valore di “ciccio@formaggio.com”.
Dunque possiamo testare se è stato inviato il form controllando se è stata settata una di queste variabili, ad esempio quella relativa al pulsante di invio (“submit”):
...
if(isset($_POST['submit'])){
//codice per processare il form
}
//include il form
require_once 'form.php';
?>
Processare le variabili POST
Il processo di gestione di un form passa attraverso due fasi: preparazione ed eventuale validazione delle variabili POST e successivo redirect allo script necessario (dipendente da se ci sono stati errori o meno).
Per la gestione delle variabili POST di questo esempio utilizzeremo tre array:
- “$expected”, che ospita i nomi dei campi che ci aspttiamo di ricevere. Questo serve per evitare che un utente malintenzionato possa modificare l’operato del nostro form, aggiungendo campi nascosti.
- “$required”, che ospita i nomi dei campi obbligatori.
- “$missing”, array inizialmente vuoto, che ospiterà eventuali campi obbligatori, ma non compilati.
Definiremo questi tre array in un file esterno settings.php che poi includeremo in contatti.php:
/* settings.php
Elenca i campi che ci si aspetta di ricevere.
Evita che qualcuno possa aggiungere dei campi non previsti */
$expected = array('nome','email','sito','messaggio');
//imposta i campi obbligatori
$required = array('nome','email','messaggio');
//crea un array vuoto per i campi mancanti
$missing = array();
//file contatti.php
...
require_once 'settings.php';
if(isset($_POST['submit'])){
...
Una volta fatto ciò, siamo pronti per esaminare l’array $_POST. Il ragionamento che seguiremo è, per sommi capi:
- Controlla ogni variabile dell’array
$_POST. - Elimina tutti gli spazi aggiuntivi.
- Se la variabile è vuota, ma è obbligatoria, aggiungi il suo nome all’array “$missing”.
- Altrimenti, se il campo è uno che ci aspettiamo (ovvero il nome è inserito nell’array “$expected”) crea una variabile, denominata come il campo.
In codice, questo viene reso così:
...
if(isset($_POST['submit'])){
foreach ($_POST as $key => $value){
//elimina eventuali spazi aggiuntivi
$temp = trim($value);
//se è richiesta ma vuota aggiungila all'array missing
if(!strlen ($temp) && in_array($key, $required)){
array_push($missing, $key);
}
//se il campo è aspettato, setta la variabile associata
elseif(in_array($key, $expected)){
${$key} = htmlentities($temp); //in questo caso crea $nome, $email, $sito, $commento
}
}
...
Quindi seguendo l’esempio, se un utente compila i campi “nome”,”email” e “messaggio” del form (quelli obbligatori), al termine dell’esecuzione del codice appena sopra otterremo le variabili $nome, $email e $messaggio, che potremo utilizzare nello script.
Nota che ho utilizzato la funzione htmlentities per assicurarmi di effettuare l’escape dei caratteri sull’input: questo passo è molto importante. Infatti la regola d’oro della programmazione web potrebbe essere: non fidarsi mai dell’input dell’utente.
Come inviare una mail tramite php?
Ipotizziamo per un momento di avere i migliori utenti di tutto il web navigare sul nostro sito. Tali utenti, una volta trovatisi di fronte al form, lo compilano con precisione e in tutte le sue parti. In questo caso, potremmo quindi procedere direttamente all’invio della mail, non trovi?
Nel caso in cui un utente compili tutti i campi del form (o meglio compili i campi obbligatori), l’array “$missing” risulterà vuoto. Quindi se l’array “$missing” è vuoto, si può inviare l’email:
if ( empty($missing) ){
//Se l'array missing è vuoto, vuol dire che sono stati inseriti i valori
//obbligatori.
}
Per inviare le email, PHP dispone della funzione mail() che ha la seguente sintassi:
mail($destinatario, $oggetto, $contenuto_email, $parametri_opzionali);
e restituisce TRUE o FALSE, rispettivamente in caso di corretto invio o in caso di errore. Un utile parametro opzionale da inserire potrebbe essere l’indirizzo email del mittente. Si può inserire facilmente in questo modo:
mail($destinatario, $oggetto, $contenuto_email, 'From: '. $email_mittente);
Ora costruiamo il messaggio da inserire nell’email: è sempre utile riportare tutti i campi del form anche nel messaggio, in modo da tenere sotto controllo chi ci invia email:
...
if ( empty($missing) ){
$contenuto_email = "Nome: $nome\n\n"; //Queste variabili sono create nel passaggio precedente
$contenuto_email .= "Email: $email\n\n";
$contenuto_email .= "Sito Web: $sito\n\n";
$contenuto_email .= "Messaggio:\n $messaggio\n\n";
//limita la lunghezza a 70 caratteri per la compatibilità
$contenuto_email = wordwrap($contenuto_email,70);
//invia l'email
$mail_sent = mail($destinatario,$oggetto,$contenuto_email, 'From: '.$email);
if($mail_sent){
//Se l'email viene inviata l'array missing non serve più quindi lo svuoto
unset($missing);
}
...
Come puoi vedere nel codice sopra ho inserito tutti i dati del form nella variabile “$contenuto_email”, ho poi limitato la lunghezza di riga a 70 caratteri, per essere certo che il messaggio sia leggibile da tutti i client, e poi ho memorizzato il risultato dell’invio (ti ricordo, TRUE o FALSE) nella variabile “$mail_sent”. Quest’ultima ci permetterà di “tracciare” l’invio e di sapere se è stato eseguito tutto correttamente. Il primo utilizzo è quello di cancellare l’array “$missing”: infatti se l’email è stata inviata tale array non serve più e lo script deve ritornare alle condizioni iniziali.
L’ultimo dettaglio da sistemare è l’inserimento di un destinatario e di un oggetto: infatti non abbiamo ancora definito questi elementi! Il posto ideale per inserirli è il file settings.php, in modo da consentire una facile modifica, senza dover toccare una riga del codice di gestione:
//file settings.php //email del destinatario del form $destinatario = 'indirizzo@email.com'; //oggetto dell'email inviata $oggetto = 'Mail dal modulo contatti articolo YIW';
Come gestire errori e notifiche nella compilazione del modulo?
Evviva, il nostro form è perfettamente funzionante! Ma c’è un problema: con tutta probabilità non tutti gli utenti del nostro sito compileranno correttamente il form. Alcuni mancheranno dei campi obbligatori, e anche se abbiamo già gestito questa eventualità nel codice, non c’è nessuna notifica di errore. Anche l’invio dell’email non viene accompagnato da un messaggio di conferma. Inoltre un utente potrebbe compilare tutti i campi, ma ci potrebbero essere dei problemi con il server che impediscono il corretto funzionamento del form. È nostro compito prevedere e gestire tutte queste situazioni.
Iniziamo dal compito più semplice: l’inserimento di un messaggio di conferma del corretto invio. L’idea di base è quella di inserire tutti i messaggi di notifica e di errore in un’unica variabile, e mostrare tali messaggi solo se la variabile è settata. Inseriremo tali notifiche appena sopra il form, e chiameremo la variabile “$info_message”:
//file contatti.php ... //Mostra una notifica sia d'errore che di conferma if ( isset( $info_message ) && strlen( $info_message ) ) echo $info_message; //Include il form require_once 'form.php'; ...
Il passo successivo è quello di impostare “$info_message” in caso di corretto invio: possiamo farlo appena sotto la funzione “mail”:
... $mail_sent = mail($destinatario,$oggetto,$contenuto_email, 'From: '.$email); $info_message = '<p class="info">' . $info_mail_sent . '</p>'; ...
Come puoi vedere, ho creato un paragrafo con classe “info” (di cui modificherò l’aspetto tramite CSS) e utilizzato come corpo della notifica un’altra variabile “$info_mail_sent”. È sempre buona pratica avere un file di configurazione, da modificare senza dover per forza cercare nel codice contentente la logica dell’applicazione. Come si dice, “lontano dagli occhi, lontano dai pasticci” (forse non era questo il proverbio, ma calza a pennello). Inoltre tale pratica potrebbe risultare utile in caso di internazionalizzazione dell’applicazione. Quindi, come già avrai immaginato, definiremo questa variabile nel file settings.php:
//Messaggio di conferma invio mail //Info message for correct mail sent $info_mail_sent = 'L\'email è stata inviata correttamente!.';
Adesso dobbiamo gestire il caso in cui non siano stati inseriti tutti i campi obbligatori. Questa eventualità occorre quando il form è stato inviato, l’array “$missing” è stato definito e non è vuoto:
... //se non sono stati immessi campi obbligatori if ( isset( $_POST['submit'] ) && isset($missing) && !empty($missing)) : $info_message = '<p class="error">' . $error_missing_fields . '</p>'; ...
Anche qui ho utilizzato una variabile definita in settings.php “$error_missing_fields”:
//Messaggio d'errore per campi mancanti //Error message for missing fields $error_missing_fields= 'Per favore, completate tutti i campi del form indicati';
Il caso in cui ci sono errori con il server è invece caratterizzato dalla variabile “$mail_sent” settata a FALSE, dopo aver inviato il form:
... elseif ($_POST['submit'] && !$mail_sent) : //se ci sono stati problemi con l'invio della mail da parte del server $info_message = '<p class="error">' . $error_mail_server . '</p>'; endif; ...
Abbiamo realizzato quindi un semplice ma robusto sistema di notifiche. C’è ancora un ultimo dettaglio, però, di cui voglio parlarti.
Migliorare il form
Allo stato attuale il nosto form non è altro che semplice HTML, e non si adatta automaticamente alle varie situazioni. Ad esempio, in caso di un campo mancante e invio del form, tutti i campi vengono azzerati. Inoltre quelli mancanti non vengono evidenziati in alcun modo. Vediamo come implementare questi semplici casi d’uso.
Apriamo dunque il file form.php ed analizziamo un campo (questo discorso è identico per tutti i campi, cambia solo il nome delle variabili):
<li> <label for="nome">Nome <abbr title="campo obbligatorio">*</abbr></label> <input type="text" name="nome" id="nome" tabindex="1" /> </li>
Il nostro obiettivo è quello di inserire una classe “error” se il campo è presente nell’array “$missing” (ovvero l’utente non ha compilato il campo) e di inserire il valore del campo, se è stato precedentemente compilato. Aggiungeremo dunque dei piccoli controlli all’interno del tag input:
<li>
<label for="nome">Nome <abbr title="campo obbligatorio">*</abbr></label>
<input type="text" name="nome" id="nome" tabindex="1"
value="<?php if ( isset( $missing ) && isset($nome) ) echo $nome; ?>"
class="<?php if (isset( $missing ) && in_array('nome',$missing))
echo 'error';
?>"/>
</li>
Ecco fatto: in questo modo i campi inseriti vengono preservati, e quelli mancanti vengono evidenziati da un bordo rosso, attraverso la classe error. Tale procedimento viene eseguito per ogni campo, facendo attenzione a modificare il nome della variabile e al campo “textarea”, che non accetta l’attributo “value”. Ecco dunque il risultato finale.
Considerazioni Finali
Naturalmente questo form non è altro che un punto di partenza: ci sono tante cose che è possibile migliorare, ad esempio l’aggiunta di un sistema di validazione dei vari campi (in questo esempio ci siamo limitati ad eseguire l’escape), oppure si potrebbe automatizzare la creazione del contenuto dell’email, in modo da farla adattare a qualsiasi form in modo automatico. Il bello della programmazione è che si può sempre migliorare. Scarica questo esempio e prova a migliorarlo, e magari postaci il tuo risultato, così da discuterne insieme.
DownloadQuesto esempio mostra anche che durante la progettazione, bisogna tener conto di tantissime variabili, e il rischio di mancare qualcosa è sempre in agguato. Da qui la domanda che mi pongo da sempre: “è meglio realizzare questi elementi ex novo, oppure poggiarsi ‘sulle spalle dei giganti’ e utilizzare qualche modulo già pronto?”. Tu cosa ne pensi?
- I form: elementi di base
- I form: struttura e aspetto
- I form: jQuery e considerazioni
- Come realizzare un modulo contatti in PHP
55 commenti
Trackback e pingback
-
Tweets that mention Come realizzare un modulo contatti in PHP | Your Inspiration Web -- Topsy.com
[...] This post was mentioned on Twitter by Your Inspiration Web and nando pappalardo, Antonio Capuozzo. Antonio Capuozzo said: @YIW ... -
Web design elements: come validare i form con jQuery? | Your Inspiration Web
[...] essere interessato anche ai seguenti articoli:Come realizzare un modulo contatti in PHP? Negli articoli della guida sulla progettazione dei ...




Ottimo tutorial!
Aggiungerei solo delle considerazioni riguardo allo spam che purtroppo delle volte crea spiacevoli situazioni.
Alcuni siti che avevo creato subivano un bombardamento giornaliero di contatti falsi….
Non volendo inserire “Captcha” ho cercato di aggirare il problema aggiungendo un campo nascosto che quindi gli utenti non vedendolo non lo compilano… i bot però non calcolano ciò e vanno a riempirlo…
quindi in fase di controllo se vedo che il campo è riempito capisco che è spam e blocco tutto…
per ora sembra funzionare…
spero possa servire a qualcuno…
complimenti ancora!
Ciao Marco,
grazie per la puntualizzazione. Non ho inserito considerazioni sulla sicurezza volutamente per non aggiungere un altro livello di complessità allo script, ma il metodo da te suggerito è davvero interessante.
Ti è mai capitato che qualche mail di spam sia riuscita a passare lo stesso?
Bella questa! La userò sicuramente, grazie! =)
Una cosa spesso sottovalutata nella creazione di form di contatto è la sicurezza.
Non tanto per lo spam che ci potrebbe arrivare da bot ma per il fatto che le nostre pagine (e quindi il nostro server) potrebbero essere sfruttate per mandare spam ad altre persone usando tecniche di email injection.
Consiglio dunque di controllare e filtrare sempre i campi inseriti dall’utente, soprattutto quelli che vanno negli headers della mail.
Raccomando la lettura di questo articolo che spiega in modo molto dettagliato l’email injection: email injection
Ciao memic4,
come ho detto a Marco, il discorso sicurezza è sicuramente molto ampio, e andava al di là dello scopo di questo semplice articolo. Ritorneremo ancora a parlarne ;)
Intanto mi leggo la tua ottima segnalazione :)
A presto!
@memic: il link non mi funziona… comunque hai ragione basterebbe fare un controllo aggiuntivo per vedere che nell’head non vengano aggiunti altri mittenti ecc..
magari con una espressione regolare che blocchi i vari cc: bcc: ecc…
Ciao,
si un espressione regolare secondo me è il metodo più semplice per filtrare i campi.
Comunque ho provato adesso il link e funge.
si si confermo ora funziona..
Intanto buongiorno e complimenti per il blog molto carino,altra cosa che io metterei se posso dare i miei 2 cents a questa discussione è passare un unique_id dal form alla elaborazione generata al primo caricamento della pagina così quando l’utente preme aggiorna sul browser l’email non viene rimandata.
Ciao Mauro,
grazie per la segnalazione, a quanto pare c’è un fiorire di tecniche per la protezione dei propri form!
L’unique id viene poi salvato nella sessione corrente?
Ps
Grazie per i complimenti ;)
@ JustB: per ora fortunatamente questo espediente sembra funzionare, lo ho usato la prima volta in un sito che era stato preso di mira e arrivavano 2-300 mail al giorno…
ora non ce ne sono più…
chiaramente nel momento in cui gli spammer si metteranno a guardare anche il css correlato al form dovrò trovare un’altra soluzione, ma ormai è un anno che la situazione è tranquilla…
ottima continuazione del tutorial(chissa chi è stato a farti venire l’idea eheheh) a parte gli scherzi davvero bravi ragazzi… ma una domanda nasce spontanea(no, non sono marzullo) e se noi volessimo salvare tutte queste informazioni in un database mysql?
si JustB lo generi lo passi dal form sotto forma di hidden, lo controlli e lo distruggi se viene aggiornata la pagina l’uniqueid cambia e dai messaggio di errore
esempio qui
Salve, io non sono un programmatore, ma un grafico, e quindi stavo cercando un form in php per i contatti, questo fatto da voi è perfetto, solo che non ho capito una cosa, scusate la mia ignoranza, ma nel form dove va inserita l’email del destinatario?
Ciao Vincenzo, e benvenuto su YIW.
L’email del destinatario puoi specificarla nel file ‘settings.php’ alla riga 5 , sostituendola a quella già presente ed eliminando i due slash ad inizio riga :)
Ciao a tutti
Complimenti per questo utilissimo blog.
Premetto che non capisco molto di php.
Ho scaricato i file da questa pagina li ho inseriti nel mio sito seguendo le istruzioni del tutorial e dei commenti nel codice, ma non ricevo la mail che ho indicato nella variabile $destinatario, mentre arriva la mail all’indirizzo del mittente. Il tutto senza ricevere messaggi di errore.
Cosa posso fare?
Ciao marte, e benvenuto su YIW.
La soluzione è molto semplice: nell’esempio che ho preparato, per testare il corretto funzionamento del modulo, l’email viene inviata a chi compila il form.
Per “attivare” il modulo, bisogna fare due cose:
1) decommentare, rimuovendo i due slash la variabile $destinatario, nel file settings.php, e sostituire l’email predefinita (la mia :) )
2) nel file contatti.php, alla riga 35, sostituire il primo parametro della funzione mail, $email, con la variabile $destinatario, ottenendo così la seguente funzione:
mail($destinatario, $oggetto, $contenuto_email, 'From: '.$email)Spero di essere stato abbastanza chiaro.
Grazie per aver puntualizzato questa possibile incomprensione, a presto! :)
Grazie infinite
Da profano quale sono avevo eseguito solo la prima delle due cose.
Ti ringrazio ancora per la disponibilità e la tempestività della risposta e spero di leggere presto un tuo nuovo tutorial.
@ JustB: scusa, ma c’è qualcosa che non mi torna…ho scaricato il tuo form, ne ho creata una copia modificata per adattarla al sito su cui sto lavorando e la sto provando. Ma ho due problemi:
1) lanciata la mia pagina, invece del form mi appare una buona parte del codice, a partire da
“$value){ //elimina eventuali spazi aggiuntivi…”
pensando che potessi aver modificato male il tuo form(è la prima volta che provo ad utilizzare php, è facilissimo che io mi possa sbagliare), ho voluto lanciare direttamente il tuo, che avevo copiato con tutti i suoi componenti in un’altra cartella.
Ma fa lo stesso!
Per lanciarlo, devo cliccare su “contatti.php”, o devo integrarlo in qualcos’altro?
2) cliccando sul modulo “contatti.php”, me lo apre in automatico con Opera. Volevo provare ad aprirlo con un altro browser. Ma Chrome mi apre una sequenza senza fine di pagine bianche(devo stroncarlo). Internet Explorer(8, su Vista 64) mi apre una finestra di download che si pianta…
C’è sicuramente qualcosa su cui sbaglio, ma non riesco a capire…
Ciao Spagliani e benvenuto su YIW.
Da quello che mi hai detto, mi sembra di aver capito che hai lanciato il file da una semplice cartella del tuo pc e non dall’interno di un web server.
Devi installarne uno (puoi seguire la nostra guida a proposito) e poi aprire i file dal browser, come spiegato nell’articolo che ti ho linkato.
Tienimi aggiornato :)
Fatto…ed ora tutto si vede come dovrebbe!
Grazie!
Mi sto reinventando come realizzatore di siti web, e mi rendo conto ogni giorno di più di quante cose non so…ma su questo sito sto trovando un mare di cose grandiose!
Grazie ancora!
@JustB: sto procedendo nella realizzazione del form ed ho un problemino…nel form, gli utenti dovrebbero poter selezionare la quantità di vari articoli da un menù a tendina(uno per articolo), ed in fondo gli calcola il totale, moltiplicando il prezzo per i vari articoli.
La cosa funziona, ma ho un problema: Quando premo il button “calcola”, anche se fa correttamente il calcolo, mi riporta a zero(primo valore della select) le quantità di ogni articolo, mentre io vorrei che restasse quella scelta. Come posso fare?
Come non detto…facendo un po’ di prove, sono riuscito a farglielo rispuntare fuori,mettendogli come prima opzione nella lista del menù:
Unica pecca: se premo “invia” una volta, mi mantiene il valore, se lo do una seconda volta, no…devo sperare di non imbattermi in utenti veramente di coccio…ma ci spero poco! :-P
Grazie comunque…
Mancava questo…
(?php if ( isset( $missing ) && isset($quantitax) ) echo $quantitax; ?)
Dicevo…mancava questo, devo sostituire le >< con parentesi, sennò non appare…
Ciao spagliani,
scusa per il ritardo della mia risposta. Purtroppo senza vedere il codice è un po’ difficile capire come aiutarti.
Puoi postarlo sul forum, così possiamo migliorare lo script insieme.
A presto :)
Ti ringrazio vivamente per avere fatto questa guida, mi è stata veramente fondamentale per me che non mastico il php :D .. ancora grazie!
Ciao Simone e benvenuto su YIW,
sono lieto che la guida ti sia stata utile :)
JustB ho realizzato un form prendendo spunto da questo stupendo tutorial.
Ti pongo una domanda che potrebbe essere utile a diverse persone.
Perchè non crei un tutorial dove inserisci un controllo lato client e poi lato server?
In questo momento il mio form funziona con un doppio controllo non si sà mai :)
Ciao, bell’articolo! :)
Non ho capito bene un paio di cose:
l’utilizzo che fai della funzione strlen in questo passo:
if(!strlen ($temp) && in_array($key, $required)){ array_push($missing, $key);E’ un modo diretto per dire che se la variabile $temp non ha valore (o meglio è uguale a 0) venga messa nell’array missing?
E poi mi sfugge questo commento
Cosa riguarda questa compatibilità? Che vuol dire, che alcuni client non ricevono oltre i 70 caratteri? Sarebbe un pò limitante…
Grazie
Ciao, bell’articolo!
il form fuziona correttamente, però quando mi mandano l’email i caratteri accentati si vedono codificati male , ho provate a mettere nella pagina contenente il form e un quella del ccs un UTF adatto ma non mi funziona.
ciao
Ciao ste, scusami ho avuto anch’io le stesso problema, hai risolto alla fine? ciao
Ho lo stesso problema anche io e con la soluzione proposta da ste0987 non funge :(
Help!
ciao plata , non ho ancora risolto il tutto.
Il problema dovrebbe essere nella codifica dei caratteri del database, prova a vedere questa pagina:
http://www.php.net/manual/en/function.utf8-decode.php
ciao, io non ho utilizzato il db, cmq io invece sono riuscito solo a risolvere con il campo messaggio, ma non con gli altri campi. Ho agito qui:
${$key} = $temp; //htmlentities($temp); //in questo caso crea $nome, $email, $oggetto, $commento
e qui
//limita la lunghezza a 70 caratteri per la compatibilità
$contenuto_email = tripslashes(utf8_decode(wordwrap($contenuto_email,70)));
vedi se riesci tu negli altri io non ci sono riuscito ancora, ciao
ciao ste, alla fine ho risolto il problema così:
//ho aggiunto qui
$nome = stripslashes(utf8_decode($nome));
$oggetto = stripslashes(utf8_decode($oggetto));
$messaggio = stripslashes(utf8_decode($messaggio));
prima delle variabili contenuto_mail:
$contenuto_email = “Nome: $nome\n\n”; //Queste variabili sono create nel passaggio precedente
$contenuto_email .= “Email: $email\n\n”;
$contenuto_email .= “Oggetto: $oggetto\n\n”;
$contenuto_email .= “Messaggio:\n $messaggio\n\n”;
e sempre qui:
//se il campo è aspettato, setta la variabile associata
elseif(in_array($key, $expected)){
${$key} = $temp; //htmlentities($temp); //in questo caso crea $nome, $email, $oggetto, $commento
spero ti possa servire. ciao
Ciao JustB, innanzitutto complimenti per il tutorial, mi è stato molto utile.
Riscontro però un problema all’invio delle mail, dove praticamente mi dice:
Warning: mail() [function.mail]: Failed to connect to mailserver at “” port 25, verify your “SMTP” and “smtp_port” setting in php.ini or use ini_set() in C:\wamp\www\…\contatti.php on line 26
mi sapresti aiutare a risolvere questo dilemma?
Grazie mille in anticipo
…praticamente si è autorisolto, visto che il problema era su server locale, sarei però curioso di sapere come risolvere la questione.
Ecco qui un punto che non riesco a risolvere…
le mail non giungono a destinazione, qualcuno saprebbe aiutarmi e spiegarmi il perchè?
Grazie milleeeeee :)
Ciao a tutti, ottimo sito :)
Io sono alle prime armi con il php, ho scaricato questo bellissimo modulo contatti per iniziare a imparare qualcosina, ma se lo faccio partire da locale trovo l’errore “failed to connect to mailserve at 127.0.0.1 port 25, verify your smtp” etc etc nella linea 32.
Come potrei risolvere a questo inconveniente?
Grazie
Ciao!
ecco io sto diventando matta per poter trovare il codice HTML di un form come quello che ho appena compilato..anche senza richiesta del sito…l’importante è che rimanga anonima l’email, che ovviamente ricevo io in posta…e tutto il resto rimane sul sito…
Help me!!..sapresti aiutarmi?? te nè sari davvero grata se lo avessi già pronto!!
grazie e..complimenti bel sito e molto interessante!
ciao!
Grazie utilissimo ma se io volessi anche controllare che una checkbox (ad esempio la privacy) è stata cliccata? Per favore rispondete :’(
Salve, innanzitutto voglio farvi i complimenti per questo sito davvero interessante! ho installato il vostro form contatti… vorrei apportare una modifica… vorrei che alla conferma di invio del messaggio il cliente venisse indirizzato verso un link…. come posso fare? grazie
Grazie mille è il post mi è stato di enorme aiuto!
a me non funziona, ho eseguito alla lettera le istruzioni :
1) decommentare, rimuovendo i due slash la variabile $destinatario, nel file settings.php, e sostituire l’email predefinita (la mia :) )
2) nel file contatti.php, alla riga 35, sostituire il primo parametro della funzione mail, $email, con la variabile $destinatario, ottenendo così la seguente funzione:
mail($destinatario, $oggetto, $contenuto_email, ‘From: ‘.$email)
ma niente
Ciao, ottimo script e funzionale. Ma volevo sapere se è possibile implementare un campo in cui scegliere il destinatario a cui inviare il messaggio. Ad es.: Admin, Webmaster, ecc.
In modo da smistare il messaggio alla persona di competenza, grazie :)
Ciao,
sì, non dovrebbe essere molto difficile.
Basta inserire una select nell’HTML e poi, a seconda del valore scelto, associare nello script PHP l’email appropriata.
Potrei inserire una cosa del genere:
Destinatario *
<select name="destinatario" id="destinatario" tabindex="3"
value="”
class=”">
SELEZIONA IL DESTINATARIO
TIZIO
CAIO
Però non ho idea di cosa mettere nel lato php, immagino si debba lavorare su setting
Non mi ha copiato bene il codice..vabbè più o meno
Destinatario *
< select name="destinatario" id="destinatario" tabindex="3"
value="”
class=”">
SELEZIONA IL DESTINATARIO
TIZIO
CAIO
Trovata la soluzione, grazie mille JustB :-))
La sintassi corretta, da mettere in contact.php è questa:
foreach ($_POST as $key => $value){ //elimina eventuali spazi aggiuntivi $temp = $value ? trim($value) : ''; //se è richiesta ma vuota aggiungila all'array missing if(!strlen ($temp) && in_array($key, $required)){ array_push($missing, $key); } //se il campo è aspettato, setta la variabile associata elseif(in_array($key, $expected)){ ${$key} = htmlentities($temp); //in questo caso crea $nome, $email, $sito, $commento } } switch ($_POST['destinatario']){ case 'mail1': $destinatario="mail1@mail.com"; break; case 'mail2': $destinatario="mail2@mail.com"; break; default: $destinatario="default@mail.com"; break; }Naturalmente va eliminato il codice relativo al destinatario in settings.php
C’è una soluzione per le lettere accentate? Quando invio mi segna e&grave ecc.
Il metodo segnato in un commento non mi funziona purtroppo :(
Salve a tutti e complimenti all’autore. Da questo codice sto imparando molte cose anche perchè sono un profano del PHP; io avrei l’esigenza di inviare il contenuto del form non ad un solo indirizzo ma bensi a 5. Quindi cliccando su invia la mail arriva a 5 destinatari diversi. Qualcuno potrebbe indicarmi la strada? Grazie mille.