[Risolto] "se sbaglio mi corrigerete"

 :D

Ciao a tutti. Premetto che sono sono un programmatore e che le mie competenze per quanto riguarda php sono minime, quindi ciò che faccio è cercare di recuperare degli script su internet e metterli insieme al meglio...  :buck:

Sul sito che ho sviluppato per un mio cliente ho creato la classica pagina contatti con un contact form validato sia con jquery che con php. La validazione client-side funziona, ma, sebbene inserisca tutti i campi richiesti, non riesco a far mandare la mail perché si verifica qualche problema nella validazione php.

La pagina è visualizzabile all'indirizzo http://bakokkogroup.it/contatti.php

Ecco qui il codice della mia pagina ripulito delle parti non necessarie:

<?php
//If the form is submitted
if( isset($_POST['submit']) )
{
   //  NAME (requested) field validation
   if(trim($_POST['name']) == '') {
      $hasError = true;
   } else {
      $name = trim($_POST['name']);
   }

   //  TELEPHONE (optional) field validation
   if (!eregi("^[0-9]+$", trim($_POST['telephone']))) {
      $hasError = true;
   } else {
      $subject = trim($_POST['telephone']);
   }
   
   //  FAX field validation optional
   if (!eregi("^[0-9]+$", trim($_POST['fax']))) {
      $hasError = true;
   } else {
      $subject = trim($_POST['fax']);
   }
   
   //  EMAIL (requested) field validation
   if(trim($_POST['email']) == '')  {
      $hasError = true;
   } else if (!eregi("^[A-Z0-9._%-]+@[A-Z0-9._%-]+\.[A-Z]{2,4}$", trim($_POST['email']))) {
      $hasError = true;
   } else {
      $email = trim($_POST['email']);
   }
   
   // ADDRESS (optional) field validation
   if (!eregi("^[a-zA-Z0-9]+$", trim($_POST['address']))) {
      $hasError = true;
   } else {
      $subject = trim($_POST['address']);
   }

   // CITY (optional) field validation
   if (!eregi("^[a-zA-Z0-9]+$", trim($_POST['city']))) {
      $hasError = true;   
   } else {
      $name = trim($_POST['city']);
   }
   
   //  Check to make sure MESSAGE (requested) were entered
   if(trim($_POST['message']) == '') {
      $hasError = true;
   } else {
      if(function_exists('stripslashes')) {
         $messages = stripslashes(trim($_POST['message']));
      } else {
         $messages = trim($_POST['message']);
      }
   }

   //  If there is no error, send the email
   if( !isset($hasError) ) {
      $emailTo = 'info@bakokkogroup.it'; //destination email address here
      $body = "Nome e Cognome: $name \n\nTelefono: $telephone \n\nFax: $fax \n\nEmail: $email \n\nIndirizzo: $address \n\nCittà: $city \n\nMessaggio:\n $message";
      $headers = 'From: My Site <'.$emailTo.'>' . "\r\n" . 'Reply-To: ' . $email;
      mail($emailTo, $subject, $body, $headers);
      $emailSent = true;
   }
}
?>

<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">
   <head>
      <title><?php echo LANG_CONTACTS_PAGE_TITLE; ?></title>
   </head>

   <body id="contatti" onload="initialize()">

      <div id="container"> <!-- This wrap div needs to encompass everything except the footer div at bottom -->

         <div id="main" class="clearfix">

            <div id="content" class="clearfix">
                              
               <div class="media-area">
                  
                  <h3><?php echo LANG_FORM_TITLE; ?></h3>
                  
                  <?php if(isset($hasError)) { //If errors are found ?>
                     <p class="form-error"><?php echo LANG_FORM_ERROR_MSG; ?></p>
                  <?php } ?>
               
                  <?php if(isset($emailSent) && $emailSent == true) { //If email is sent ?>
                     <p class="form-success"><?php echo LANG_FORM_SUCCESS_MSG; ?></p>
                  <?php } ?>
                  
                  <form id="contactform" method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
                        
                     <label class="inlined" for="name"><?php echo LANG_FORM_LABEL_NAME; ?></label>
                     <input type="text" class="input-text validate[required,custom[onlyLetter],length[0,50]]" id="name" name="name"  value="<?php echo $_POST['name'] ?>" />
      
                     <label class="inlined" for="telephone"><?php echo LANG_FORM_LABEL_TELEPHONE; ?> <span>(<?php echo LANG_FORM_LABEL_OPTIONAL; ?>)</span></label>
                     <input type="text" class="input-text validate[optional,custom[onlyNumber],length[0,20]]" id="telephone" name="telephone" value="<?php echo $_POST['telephone'] ?>"/>
      
                     <label class="inlined" for="fax"><?php echo LANG_FORM_LABEL_FAX; ?> <span>(<?php echo LANG_FORM_LABEL_OPTIONAL; ?>)</span></label>
                     <input type="text" class="input-text validate[optional,custom[onlyNumber],length[0,20]]" id="fax" name="fax" value="<?php echo $_POST['fax'] ?>"/>
                                                         
                     <label class="inlined" for="email"><?php echo LANG_FORM_LABEL_EMAIL; ?></label>
                     <input type="text" class="input-text validate[required,custom[email],length[0,50]]" id="email"  name="email" value="<?php echo $_POST['email'] ?>"/>
               
                     <label class="inlined" for="address"><?php echo LANG_FORM_LABEL_ADDRESS; ?> <span>(<?php echo LANG_FORM_LABEL_OPTIONAL; ?>)</span></label>
                     <input type="text" class="input-text validate[optional,length[0,100]]" id="address" name="address" value="<?php echo $_POST['address'] ?>" />
                     
                     <label class="inlined" for="city"><?php echo LANG_FORM_LABEL_CITY; ?> <span>(<?php echo LANG_FORM_LABEL_OPTIONAL; ?>)</span></label>
                     <input type="text" class="input-text validate[optional,custom[onlyLetter],length[0,50]]" id="city" name="city" value="<?php echo $_POST['city'] ?>" />
                     
                     <label class="textarea inlined" for="message"><?php echo LANG_FORM_LABEL_MESSAGE; ?></label>
                     <textarea class="input-text validate[required,length[6,300]]" id="message" name="message" rows="6" cols="150"><?php echo $_POST['message'] ?></textarea>
      
                     <input class="button" type="submit" value="<?php echo LANG_FORM_LABEL_SUBMIT; ?>" name="submit" />
                     
                  </form> <!-- END form -->

               </div>
      
            </div> <!-- END div-content -->
               
         </div> <!-- END div-main -->
      
      </div> <!-- END div-container -->      

   </body>
