PHP防止刷新时再次发生操作


PHP prevent action from happening again on refresh

基本上我创建了一个页面来发送邮件以恢复您的密码。问题是,在你填写了所有信息并发送了邮件后,每次刷新页面时,它都会继续发送电子邮件。我能想到的唯一解决方案是用打开不同的页面

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();
}