Rimuovere "dati in memoria" dopo invio mail [PHP]

eleumas

Utente Attivo
16 Ago 2015
67
2
8
Ciao a tutti.
Ho preparato un form e faccio l'invio della mail tramite php. Fino a qui nulla di strano. Ho notato però che ogni volta che ricarico la pagina la mail viene inviata nuovamente, come se i dati inseriti nel form rimanessero in memoria. Come faccio a risolvere questo problema? Qualcuno potrebbe aiutarmi per favore? Grazie.
 
Ultima modifica:

Max 1

Super Moderatore
Membro dello Staff
SUPER MOD
MOD
29 Feb 2012
4.275
328
83
Ricorda che devi inserire un titolo descrittivo del problema quando apri una nuova discussione!
 

eleumas

Utente Attivo
16 Ago 2015
67
2
8
Chiedo scusa. Nella fretta non ho inserito il titolo. Ho provveduto a modificare.
Grazie per la segnalazione.
 

fabryx

Nuovo Utente
9 Ott 2016
38
2
8
passa i dati attraverso una sessione e distruggi la stessa all'invio dell'email
 

eleumas

Utente Attivo
16 Ago 2015
67
2
8
Ciao @fabryx, grazie per avermi risposto.

Così potrebbe andare bene?

Codice:
<?php

session_start();

if {

}

else {

}

session_destroy();

?>
Grazie.
 

eleumas

Utente Attivo
16 Ago 2015
67
2
8
Ciao ragazzi, qualcuno potrebbe aiutarmi per favore con questo problema che sto riscontrando?
Grazie.
 

fabryx

Nuovo Utente
9 Ott 2016
38
2
8
Ciao @fabryx, grazie per avermi risposto.

Così potrebbe andare bene?

Codice:
<?php

session_start();

if {

}

else {

}

session_destroy();

?>
Grazie.

scusami ma non avevo visto la tua risposta
purtroppo non avendo tu postato il codice che stai utilizzando diventa complicato riuscirti ad aiutare adeguatamente.
comunque a questo link del sito trovi una breve e chiara spiegazione del funzionamento delle sessioni che dovrebbe fare proprio al caso tuo
http://www.mrwebmaster.it/php/sessioni_9507.html
 

eleumas

Utente Attivo
16 Ago 2015
67
2
8
Ciao @fabryx grazie per la tua risposta.
Qui sotto ti ho postato il mio codice.
Come dicevo, il mio problema è che questo form è nella pagina HOME.
Ogni volta che aggiorno questa pagina o tramite la barra di navigazione ritorno in questa pagina parte lo script e appare la notifica che il messaggio è stato (o non è stato) inviato.

PHP:
<?php
if(isset($_POST['submit'])){

  $name = !empty($_POST['name'])?$_POST['name']:'';
  $email = !empty($_POST['email'])?$_POST['email']:'';
  $city = !empty($_POST['city'])?$_POST['city']:'';
  $nationality = !empty($_POST['nationality'])?$_POST['nationality']:'';
  $location = !empty($_POST['location'])?$_POST['location']:'';
  $pax = !empty($_POST['pax'])?$_POST['pax']:'';
  $message = !empty($_POST['message'])?$_POST['message']:'';
  $checkbox = !empty($_POST['checkbox'])?$_POST['checkbox']:'no';

  // corpo della mail
  $to = '[email protected]'; // <--- inserire e-mail destinatario
  $subject = "Ti ha scritto dal tuo sito:  $name";
  $htmlContent = "
  <ul style='list-style: none; padding-left: 0;'>
  <li style='margin: 0 0 15px 0;'>Questi sono i dettagli del messaggio:</li>
  <li style='margin: 0 0 5px 0;'><b>Nome:</b> ".$name."</li>
  <li style='margin: 0 0 5px 0;'><b>E-mail:</b> ".$email."</li>
  <li style='margin: 0 0 5px 0;'><b>Città:</b> ".$city."</li>
  <li style='margin: 0 0 5px 0;'><b>Nazionalità:</b> ".$nationality."</li>
  <li style='margin: 0 0 5px 0;'><b>Luogo in Italia:</b> ".$location."</li>
  <li style='margin: 0 0 5px 0;'><b>Persone:</b> ".$pax."</li>
  <li style='margin: 0 0 5px 0;'><b>Messaggio:</b> ".$message."</li>
  <li style='margin: 0 0 5px 0;'><b>Accettazione Privacy:</b> ".$checkbox."</li>
  </ul>
  ";

  // impostare sempre content-type quando si invia una mail in HTML
  $headers = "MIME-Version: 1.0" . "\r\n";
  $headers .= "Content-type:text/html;charset=UTF-8" . "\r\n";

  // headers
  $headers .= 'From:'.$name.' <'.$email.'>' . "\r\n";

  // invio mail
  @mail($to,$subject,$htmlContent,$headers);

  $succMsg = '<script>
  UIkit.notify({
    message : "Message sent!",
    status  : "success",
    timeout : 0,
    pos     : "top-center"
  });
  </script>';

  $name = '';
  $email = '';
  $city = '';
  $nationality = '';
  $location = '';
  $pax = '';
  $message = '';
  $checkbox = '';
}

