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

PHP prevent action from happening again on refresh

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

打开一个不同的页面
header("Location: index.php");

或者我想这会很好,但是还有其他解决方案吗?例如,我发现了一些关于取消设置所有变量的东西,但我真的不知道这有多可行

您可以在不实际使用单独文件的情况下进行重定向:

//form.php
<?php
if($_POST){
    //form processing code here
    //redirect to self
    header("Location: ./form.php");
    exit();
}

正如 Fred 所说,会议是一个很好的解决方案。下面的伪代码

session_start();
if(!isset($_SESSION['mail_sent'])) {
    mail('someaddresss'...);
    $_SESSION['mail_sent'] = true;
}

如果您在表单中使用 nonce 字段,相同的表单提交将不会被处理两次。总体思路是生成一个只能使用一次的令牌。使用有效令牌提交表单后,令牌将变为无效。

创建随机数相当容易:How to create and use nonces

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>

email.php

<?php
session_start();
// SEND MESSAGE HERE.
$_SESSION[ "message_sent" ] = "message sent";
header( "Location: send.php" );
?>

将以前的代码复制并粘贴到两个具有给定名称的文件中,然后从浏览器中 运行 send.php。发送一条消息。然后根据需要多次刷新页面,您会看到,PHP 代码不会重新执行,因此不会重新发送电子邮件。

希望对您有所帮助。

可能的解决方案是有两个页面。一个带有 PHP 代码,用于发送该用户的电子邮件,另一个表示电子邮件已发送。

在包含电子邮件的第一个网页上使用 cookie。该页面加载后,它会立即发送电子邮件。接下来使用 header("Location: http://www.somewhereelse.com/); 将用户转到另一个页面。在下一页上,它会删除或更改 cookie。

这样,如果用户单击后退按钮或刷新,它不会再次发送电子邮件,因为电子邮件 cookie 丢失。