基本上我创建了一个页面来发送邮件以恢复您的密码。问题是,在你填写了所有信息并发送了邮件后,每次刷新页面时,它都会继续发送电子邮件。我能想到的唯一解决方案是用打开不同的页面
header("Location: index.php");
或者一些我想可以的事情,但还有其他解决方案吗?例如,我发现了一些关于取消设置所有变量的东西,但我真的不知道有多可行
Crecket,我们可以看看你的代码吗?因为我担心你会把你的PHP代码添加到你的网页中。当您将操作放入HTML文件中时,每次重新加载页面时,PHP代码都会重新执行。
为了防止PHP代码被重新执行,您必须将其与HTML文件分离。这样,无论用户刷新页面多少次,PHP代码都不会执行,除非用户按下提交按钮。我将给你举一个分离的例子:
send.php
<?php
session_start();
?>
<html>
<head>
<title>Session</title>
</head>
<body>
<?php
if ( IsSet( $_SESSION[ "message_sent" ] ) )
{ echo "Your message was sent.";
unset( $_SESSION[ "message_sent" ] );
}
?>
<form method="post" action="email.php">
Enter message
<input type="text" name="anything" />
<input type="submit" value="Send email" />
</form>
</body>
</html>
电子邮件.php
<?php
session_start();
// SEND MESSAGE HERE.
$_SESSION[ "message_sent" ] = "message sent";
header( "Location: send.php" );
?>
将以前的代码复制并粘贴到两个具有给定名称的文件中,然后从浏览器中运行send.php。发送一条消息。然后根据需要多次刷新页面,您会看到,PHP代码不会重新执行,因此不会重新发送电子邮件。
希望这对你有帮助。
正如Fred所说,会话是很好的解决方案。下方的伪代码
session_start();
if(!isset($_SESSION['mail_sent'])) {
mail('someaddresss'...);
$_SESSION['mail_sent'] = true;
}
如果在表单中使用nonce字段,则不会对同一表单提交进行两次处理。一般的想法是生成一个只能使用一次的令牌。使用有效令牌提交表单后,该令牌将变为无效。
创建nonces相当容易:如何创建和使用nonces
可能的解决方案是有两个页面。其中一个包含PHP代码,用于发送该用户的电子邮件,另一个则表示电子邮件已发送。
在电子邮件的第一个网页上使用cookie。一旦该页面加载,它就会立即发送电子邮件。接下来使用header("Location: http://www.somewhereelse.com/);
将用户发送到另一个页面。在下一页,它删除或更改cookie。
这样,如果用户单击后退按钮或刷新,它就不会再次发送电子邮件,因为电子邮件cookie丢失了。
您可以在不使用单独文件的情况下进行重定向:
//form.php
<?php
if($_POST){
//form processing code here
//redirect to self
header("Location: ./form.php");
exit();
}