else {
  $errMsg = '<script>
  UIkit.notify({
    message : "Message not sent!",
    status  : "danger",
    timeout : 0,
    pos     : "top-center"
  });
  </script>';
}

?>

<?php if(!empty($errMsg)): ?><div class="errMsg"><?php echo $errMsg; ?></div><?php endif; ?>
<?php if(!empty($succMsg)): ?><div class="succMsg"><?php echo $succMsg; ?></div><?php endif; ?>
 

fabryx

Nuovo Utente
9 Ott 2016
38
2
8
Ciao @fabryx, ho testato e purtroppo continua a dare il solito problema :(
PHP:
<?php
//apri sessione
session_start();

if(isset($_POST['submit'])){
//crei variabili sessione
    $name = $_SESSION['name'] = $_POST['name'];
    $email = $_SESSION['email'] = $_POST['email'];
    $city = $_SESSION['city'] = $_POST['city'];
    $nationality = $_SESSION['nationality'] = $_POST['nationality'];
    $location = $_SESSION['location'] = $_POST['location'];
    $pax = $_SESSION['pax'] = $_POST['pax'];
    $message = $_SESSION['message'] = $_POST['message'];
    $checkbox = $_SESSION['checkbox'] = $_POST['checkbox'];

//verifica dati form
    if (empty($name) OR empty($email) OR empty($city) OR empty($nationality) OR empty($location) OR empty($pax) OR empty($message) OR empty($checkbox)){
//messaggio errore inserimento dati form
            echo 'inserisci tutti i dati richiesti';
        }else{
//invio email
        $to = '[email protected]'; // <--- inserire e-mail destinatario
        $subject = "Ti ha scritto dal tuo sito:  $name";
        $htmlContent = "
        <ul style='list-style: none; padding-left: 0;'>
        <li style='margin: 0 0 15px 0;'>Questi sono i dettagli del messaggio:</li>
        <li style='margin: 0 0 5px 0;'><b>Nome:</b> ".$name."</li>
        <li style='margin: 0 0 5px 0;'><b>E-mail:</b> ".$email."</li>
        <li style='margin: 0 0 5px 0;'><b>Città:</b> ".$city."</li>
        <li style='margin: 0 0 5px 0;'><b>Nazionalità:</b> ".$nationality."</li>
        <li style='margin: 0 0 5px 0;'><b>Luogo in Italia:</b> ".$location."</li>
        <li style='margin: 0 0 5px 0;'><b>Persone:</b> ".$pax."</li>
        <li style='margin: 0 0 5px 0;'><b>Messaggio:</b> ".$message."</li>
        <li style='margin: 0 0 5px 0;'><b>Accettazione Privacy:</b> ".$checkbox."</li>
        </ul>";

// impostare sempre content-type quando si invia una mail in HTML
        $headers = "MIME-Version: 1.0" . "\r\n";
        $headers .= "Content-type:text/html;charset=UTF-8" . "\r\n";
// headers
        $headers .= 'From:'.$name.' <'.$email.'>' . "\r\n"; 
//verifica invio email
        if(mail($to,$subject,$htmlContent,$headers)){
//conferma invio e distruzione dei dati di sessione
            echo 'email inviata';
             session_destroy();
            }else{
//messaggio di errore in caso di email non inviata
                echo 'errore invio email';
        }
    }     
}
//form di invio
echo'
<form method="post" action="email.php"><br><br>
Name:<br><input type="text" name="name"><br><br>
email:<br><input type="text" name="email"><br><br>
city:<br><input type="text" name="city"><br><br>
nationality:<br><input type="text" name="nationality"><br><br>
location:<br><input type="text" name="location"><br><br>
pax:<br><input type="text" name="pax"><br><br>
message:<br><input type="text" name="message"><br><br>
<input type="checkbox" name="checkbox"> check<br><br>
<input type="submit" name="submit" value="invia email"><br>
</form>
';

?>
testato e funzionante ;)
 
