Receiving 2x emails from the form

0

Hello, I put a form in my page and to load everything on the same page I put the action = # contact (section of the form)

Even though I just clicked on the SEND button, I get 2 identical emails.

Follow contato.php that uses include on the same home page:

<?
ini_set('display_errors', true);
error_reporting(E_ALL|E_STRICT);

if(!empty($_GET) && $_SERVER['REQUEST_METHOD'] == 'GET'){
//pega as variaveis por POST
$nome     = $_GET["nome"];
$email    = $_GET["email"];
$fone     = $_GET["fone"];
$assunto  = $_GET["assunto"];
$mensagem   = $_GET["mensagem"];

global $email; //função para validar a variável $email no script todo

$data      = date("d/m/y");                     //função para pegar a data de envio do e-mail
$hora      = date("H:i");                       //para pegar a hora com a função date

//aqui envia o e-mail para você
mail ("[email protected]", //email aonde o php vai enviar os dados do form
      "$assunto",
      "Nome: $nome\nData: $data\nHora: $hora\nE-mail: $email\nTelefone: $fone\n\nMensagem: $mensagem",
      "From: $email"
     );

//aqui são as configurações para enviar o e-mail para o visitante
$site   = "[email protected]"; //o e-mail que aparecerá na caixa postal do visitante
$titulo = "Contato";    //titulo da mensagem enviada para o visitante
$msg    = "$nome, Seu e-mail foi recebido!\nObrigado por entrar em contato conosco, em breve entraremos em contato!";

//aqui envia o e-mail de auto-resposta para o visitante
mail("$email",
     "$titulo",
     "$msg",
     "From: $site"
    );
}

? >

On the main page it looks something like this

<? include "contato.php";?>
<form action="#contato">
</form>

And at the end of the form I have another part in php to show the sending msg successfully

<?  
    if(!empty($_GET) && $_SERVER['REQUEST_METHOD'] == 'GET'){
        echo "<p>Sua mensagem foi entregue com sucesso!<br>";
        echo "Em até 48hrs você receberá um contato nosso. Obrigado!</p>";
    }
?>

When I click on send it sends an email and when it loads the page again does it send another email?

Is there any way I can cancel the first or second submission?

    
asked by anonymous 09.10.2017 / 23:00

2 answers

0

When you send an email and continue on the same page, "giving an F5", the form will always send again, since the data sent by POST is stored, (You can take as an example to send something by GET and update the URL remains.) What you have to do is that when the form is submitted, you use window.location.href = "https://www.suaurl.com" or header("Location: https://www.suaurl.com"); and then the problem will not occur again.

    
10.10.2017 / 00:23
0
  

In your code I see 2 possibilities of email being sent 2 or more times.

  • 2 times if the email entered in the form input is equal to email aonde o php vai enviar os dados do form
  • 2 or more times if you refresh the page or repeatedly click on the SEND button.

To work around this problem:

Create a $_SESSION['me'] once the email is sent with the value of $_SERVER['QUERY_STRING'] .

  

The $ _SERVER ['QUERY_STRING'] variable will contain the parameters passed in a URL. These parameters are all the characters in the url after the question mark (?)

Assign variables $string and $session , respectively% values $_SERVER['QUERY_STRING'] and $_SESSION['me']

Finally compare these two values and if they are different send the email

if ($string!=$session){
 //envia email

contacto.php page

//Inicia uma nova sessão
session_start(); 

$string = $_SERVER['QUERY_STRING'];
$session = $_SESSION['me'];

ini_set('display_errors', true);
error_reporting(E_ALL|E_STRICT);

if ($string!=$session){

    if(!empty($_GET) && $_SERVER['REQUEST_METHOD'] == 'GET'){
        //pega as variaveis por POST
        $nome     = $_GET["nome"];
        $email    = $_GET["email"];
        $fone     = $_GET["fone"];
        $assunto  = $_GET["assunto"];
        $mensagem   = $_GET["mensagem"];

        global $email; //função para validar a variável $email no script todo

        $data      = date("d/m/y");                     //função para pegar a data de envio do e-mail
        $hora      = date("H:i");                       //para pegar a hora com a função date

        //aqui envia o e-mail para você


        mail ("[email protected]", //email aonde o php vai enviar os dados do form
              "$assunto",
              "Nome: $nome\nData: $data\nHora: $hora\nE-mail: $email\nTelefone: $fone\n\nMensagem: $mensagem",
              "From: $email"
             );

        //aqui são as configurações para enviar o e-mail para o visitante
        $site   = "[email protected]"; //o e-mail que aparecerá na caixa postal do visitante
        $titulo = "Contato";    //titulo da mensagem enviada para o visitante
        $msg    = "$nome, Seu e-mail foi recebido!\nObrigado por entrar em contato conosco, em breve entraremos em contato!";

        //aqui envia o e-mail de auto-resposta para o visitante
        mail("$email",
             "$titulo",
             "$msg",
             "From: $site"
            ); 

        $_SESSION['me']=$_SERVER['QUERY_STRING']; 

    }

}

Form

   <form action="#contato">
    .......

<?  
    if(!empty($_GET) && $_SERVER['REQUEST_METHOD'] == 'GET'){
        echo "<p>Sua mensagem foi entregue com sucesso!<br>";
        echo "Em até 48hrs você receberá um contato nosso. Obrigado!</p>";
    }
?>

If you want to make new email available, just put echo "<a href=\"principal.php\">Enviar outro email</a>"; in the code above.

<?  
    if(!empty($_GET) && $_SERVER['REQUEST_METHOD'] == 'GET'){
        echo "<p>Sua mensagem foi entregue com sucesso!<br>";
        echo "Em até 48hrs você receberá um contato nosso. Obrigado!</p>";

        echo "<a href=\"principal.php\">Enviar outro email</a>";
    }
?>
  

NOTE: The Get method has a limited size, if the information is too large there is a risk of data loss.

Internet Explorer: 2.083 caracteres
Firefox: 65.536 caracteres
Safari: 80.000 caracteres
Opera: 190.000 caracteres

Maximum IE URL

    
10.10.2017 / 03:16