</html>

Qualcuno di voi riesce ad individuare il mio errore (o orrore)?

Grazie in anticipo

Mattia

inviato 6 anni fa
yomo
yomo
1
modificato 6 anni fa
Mario Santagiuliana
X 0 X

Usa pure il tag php di bbcode per inserire il codice php.

Nei log del tuo server o nei vari output non ricevi errori?

risposto 6 anni fa
Mario Santagiuliana
X 0 X

ciao MarioS,

scusami, non mi ero accorto del pulsante "php" nell'editor del forum...  :-[

Per quanto riguarda gli errori nel mio codice, io non ho attivato nessun debugger e quindi non mi vengono restituiti errori o avvisi.

Cosa mi consigli di fare?

risposto 6 anni fa
yomo
yomo
1
X 0 X

Se ci sono errori di sintassi, o se il php genera un errore, nel log di apache (o del tuo webserver) puoi rivedere tali errori.

Non si necessita di un vero e proprio debug. Se vuoi fare un debug puoi usare xdebug.

Puoi comunque attivare la visualizzazione degli errori del php, vedi il file di configurazione, la documentazione e cerca nel forum.

Inoltre questa riga:

//  If there is no error, send the email

if( !isset($hasError) ) {

Il controllo if non lo farei con la funzione isset. Si tratta di una variabile booleana, sfrutterei questa cosa, all'inizio imposto la variabile come false e poi farei così:

//  If there is no error, send the email
if( !$hasError ) {

Se sei sicuro che il tuo server è configurato correttamente, prova a commentare quell'if e vedere se comunque (indipendentemente dalla variabili $hasError) l'email non viene inviata.

risposto 6 anni fa
Mario Santagiuliana
X 0 X

grazie ancora MarioS, allora, vediamo di spiegare un attimo: sto lavorando in locale Mac con Mamp.

Ho configurato il file php.ini settando

error_reporting  =  E_ALL

display_errors = On

Ora avendo fatto questa operazione all'interno dei campi di input del form mi escono avvisi del tipo:

"<br /> <b>Notice</b>:  Undefined index:  name in <b>/Users/xxx/xxx/contatti.php</b> on line <b>203</b><br />"

"<br /> <b>Notice</b>:  Undefined index:  telephone in <b>/Users/Mattia/Sites/contatti.php</b> on line <b>206</b><br />"

"<br /> <b>Notice</b>:  Undefined index:  email in <b>/Users/Mattia/Sites/contatti.php</b> on line <b>212</b><br />"

Per quanto riguarda invece la funzione isset che mi consigli di non usare, potresti scrivere il codice per definire la variabile?

Ho provato a commentare if( !$hasError ) ma non riesco ugualmente a mandare la mail, infatti lo script mi restituisce sempre il messaggio d'errore che ho impostato "Errore! Controllate di aver inserito correttamente tutti i campi richiesti. Grazie."

Come posso muovermi?

risposto 6 anni fa
yomo
yomo
1
X 0 X
Per quanto riguarda invece la funzione isset che mi consigli di non usare, potresti scrivere il codice per definire la variabile?

Ti ho già detto come modificare la riga con l'isset, non devi commentare l'if.

Fa un debug della tua applicazione con xdebug per risalire alla causa del tuo problema. Il codice mi sembra corretto...

risposto 6 anni fa
Mario Santagiuliana
X 0 X

Scusami tanto MarioS, ma per capire avrei bisogno di qualche esempio concreto. Con php, sono proprio una zappa...  :buck: Prometto che inizierò a studiare!

risposto 6 anni fa
yomo
yomo
1
X 0 X

... questa riga:

//  If there is no error, send the email

if( !isset($hasError) ) {

... così:

//  If there is no error, send the email
if( !$hasError ) {
risposto 6 anni fa
Mario Santagiuliana
X 0 X

Dopo una settimana di malattia eccomi di nuovo a rompermi la testa su sto form...   :wallbash:

Innanzitutto grazie Marios per avermi dato preziose indicazioni. O0

Ecco qui il codice sistemato e corretto da alcuni errori:

<?php
//If the form is submitted
if( isset($_POST['submit']) )
{
   //  NAME (requested) field validation
   if (trim($_POST['name']) == '') {
      $hasError = true;
   } else if (!eregi("^[a-zA-Z]+$", trim($_POST['name']))) {
      $hasError = true;
      print "Errore name<br />";
   } else {
      $name = trim($_POST['name']);
   }

   //  TELEPHONE (optional) field validation
   if (!eregi("^[0-9]+$", trim($_POST['telephone']))) {
      $hasError = true;
      print "Errore telephone<br />";
   } else {
      $telephone = trim($_POST['telephone']);
   }
   
   //  FAX (optional) field validation
   if (!eregi("^[0-9]+$", trim($_POST['fax']))) {
      $hasError = true;
      print "Errore fax<br />";
   } else {
      $fax = trim($_POST['fax']);
   }
   
   //  EMAIL (requested) field validation
   if (trim($_POST['email']) == '') {
      $hasError = true;
   } else if (!eregi("^[A-Z0-9._%-]+@[A-Z0-9._%-]+\.[A-Z]{2,4}$", trim($_POST['email']))) {
      $hasError = true;
      print "Errore email<br />";   
   } else {
      $email = trim($_POST['email']);
   }
   
   // ADDRESS (optional) field validation
   if (!eregi("^[a-zA-Z0-9]+$", trim($_POST['address']))) {
      $hasError = true;
      print "Errore address<br />";   
   } else {
      $address = trim($_POST['address']);
   }

   // CITY (optional) field validation
   if (!eregi("^[a-zA-Z]+$", trim($_POST['city']))) {
      $hasError = true;   
      print "Errore city<br />";   
   } else {
      $city = trim($_POST['city']);
   }
   
   //  Check to make sure MESSAGE (requested) were entered
   if (trim($_POST['message']) == '') {
      $hasError = true;
   } else {
      if(function_exists('stripslashes')) {
         $messages = stripslashes(trim($_POST['message']));
      print "Errore message<br />";   
      } else {
         $messages = trim($_POST['message']);
      }
   }

   //  If there is no error, send the email
   if ( !$hasError ) {
      $emailTo = 'mattia@weston.it'; //destination email address here
      $body = "
      Nome e Cognome: $name \n\n
      Telefono: $telephone \n\n
      Fax: $fax \n\n
      Email: $email \n\n
      Indirizzo: $address \n\n
      Città: $city \n\n
      Messaggio:\n $message
      ";
      $headers = 'From: My Site <'.$emailTo.'>' . "\r\n" . 'Reply-To: ' . $email;
      mail($emailTo, $subject, $body, $headers);
      $emailSent = true;
   }
}
?>


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="it" lang="it">
   <head>
      <title>form</title>      
   </head>

   <body id="contatti" onload="initialize()">
   
      <h3>Contact form</h3>
      
      <?php if(isset($hasError)) { //If errors are found ?>
         <p class="form-error" style="color:red">Messaggio di errore</p>
      <?php } ?>
   
      <?php if(isset($emailSent) && $emailSent == true) { //If email is sent ?>
         <p class="form-success" style="color:green">Email inviata correttamente</p>
      <?php } ?>
      
      <form id="contactform" method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
            
         <label class="inlined" for="name">Nome e Cognome</label>
         <input type="text" class="input-text validate[required,custom[onlyLetter],length[0,50]]" id="name" name="name"  value="<?php echo $_POST['name'] ?>" />
   
         <label class="inlined" for="telephone">Telefono (optional)</span></label>
         <input type="text" class="input-text validate[optional,custom[onlyNumber],length[0,20]]" id="telephone" name="telephone" value="<?php echo $_POST['telephone'] ?>"/>
   
         <label class="inlined" for="fax">Fax (opzionale)</span></label>
         <input type="text" class="input-text validate[optional,custom[onlyNumber],length[0,20]]" id="fax" name="fax" value="<?php echo $_POST['fax'] ?>"/>
                                             
         <label class="inlined" for="email">Email</label>
         <input type="text" class="input-text validate[required,custom[email],length[0,50]]" id="email"  name="email" value="<?php echo $_POST['email'] ?>"/>
   
         <label class="inlined" for="address">Indirizzo (opzionale)</span></label>
         <input type="text" class="input-text validate[optional,length[0,100]]" id="address" name="address" value="<?php echo $_POST['address'] ?>" />
         
         <label class="inlined" for="city">Citta' (opzionale)</span></label>
         <input type="text" class="input-text validate[optional,custom[onlyLetter],length[0,50]]" id="city" name="city" value="<?php echo $_POST['city'] ?>" />
         
         <label class="textarea inlined" for="message">Messaggio</label>
         <textarea class="input-text validate[required,length[6,300]]" id="message" name="message" rows="6" cols="150"><?php echo $_POST['message'] ?></textarea>
   
         <input class="button" type="submit" value="invia" name="submit" />
         
      </form> <!-- END form -->

   </body>
</html>

Il problema è che non funziona ancora perchè non mi permette di inserire gli spazi né all'interno degli input text né all'interno della textarea: es. nel campo address non mi lascia inserire "via verdi" ma dovrei inserirlo senza spazio "viaverdi", solo così mi lascia inviare il messaggio senza ritornarmi errore.

Ecco a voi quindi il domandone finale:

Come modificare i vari

eregi("^[a-zA-Z]+$")
eregi("^[0-9]+$")
eregi("^[a-zA-Z0-9]+$")

affinché mi si permetta di inserire delle parole "staccate" da spazi senza che il codice mi si incazzi?

Grazie di nuovo

risposto 6 anni fa
yomo
yomo
1
modificato 6 anni fa
X 0 X

Altra cosa:

il campo textarea mi dà messaggio e non mi passa restituisce nella email inviata ciò che vi avevo scritto dentro

Trovate qualche errore in questo codice? Il mio occhio non è molto allenato...  :buck:

//  Check to make sure MESSAGE (requested) were entered
   if (trim($_POST['message']) == '') {
      $hasError = true;
   } else {
      if(function_exists('stripslashes')) {
         $messages = stripslashes(trim($_POST['message']));
      print "Errore message<br />";   
      } else {
         $messages = trim($_POST['message']);
      }
   }
risposto 6 anni fa
yomo
yomo
1
X 0 X

1) devi studiare meglio le espressioni regolari, sono un po' ostiche per me che non le vedo tutti i giorni:

http://www.pluto.it/files/ildp/guide/abs/regexp.html

Poi se usi la funzione eregi non capisco perchè nella tua espressione regolare metti sia i caratteri maiuscoli e minuscoli, tanto è insensibile a questo.

Al posto tuo comunque non userei le espressioni regolari su alcuni campi. Esempio il nome della persona, non vedo perchè usare questo metodo, piuttosto userei delle funzioni per ripulire l'input da eventuali caratteri o stringhe non consentite (es. tag html o altro).

2) Perchè stampi con print un "Errore message" se la funzione stripslashes esiste?

Comunque il tuo problema non sta li ma qui:

Messaggio:\n $message

Quando componi l'email usi $message e non $messages, sono due variabili differenti.

risposto 6 anni fa
Mario Santagiuliana
X 0 X

Grazie ancora (Super) MarioS! Ti ringrazio per i consigli e la segnalazione dell'errore stupido! ($message / $messages)  :buck: Sono uno stordito!

Ho modificato la validazione cercando di seguire i tuoi consigli e sostituendo le funzioni deprecate (eregi) con preg_match. Ho anche cercato di utilizzare le funzioni filter e sanitize di php5.

Ecco qui il mio nuovo codice:

<?php
//If the form is submitted
if( isset($_POST['submit']) )
{
   //  NAME (requested) field validation
   if (trim($_POST['name']) == '') {
      $hasError = true;
   } else {
      $name = filter_input(trim($_POST['name']), FILTER_SANITIZE_STRING);
   } 
   
   //  TELEPHONE (optional) field validation
   if (!preg_match("/[0-9]+/", trim($_POST['telephone']))) {
      $hasError = true;      
   } else {
      $telephone = filter_input(trim($_POST['telephone']), FILTER_SANITIZE_NUMBER_INT);
   }
   
   //  FAX (optional) field validation
   if (!preg_match("/[0-9]+/", trim($_POST['fax']))) {
      $hasError = true;
   } else {
      $fax = filter_input(trim($_POST['fax']), FILTER_SANITIZE_NUMBER_INT);
   }
   
   //  EMAIL (requested) field validation
   if (trim($_POST['email']) == '') {
      $hasError = true;
   } else if (!preg_match("/[A-Z0-9._%-]+@[A-Z0-9._%-]+\.[A-Z]{2,4}/", trim($_POST['email']))) {
      $hasError = true;   
   } else {
      $email = filter_input(trim($_POST['email']), FILTER_SANITIZE_EMAIL);
   }
   
   // ADDRESS (optional) field validation
   if (!preg_match("/[a-zA-Z0-9]+/", trim($_POST['address']))) {
      $hasError = true;
   } else {
      $address = filter_input(trim($_POST['address']), FILTER_SANITIZE_STRING);
   }

   // CITY (optional) field validation
   if (!preg_match("/[a-zA-Z]+/", trim($_POST['city']))) {
      $hasError = true;   
   } else {
      $city = filter_input(trim($_POST['city']), FILTER_SANITIZE_STRING);
   }
   
   //  Check to make sure MESSAGE (requested) were entered
   if (trim($_POST['message']) == '') {
      $hasError = true;
   } else {
      if(function_exists('stripslashes')) {
         $message = stripslashes(trim($_POST['message']));
      } else {
         $message = filter_input(trim($_POST['message']), FILTER_SANITIZE_SPECIAL_CHARS);
      }
   }

   //  If there is no error, send the email
   if ( !$hasError ) {
      $emailTo = 'indirizzo@dominio.est'; //destination email address here
      $body = "Nome e Cognome: $name \n\n
            Telefono: $telephone \n\n
            Fax: $fax \n\n
            Email: $email \n\n
            Indirizzo: $address \n\n
            Città: $city \n\n
            Messaggio:\n $message";
      $headers = 'From: Contact Form Sito <'.$emailTo.'>' . "\r\n" . 'Reply-To: ' . $email;
      mail($emailTo, $subject, $body, $headers);
      $emailSent = true;
   }
}
?>

Dandoci un occhio così vedi qualche errore? Non riesco a capire perché ancora non funzioni...

risposto 6 anni fa
yomo
yomo
1
X 0 X

Ottieni errori?

Fai un debug.

risposto 6 anni fa
Mario Santagiuliana
X 0 X

ottenevo un errore nel campo e-mail e l'ho risolto sostituendo la porzione di codice:

//  EMAIL (requested) field validation
if (trim($_POST['email']) == '') {
$hasError = true;
} else if (!preg_match("/[A-Z0-9._%-]+@[A-Z0-9._%-]+\.[A-Z]{2,4}/", trim($_POST['email']))) {
$hasError = true;
} else {
$email = filter_input(trim($_POST['email']), FILTER_SANITIZE_EMAIL);
}

con:

//  EMAIL (requested) field validation
if (trim($_POST['email']) == '') {
$hasError = true;
} else if (!filter_var(trim($_POST['email']), FILTER_VALIDATE_EMAIL)) {
$hasError = true;   
} else {
$email = filter_input(trim($_POST['email']), FILTER_SANITIZE_EMAIL);
}

Nonostante ciò però ci sono ancora diversi errori:

1. il form erroneamente NON invia la mail se i campi opzionali (telephone, fax, address, city) non sono compilati

2. nella mail con vengono stampate le stringhe inserite nel form se non quella del message (probabilmente ho commesso qualche errore nello scrivere le funzioni di filter e sanitize)

Qualche dritta da chi ha l'occhio più allenato di me?

Thanks...

risposto 6 anni fa
yomo
yomo
1
X 0 X

Perchè non fai una cosa?

Scrivi uno script minimale che funzioni, poi piano piano inizi ad aggiungere i controlli.

risposto 6 anni fa
Mario Santagiuliana
X 0 X

Ecco qui le modifiche apportate al codice:

<?php
//If the form is submitted
if( isset($_POST['submit']) )
{
   //  NAME (requested) field validation
   if (trim($_POST['name']) == '') {
      $hasError = true;
   //   echo "errore: NAME vuoto<br />";
   } else {
      $name = filter_input(INPUT_POST, 'name', FILTER_SANITIZE_STRING);
   //   echo (filter_input(INPUT_POST, 'name', FILTER_SANITIZE_STRING)."<br />");
   } 
   
   //  TELEPHONE (optional) field validation
   if (!preg_match('/[0-9]+/', trim($_POST['telephone']))) {
      $hasError = true;
   //   echo "errore: TELEPHONE con caratteri non permessi<br />";      
   } else {
      $telephone = filter_input(INPUT_POST, 'telephone', FILTER_SANITIZE_NUMBER_INT);
   //   echo (filter_input(INPUT_POST, 'telephone', FILTER_SANITIZE_NUMBER_INT)."<br />");
   }
   
   //  FAX (optional) field validation
   if (!preg_match('/[0-9]+/', trim($_POST['fax']))) {
      $hasError = true;
   //   echo "errore: FAX con caratteri non permessi<br />";
   } else {
      $fax = filter_input(INPUT_POST, 'fax', FILTER_SANITIZE_NUMBER_INT);
   //   echo (filter_input(INPUT_POST, 'fax', FILTER_SANITIZE_NUMBER_INT)."<br />");
   }
   
   //  EMAIL (requested) field validation
   if (trim($_POST['email']) == '') {
      $hasError = true;
   //   echo "errore: EMAIL vuoto<br />";
   } else if (!preg_match('/[a-zA-Z0-9_.-]+@[a-zA-Z0-9-]+.[a-zA-Z0-9-.]{2,4}+/', trim($_POST['email']))) {
      $hasError = true;
   //   echo "errore: EMAIL con caratteri non permessi<br />";   
   } else {
      $email = filter_input(INPUT_POST, 'email', FILTER_SANITIZE_EMAIL);
   //   echo (filter_input(INPUT_POST, 'email', FILTER_SANITIZE_EMAIL)."<br />");
   }
   
   // ADDRESS (optional) field validation
   if (!preg_match('/[a-zA-Z0-9]+/', trim($_POST['address']))) {
      $hasError = true;
   //   echo "errore: ADDRESS con caratteri non permessi<br />";   
   } else {
      $address = filter_input(INPUT_POST, 'address', FILTER_SANITIZE_STRING);
   //   echo (filter_input(INPUT_POST, 'address', FILTER_SANITIZE_STRING)."<br />");
   }

   // CITY (optional) field validation
   if (!preg_match('/[a-zA-Z]+/', trim($_POST['city']))) {
      $hasError = true;   
   //   echo "errore: CITY con caratteri non permessi<br />";   
   } else {
      $city = filter_input(INPUT_POST, 'city', FILTER_SANITIZE_STRING);
   //   echo (filter_input(INPUT_POST, 'city', FILTER_SANITIZE_STRING)."<br />");
   }
   
   //  Check to make sure MESSAGE (requested) were entered
   if(trim($_POST['message']) == '') {
      $hasError = true;
      echo "errore: MESSAGGIO vuoto<br />";
   } else {
      $message = filter_input(INPUT_POST, 'message', FILTER_SANITIZE_STRING);
   //   echo (filter_input(INPUT_POST, 'message', FILTER_SANITIZE_STRING));
   }

   //  If there is no error, send the email
   if ( !$hasError ) {
      $emailTo = 'indirizzo@dominio.est'; //destination email address here
      $body = "Nome e Cognome: $name \n\n
      Telefono: $telephone \n\n
      Fax: $fax \n\n
      Email: $email \n\n
      Indirizzo: $address \n\n
      Città: $city \n\n
      Messaggio:\n $message";
      $headers = 'From: Contact Form Sito <'.$emailTo.'>' . "\r\n" . 'Reply-To: ' . $email;
      mail($emailTo, $subject, $body, $headers);
      $emailSent = true;
   }
}
?>

La validazione ora mi sembra funzioni bene, disattivando i commenti e attivando i controlli mi sembra tutto a posto. L'unico dubbio che mi sorge è se sia sufficiente un SANITIZE_STRING per filtrare il 'message'. Secondo voi?

risposto 6 anni fa
yomo
yomo
1
X 0 X

In linea di massima direi che va bene.

Esistono vari filtri che puoi usare ed applicare comunque.

Dipende da come devono essere le email. Se solo testo devi rimuovere anche tutti i tag xml o html che un utente può inserire.

Ciao

risposto 6 anni fa
Mario Santagiuliana
X 0 X

grazie ancora per la tua grande disponibilità! MarioS for President!

Qui però sembra che le cose non finiscano mai: messa a posto la validazione e i filtri, ora non mi invia più le mail! Che cavolo può essere successo?

risposto 6 anni fa
yomo
yomo
1
X 0 X

Cerca di fare il debug dello script con xdebug. Ti aiuta a capire dove si ferma.

Sei sicuro che l'email non viene inviata? Guarda i log di apache.

Sei sicuro che l'indirizzo di destinazione sia corretto?

risposto 6 anni fa
Mario Santagiuliana
X 0 X

Sì MarioS, il mio indirizzo è settato correttamente, l'ho solo modificato nel codice postato qui sul post per motivi di privacy.

Per quanto riguarda il debug sono ancora un po' distante: sto cercando di installare in firefox firephp ma devo ancora studiare come installarlo ed adoperarlo correttamente. Nei prossimi giorni cercherò di fare anche quello. A proposito hai qualche chiara guida da consigliarmi?

Strana faccenda... cambiando rete (da lavoro a casa) il form invia/non invia la mail... nel senso che ieri sera da casa non inviava nulla, mentre oggi dal lavoro tutto funziona. Possibile?

risposto 6 anni fa
yomo
yomo
1
X 0 X

Non ho una guida in particolare da consigliarti.

FirePhp non l'ho mai usato, uso Vim.

Strana faccenda... cambiando rete (da lavoro a casa) il form invia/non invia la mail... nel senso che ieri sera da casa non inviava nulla, mentre oggi dal lavoro tutto funziona. Possibile?

Puoi essere più preciso e spiegare meglio lo scenario?

risposto 6 anni fa
Mario Santagiuliana
X 0 X

Ho notato inoltre che il mio form così scritto richiede che tutti i campi siano obbligatoriamente compilati per inviare correttamente la mail, mentre in realtà io vorrei che solo alcuni campi siano obbligatori mentre altri siano opzionali.

Vorrei quindi fare in modo che la mail venga mandata qualora i campi opzionali siano vuoti e che siano validati e filtrati solo nel momento in cui l'utente decide di scrivere dentro qualcosa.

Quindi come posso modificare questa parte dello script per fare ciò?

//  TELEPHONE (optional) field validation
if (!preg_match('/[0-9]+/', trim($_POST['telephone']))) {
$hasError = true;
//echo "errore: TELEPHONE con caratteri non permessi<br />";
} else {
$telephone = filter_input(INPUT_POST, 'telephone', FILTER_SANITIZE_NUMBER_INT);
//echo (filter_input(INPUT_POST, 'telephone', FILTER_SANITIZE_NUMBER_INT)."<br />");
}
risposto 6 anni fa
yomo
yomo
1
X 0 X
Puoi essere più preciso e spiegare meglio lo scenario?

Allora: sto creando questo form lavorando in locale su MacBook + MAMP. Semplicemente mentre ieri sera a casa (rete domestica adsl alice + airport) facendo il submit del form non mi arrivava nessuna mail, mentre stamattina dal lavoro (rete aziendale adsl alice + airport) mi arrivano.

Comunque credo che questo sia il male minore, potrei anche rinunciare a capire il perché non funzioni, non credo che questo mi ruberà ore di sonno!  Beata ignoranza! :P  :-[

risposto 6 anni fa
yomo
yomo
1
X 0 X

Ho notato inoltre che il mio form così scritto richiede che tutti i campi siano obbligatoriamente compilati per inviare correttamente la mail, mentre in realtà io vorrei che solo alcuni campi siano obbligatori mentre altri siano opzionali.

Vorrei quindi fare in modo che la mail venga mandata qualora i campi opzionali siano vuoti e che siano validati e filtrati solo nel momento in cui l'utente decide di scrivere dentro qualcosa.

Quindi come posso modificare questa parte dello script per fare ciò?

//  TELEPHONE (optional) field validation

if (!preg_match('/[0-9]+/', trim($_POST['telephone']))) {

$hasError = true;

//echo "errore: TELEPHONE con caratteri non permessi<br />";

} else {

$telephone = filter_input(INPUT_POST, 'telephone', FILTER_SANITIZE_NUMBER_INT);

//echo (filter_input(INPUT_POST, 'telephone', FILTER_SANITIZE_NUMBER_INT)."<br />");

}

Mi rispondo da solo: ho modificato in questo modo i campi opzionali.

//  TELEPHONE (optional) field validation
if (trim($_POST['telephone']) == '') {
$telephone = trim($_POST['telephone']);
} else if (!preg_match('/[0-9]+/', trim($_POST['telephone']))) {
$hasError = true;
echo "errore: TELEPHONE con caratteri non permessi<br />";      
} else {
$telephone = filter_input(INPUT_POST, 'telephone', FILTER_SANITIZE_NUMBER_INT);
echo (filter_input(INPUT_POST, 'telephone', FILTER_SANITIZE_NUMBER_INT)."<br />");
}

Secondo voi può andare?

risposto 6 anni fa
yomo
yomo
1
X 0 X

Per l'ultima domanda posta: si può andare, era un suggerimento che ti volevo dare.

Per il fatto che non riesci ad inviare l'email...

Verifica che arrivi ad avere compilato tutti i campi e l'errore si localizza all'invio della email, ad esempio fai così:

   //  If there is no error, send the email
   if ( !$hasError ) {
                echo "Procedo con l'invio dell'email"; //<----- Così vedi se entra nell'if.

      $emailTo = 'indirizzo@dominio.est'; //destination email address here
      $body = "Nome e Cognome: $name \n\n
      Telefono: $telephone \n\n
      Fax: $fax \n\n
      Email: $email \n\n
      Indirizzo: $address \n\n
      Città: $city \n\n
      Messaggio:\n $message";
      $headers = 'From: Contact Form Sito <'.$emailTo.'>' . "\r\n" . 'Reply-To: ' . $email;
      $inviata = mail($emailTo, $subject, $body, $headers); //<---- recuperiamo il valore della funzione
                if($inviata)
             $emailSent = true;
                else
                      echo "C'è qualche problema";
   }
}
?>

Controlla la tua casella di posta.

A casa dovresti controllare se hai delle porte chiuse sul tuo router.

risposto 6 anni fa
Mario Santagiuliana
X 0 X

Sistemato! Yuppie!  ;D Un supergrazie ancora a MarioS! Ti dedico questo successo! Senza di te non ce l'avrei mai fatta! :clapping:

Posto qui il mio codice definitivo:

<?php
//If the form is submitted
if( isset($_POST['submit']) )
{
   //  NAME (requested) field validation
   if (trim($_POST['name']) == '') {
      $hasError = true;
   //   echo "errore: NAME vuoto<br />";
   } else {
      $name = filter_input(INPUT_POST, 'name', FILTER_SANITIZE_STRING);
   //   echo (filter_input(INPUT_POST, 'name', FILTER_SANITIZE_STRING)."<br />");
   } 
   
   //  TELEPHONE (optional) field validation
   if (trim($_POST['telephone']) == '') {
      $telephone = trim($_POST['telephone']);
   } else if (!preg_match('/[0-9]+/', trim($_POST['telephone']))) {
      $hasError = true;
   //   echo "errore: TELEPHONE con caratteri non permessi<br />";      
   } else {
      $telephone = filter_input(INPUT_POST, 'telephone', FILTER_SANITIZE_NUMBER_INT);
   //   echo (filter_input(INPUT_POST, 'telephone', FILTER_SANITIZE_NUMBER_INT)."<br />");
   }
   
   //  FAX (optional) field validation
   if (trim($_POST['fax']) == '') {
      $fax = trim($_POST['fax']);
   } else if (!preg_match('/[0-9]+/', trim($_POST['fax']))) {
      $hasError = true;
   //   echo "errore: FAX con caratteri non permessi<br />";
   } else {
      $fax = filter_input(INPUT_POST, 'fax', FILTER_SANITIZE_NUMBER_INT);
   //   echo (filter_input(INPUT_POST, 'fax', FILTER_SANITIZE_NUMBER_INT)."<br />");
   }
   
   //  EMAIL (requested) field validation
   if (trim($_POST['email']) == '') {
      $hasError = true;
   //   echo "errore: EMAIL vuoto<br />";
   } else if (!preg_match('/[a-zA-Z0-9_.-]+@[a-zA-Z0-9-]+.[a-zA-Z0-9-.]{2,4}+/', trim($_POST['email']))) {
      $hasError = true;
   //   echo "errore: EMAIL con caratteri non permessi<br />";   
   } else {
      $email = filter_input(INPUT_POST, 'email', FILTER_SANITIZE_EMAIL);
   //   echo (filter_input(INPUT_POST, 'email', FILTER_SANITIZE_EMAIL)."<br />");
   }
   
   // ADDRESS (optional) field validation
   if (trim($_POST['address']) == '') {
      $fax = trim($_POST['address']);
   } else if (!preg_match('/[a-zA-Z0-9]+/', trim($_POST['address']))) {
      $hasError = true;
   //   echo "errore: ADDRESS con caratteri non permessi<br />";   
   } else {
      $address = filter_input(INPUT_POST, 'address', FILTER_SANITIZE_STRING);
   //   echo (filter_input(INPUT_POST, 'address', FILTER_SANITIZE_STRING)."<br />");
   }

   // CITY (optional) field validation
   if (trim($_POST['city']) == '') {
      $fax = trim($_POST['city']);
   } else if (!preg_match('/[a-zA-Z]+/', trim($_POST['city']))) {
      $hasError = true;   
   //   echo "errore: CITY con caratteri non permessi<br />";   
   } else {
      $city = filter_input(INPUT_POST, 'city', FILTER_SANITIZE_STRING);
   //   echo (filter_input(INPUT_POST, 'city', FILTER_SANITIZE_STRING)."<br />");
   }
   
   //  Check to make sure MESSAGE (requested) were entered
   if(trim($_POST['message']) == '') {
      $hasError = true;
   //   echo "errore: MESSAGGIO vuoto<br />";
   } else {
      $message = filter_input(INPUT_POST, 'message', FILTER_SANITIZE_STRING);
   //   echo (filter_input(INPUT_POST, 'message', FILTER_SANITIZE_STRING));
   }

   //  If there is no error, send the email
   if ( !$hasError ) {
      $emailTo = 'indirizzo@dominio.'est; //destination email address here
      $subject = 'Soggetto';
      $headers = "From: " . "$email" . "\r\n";
      $headers .= "Reply-To: ". "$email" . "\r\n";
      $headers .= "CC: indirizzo@dominio.est\r\n";
      $headers .= "MIME-Version: 1.0\r\n";
      $headers .= "Content-Type: text/html; charset=utf-8\r\n";
      $body = '<html><body>';
      $body .= '<h3>Messaggio inviato da ' . "$name" . ' tramite Contact Form</h3>';
      $body .= "<p><strong>Nome e Cognome: </strong>" . "$name" . "</p>";
      $body .= "<p><strong>Telefono: </strong>" . "$telephone" . "</p>";
      $body .= "<p><strong>Fax: </strong>" . "$fax" . "</p>";
      $body .= "<p><strong>Email: </strong>" . "$email" . "</p>";
      $body .= "<p><strong>Indirizzo: </strong>" . "$address" . "</p>";
      $body .= "<p><strong>Città: </strong>" . "$city" . "</p>";      
      $body .= "<p><strong>Messaggio: </strong>" . "$message" . "</p>";      
      $body .= '</body></html>';
      mail($emailTo, $subject, $body, $headers);
      $emailSent = true;
   }
}
?>


<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="it" lang="it">
   <head>
      <title>form</title>      
   </head>

   <body id="contatti" onload="initialize()">
   
      <?php if(isset($hasError)) { //If errors are found ?>
         <hr /><p class="form-error" style="color:red">Messaggio di errore</p><hr />
      <?php } ?>
   
      <?php if(isset($emailSent) && $emailSent == true) { //If email is sent ?>
         <hr /><p class="form-success" style="color:green">Email inviata correttamente</p><hr />
      <?php } ?>
   
      <h3>Contact form</h3>
            
      <form id="contactform" method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
            
         <label class="inlined" for="name">Nome e Cognome</label>
         <input type="text" class="input-text validate[required,custom[onlyLetter],length[0,50]]" id="name" name="name"  value="<?php echo $_POST['name'] ?>" /><br />
   
         <label class="inlined" for="telephone">Telefono (optional)</span></label>
         <input type="text" class="input-text validate[optional,custom[onlyNumber],length[0,20]]" id="telephone" name="telephone" value="<?php echo $_POST['telephone'] ?>"/><br />
   
         <label class="inlined" for="fax">Fax (opzionale)</span></label>
         <input type="text" class="input-text validate[optional,custom[onlyNumber],length[0,20]]" id="fax" name="fax" value="<?php echo $_POST['fax'] ?>"/><br />
                                             
         <label class="inlined" for="email">Email</label>
         <input type="text" class="input-text validate[required,custom[email],length[0,50]]" id="email"  name="email" value="<?php echo $_POST['email'] ?>"/><br />
   
         <label class="inlined" for="address">Indirizzo (opzionale)</span></label>
         <input type="text" class="input-text validate[optional,length[0,100]]" id="address" name="address" value="<?php echo $_POST['address'] ?>" /><br />
         
         <label class="inlined" for="city">Citta' (opzionale)</span></label>
         <input type="text" class="input-text validate[optional,custom[onlyLetter],length[0,50]]" id="city" name="city" value="<?php echo $_POST['city'] ?>" /><br />
         
         <label class="textarea inlined" for="message">Messaggio</label>
         <textarea class="input-text validate[required,length[6,300]]" id="message" name="message" rows="6" cols="150"><?php echo $_POST['message'] ?></textarea><br />
   
         <input class="button" type="submit" value="invia" name="submit" />
         
      </form> <!-- END form -->

   </body>
</html>
risposto 6 anni fa
yomo
yomo
1
modificato 6 anni fa
X 0 X

Bravo!!! Hai fatto tutto da solo in realtà!!!

In questa sezione:

<?php
.............
      mail($emailTo, $subject, $body, $headers);
      $emailSent = true;
   }
}
?>

Non metterei "$emailSent = true" così, farei un controllo sul valore che la funzione mail ritorna (è un valore booleano), ti ho suggerito prima come fare ;)

ciao

risposto 6 anni fa
Mario Santagiuliana
X 0 X

Uff... è già cominciato lo spam su sto form!  >:(

Qualcuno mi sa dare qualche consiglio per migliorarlo ulteriormente con qualche controllo o filtro aggiuntivo?

risposto 6 anni fa
yomo
yomo
1
X 0 X

Sto giusto aspettando che Gianni sistemi un mio articolo sulla creazione di un form del genere.

Per limitare lo spam potresti usare un sistema di captcha, a me piace recaptcha.net. Zend Framework ti mette a disposizione gli strumenti per usarlo in modo semplice.

Ti consiglio di aprire una discussione apposita su tale argomento.

risposto 6 anni fa
Mario Santagiuliana
X 0 X
Effettua l'accesso o registrati per rispondere a questa domanda