可能重复:
How to stop form from sending email more times after initial success.
首先,我使用目录构建了我的网站。所以基本上每个页面都是一个目录,在那个目录中,我有一个名为index.php的文件。
我的网站上有四个联系表单,目前使用hnadler.php文件似乎全部工作。处理程序文件验证数据,检查发布的表单ID,并根据它,它适当地路由电子邮件。如果成功发送,则显示成功消息。但是,我目前的意见是有缺陷的,如果用户刷新,则会发送另一封邮件。如何使用现有代码解决这个问题?谢谢
//handler.php
<?php
if(isset($_POST['submit'])) {
//carry out validation
if(!isset($hasError)) {
//check the form id posted and set email address in $emailTo accordingly
$body = "Name: $name \n\nEmail: $email \n\nEnquiry: $enquiry";
$headers = 'From: My Site <'.$emailTo.'>' . "\r\n" . 'Reply-To: ' . $email;
mail($emailTo, $subject, $body, $headers);
$emailSent = true;
}
}
//index.php
<?php if(isset($hasError)) { ?>
<p class="error">Please make sure you have filled all fields with valid information. Thank you.</p>
<?php } ?>
<?php if(isset($emailSent) && $emailSent == true) { ?>
<p><strong>Your enquiry was sent successfully.</strong></p>
<p>Thank you for your enquiry! Your email was successfully sent and we will be in touch with you promptly.</p>
<?php }; ?>
<form id="contactform" method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
<fieldset>
<legend>Enquiry form</legend>
<label for="name">Name:</label><input type="text" size="50" name="name" id="name" value="" class="required" />
<label for="email">Email:</label><input type="text" size="50" name="email" id="email" value="" class="required email" />
<label for="enquiry">Enquiry:</label><textarea rows="5" cols="20" name="enquiry" id="enquiry" class="required"></textarea>
<input type="submit" name="submit" value="Submit enquiry" class="curved-btn"></input>
<input type="hidden" id="form-id" name="form-id" value="general"></input>
</fieldset>
</form>
?>
答案 0 :(得分:0)
问题是你实际提交到handler.php是因为:
<form id="contactform" method="post" action="<?php echo $_SERVER['PHP_SELF']; ?>">
将其更改为:
<form id="contactform" method="post" action="handler.php">
并将您的发送电子邮件代码放在handler.php中。您还需要在其中放置一个重定向,以使它们返回到页面。还有其他方法可以解决这个问题,但这就是我要做的事情。
答案 1 :(得分:0)
浏览器将/可以在刷新时重新发布数据,因此它看起来像是一个新请求。
快速解决方法是在表单提交后重定向:
header("Location: success.php");
如果刷新它们会刷新成功页面,而不是你发布的页面。