php mail() two copies sent

前端 未结 2 1820
误落风尘
误落风尘 2020-12-12 06:16

I have a simple message that I send using php mail(). The code used:

//recipient info
$to = \"$bookernavn <$mail>\";
$from = \"Visens Venner Hillerød &         


        
相关标签:
2条回答
  • 2020-12-12 07:04

    You don't check to see if the form has been submitted so a browser refresh will send the form data again and cause the mail to be sent again. This also happens when a user presses the back button.

    After the email is sent you need to do a 303 redirect to prevent the re-submission. You can redirect to the same page if you'd like.

    This is called the Post/Redirect/Get pattern.

    mail(...);
    header('Location: /some-page-php', true, 303);
    exit;
    
    0 讨论(0)
  • 2020-12-12 07:14

    an easy way to prevent this from happening is to use POST method instead of GET for the form.

    <form method="post">
    
    
    
    if (isset($_POST['submitted']))
    

    and at the end of the mail code use a redirect that will send the browser to load using a GET method.

    Not only you can then redirect your user to a OK page "mail was sent" or a error page "sorry there was a mistake, please try again", a refresh of that page open by the browser will only send a GET, not triggering the send mail function

    if (empty($errors)) {
      header('Location: http://www.example.com/mail_OK.html');
      exit;
    } else {
      // passing data to the "error/retry" page
      $info = array(
        'msg' => $msg,
        'email' => $_POST['email'],
        'name' => $_POST['name']
        // etc...
      )
      header('Location: http://www.example.com/mailform.php?'.http_build_query($info));
      exit;
    }
    

    in your form you can retrieve those info

    <input name="name" type="text" placeholder="Naam" class="form-control" value="<?php echo htmlspecialchars($_GET['name']); ?>">
    
    0 讨论(0)
提交回复
热议问题