Ultima modifica:

marino51

Utente Attivo
28 Feb 2013
2.919
164
63
Lombardia
Ho notato però che ogni volta che ricarico la pagina la mail viene inviata nuovamente,
dovresti cercare di capire perché viene richiamato lo script di invio della mail, all'interno della pagina che carichi
if(isset($_POST['submit'])){
se venisse richiamato x sbaglio la condizione dovrebbe essere negativa e la mail non partire
hai del codice javascript attivo che fa delle operazioni al caricamento della pagina e interagisce con lo script della mail ?

non credo che si risolva agendo su questo script
forse più che vedere il codice php che hai postato, che viene richiamato dalla pagina,
sarebbe bene tu postassi la pagina stessa, che causa l'errore
 
Ultima modifica:

fabryx

Nuovo Utente
9 Ott 2016
38
2
8
dovresti cercare di capire perché viene richiamato lo script di invio della mail, all'interno della pagina che carichi

se venisse richiamato x sbaglio la condizione dovrebbe essere negativa e la mail non partire
hai del codice javascript attivo che fa delle operazioni al caricamento della pagina e interagisce con lo script della mail ?

non credo che si risolva agendo su questo script
forse più che vedere il codice php che hai postato, che viene richiamato dalla pagina,
sarebbe bene tu postassi la pagina stessa, che causa l'errore
probabilmente era proprio il codice js che dava problemi infatti nella mia soluzione l'ho eliminato senza neanche verificare anche perche non aveva alcun senso per la funzionalita a cui era destinato.
lo script che gli ho dato funziona perfettamente, una volta inviata l'email puo riaggiornare la pagina quante volte vuole ma non ci sara nessun reinvio
 
Ultima modifica:

eleumas

Utente Attivo
16 Ago 2015
67
2
8
Ciao @marino51, grazie per il tuo intervento. Cerco di semplificare il tutto.
Io sono partito da questo script, trovato in rete e perfettamente funzionante.

PHP:
<?php
if(isset($_POST['submit'])):
  if(isset($_POST['g-recaptcha-response']) && !empty($_POST['g-recaptcha-response'])):

    // chiave segreta reCAPTCHA
    $secret = 'xxxxxxxxxxxxxxxxxxx';

    // invio della verifica del reCAPTCHA e risposta
    $verifyResponse = file_get_contents('https://www.google.com/recaptcha/api/siteverify?secret='.$secret.'&response='.$_POST['g-recaptcha-response']);
    $responseData = json_decode($verifyResponse);

      $name = !empty($_POST['name'])?$_POST['name']:'';
      $email = !empty($_POST['email'])?$_POST['email']:'';
      $phone = !empty($_POST['phone'])?$_POST['phone']:'';
      $people = !empty($_POST['people'])?$_POST['people']:'';
      $calendarstart = !empty($_POST['calendarstart'])?$_POST['calendarstart']:'';
      $calendarend = !empty($_POST['calendarend'])?$_POST['calendarend']:'';
      $message = !empty($_POST['message'])?$_POST['message']:'';
      $checkbox = !empty($_POST['checkbox'])?$_POST['checkbox']:'no';
      if($responseData->success):

        // corpo della mail
        $to = '[email protected]'; // <--- inserire e-mail destinatario
        $subject = "Ti ha scritto dal tuo sito:  $name";
        $htmlContent = "
        <ul style='list-style: none; padding-left: 0;'>
        <li style='margin: 0 0 15px 0;'>Questi sono i dettagli del messaggio:</li>
        <li style='margin: 0 0 5px 0;'><b>Nome:</b> ".$name."</li>
        <li style='margin: 0 0 5px 0;'><b>E-mail:</b> ".$email."</li>
        <li style='margin: 0 0 5px 0;'><b>Telefono:</b> ".$phone."</li>
        <li style='margin: 0 0 5px 0;'><b>Persone:</b> ".$people."</li>
        <li style='margin: 0 0 5px 0;'><b>Data di arrivo:</b> ".$calendarstart."</li>
        <li style='margin: 0 0 5px 0;'><b>Data di partenza:</b> ".$calendarend."</li>
        <li style='margin: 0 0 5px 0;'><b>Messaggio:</b> ".$message."</li>
        <li style='margin: 0 0 5px 0;'><b>Accettazione Privacy:</b> ".$checkbox."</li>
        </ul>
        ";

        // impostare sempre content-type quando si invia una mail in HTML
        $headers = "MIME-Version: 1.0" . "\r\n";
        $headers .= "Content-type:text/html;charset=UTF-8" . "\r\n";

        // headers
        $headers .= 'From:'.$name.' <'.$email.'>' . "\r\n";

        // invio mail
        @mail($to,$subject,$htmlContent,$headers);

        $succMsg = '<script>
        UIkit.notify({
          message : "Message sent!",
          status  : "success",
          timeout : 0,
          pos     : "top-center"
        });
        </script>';
        $name = '';
        $email = '';
        $phone = '';
        $people = '';
        $calendarstart = '';
        $calendarend = '';
        $message = '';
        $checkbox = '';
      else:
        $errMsg = '<script>
        UIkit.notify({
          message : "Message not sent!",
          status  : "danger",
          timeout : 0,
          pos     : "top-center"
        });
        </script>';
      endif;
    else:
      $errMsg = '<script>
      UIkit.notify({
        message : "Please click on the reCAPTCHA box.",
        status  : "warning",
        timeout : 0,
        pos     : "top-center"
      });
      </script>';
    endif;
  else:
    $errMsg = '';
    $succMsg = '';
    $name = '';
    $email = '';
    $phone = '';
    $people = '';
    $calendarstart = '';
    $calendarend = '';
    $message = '';
    $checkbox = '';
  endif;
  ?>

  <!-- risultato -->
  <?php if(!empty($errMsg)): ?><div class="errMsg"><?php echo $errMsg; ?></div><?php endif; ?>
  <?php if(!empty($succMsg)): ?><div class="succMsg"><?php echo $succMsg; ?></div><?php endif; ?>
Quello che avrei voluto fare (ma che poi si è rivelato "fatale") è semplicemente rimuovere dallo script php tutta la storia della verifica del re-captcha perchè non mi occorre.

Lo script js mi fa piacere tenerlo perchè dopo l'aggiornamento della pagina appare in alto il popup con il risultato dell'operazione.

Vorrei evitare di creare altre pagine per inserire il risultato dell'invio della mail.

Grazie a tutti per l'aiuto e il tempo che mi state dedicando.
 

fabryx

Nuovo Utente
9 Ott 2016
38
2
8
@eleumas
lo script che ti ho dato funziona perfettamente poi sei libero di implementarlo come meglio ti aggrada per le tue esigenze sostituendo i messaggi di errore con il tuo js x esempio o quant'altro ritieni necessario;)
il nocciolo della questione risiedeva tutto nel rendere le variabili del form variabili di sessione da cancellare una volta inviata l'email in modo da evitare il reinvio all'aggiornamento della pagina e con il mio script il tuo problema e' risolto poi sta a te adattarlo alle tue necessita'
 

marino51

Utente Attivo
28 Feb 2013
2.919
164
63
Lombardia
avevo modificato il tuo script "primo" perché mi sembrava ci fossero delle incongruenze che trovo anche nella versione completa che hai postato, le elenco
@mail($to,$subject,$htmlContent,$headers);
la "@" nasconde l'errore, sarebbe meglio avere sempre ben chiari gli errori che si verificano e correggerli,
lo script in produzione non deve generare errori
@mail($to,$subject,$htmlContent,$headers);
$succMsg = '<script>
UIkit.notify({
tolta la "@" nessuna if controlla il risultato dell'invio per cui la segnalazione dell'invio potrebbe essere errata se l'istruzione mail dovesse restituire un errore
ogni volta che ricarico la pagina la mail viene inviata nuovamente
il problema originale è probabilmente imputabile alla pagina non allo script

ps avendolo già scritto posto lo "skeleton"
PHP:
<?php
if(isset($_POST['submit']))
{

    ... qui, tutto il codice senza variazioni

    // invio mail
    if ( mail($to,$subject,$htmlContent,$headers) )
    {
        $succMsg = '<script>
        UIkit.notify({
            message : "Message sent!",
            status  : "success",
            timeout : 0,
            pos     : "top-center"
        });
        </script>';
    }
    else
    {
        $errMsg = '<script>
        UIkit.notify({
            message : "Message not sent!",
            status  : "danger",
            timeout : 0,
            pos     : "top-center"
        });
        </script>';
    }
}

?>

<?php if(!empty($errMsg)): ?><div class="errMsg"><?php echo $errMsg; ?></div><?php endif; ?>
<?php if(!empty($succMsg)): ?><div class="succMsg"><?php echo $succMsg; ?></div><?php endif; ?>
 
Ultima modifica:

marino51

Utente Attivo
28 Feb 2013
2.919
164
63
Lombardia
ti lascio lo script dove ho usato l'alert e quindi reindirizzo a se stesso in modo da
evitare di fare il "refresh"/"reload" della pagina che ti reinvia una nuova mail (come normale)
per riottenere il form avresti dovuto usare il bottone "history back"

sistema tu il form, ho copiato quello di fabry
PHP:
<?php
if( !empty($_POST['submit']) )
{
    $name = !empty($_POST['name'])?$_POST['name']:'';
    $email = !empty($_POST['email'])?$_POST['email']:'';
    $city = !empty($_POST['city'])?$_POST['city']:'';
    $nationality = !empty($_POST['nationality'])?$_POST['nationality']:'';
    $location = !empty($_POST['location'])?$_POST['location']:'';
    $pax = !empty($_POST['pax'])?$_POST['pax']:'';
    $message = !empty($_POST['message'])?$_POST['message']:'';
    $checkbox = !empty($_POST['checkbox'])?$_POST['checkbox']:'no';

    // corpo della mail
    $to = 'info[email protected]'; // <--- inserire e-mail destinatario
    $subject = "Ti ha scritto dal tuo sito:  $name";
    $htmlContent = "
    <ul style='list-style: none; padding-left: 0;'>
    <li style='margin: 0 0 15px 0;'>Questi sono i dettagli del messaggio:</li>
    <li style='margin: 0 0 5px 0;'><b>Nome:</b> ".$name."</li>
    <li style='margin: 0 0 5px 0;'><b>E-mail:</b> ".$email."</li>
    <li style='margin: 0 0 5px 0;'><b>Città:</b> ".$city."</li>
    <li style='margin: 0 0 5px 0;'><b>Nazionalità:</b> ".$nationality."</li>
    <li style='margin: 0 0 5px 0;'><b>Luogo in Italia:</b> ".$location."</li>
    <li style='margin: 0 0 5px 0;'><b>Persone:</b> ".$pax."</li>
    <li style='margin: 0 0 5px 0;'><b>Messaggio:</b> ".$message."</li>
    <li style='margin: 0 0 5px 0;'><b>Accettazione Privacy:</b> ".$checkbox."</li>
    </ul>";

    // impostare sempre content-type quando si invia una mail in HTML
    $headers = "MIME-Version: 1.0" . "\r\n";
    $headers .= "Content-type:text/html;charset=UTF-8" . "\r\n";

    // headers
    $headers .= 'From:'.$name.' <'.$email.'>' . "\r\n";

    // invio mail
    if ( mail($to,$subject,$htmlContent,$headers) )
    {
        $succMsg = '<script>
        alert(
            "message : Message sent!\n"+
            "status  : success\n"+
            "timeout : 0\n"+
            "pos     : top-center\n"
        );
        window.location.href="http://localhost/test_site/php/test/test/test.php";
        </script>';

        echo '<div class="succMsg">'.$succMsg.'</div>';
    }
    else
    {
        $errMsg = '<script>
        alert(
            "message : Message not sent!\n"+
            "status  : danger\n"+
            "timeout : 0\n"+
            "pos     : top-center\n"
        );
        window.location.href="http://localhost/test_site/php/test/test/test.php";
        </script>';

        echo '<div class="errMsg">'.$errMsg.'</div>';
    }
    //header("Location: http://localhost/test_site/php/test/test/test.php");
}
else
{
    DisplayForm();
}

function DisplayForm()
{
?>
<form method="post" action="TEST.php"><br><br>
Name:<br><input type="text" name="name" value="name"><br><br>
email:<br><input type="text" name="email" value="[email protected]"><br><br>
city:<br><input type="text" name="city" value="city"><br><br>
nationality:<br><input type="text" name="nationality" value="nationality"><br><br>
location:<br><input type="text" name="location" value="location"><br><br>
pax:<br><input type="text" name="pax" value="pax"><br><br>
message:<br><input type="text" name="message" value="message"><br><br>
<input type="checkbox" name="checkbox" checked> check<br><br>
<input type="submit" name="submit" value="invia email"><br>
</form>
<?php
}
?>
 

eleumas

Utente Attivo
16 Ago 2015
67
2
8
Grazie mille @marino51. Vorrei capire una cosa però. Io attualmente ho inserito il tuo "vecchio" script in una pagina php tramite un include. In sostanza: invio la mail, avviene il refresh della pagina, appare il popup ed è tutto perfetto.

Questo ultimo script cosa dovrebbe fare di diverso? Evitare il refresh della pagina?