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

时间:2015-03-23 15:53:23

标签: php variables

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

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

或者其他什么会好的我猜,但还有其他解决方案吗?我发现了一些关于取消所有变量的事情,但我真的不知道它有多可行

5 个答案:

答案 0 :(得分:3)

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代码将不会重新执行,因此不会重新发送电子邮件。

希望这会对你有所帮助。

答案 1 :(得分:2)

像弗雷德说的那样,会议在这里是很好的解决方案。下面的伪代码

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

答案 2 :(得分:1)

如果您在表单中使用nonce字段,则相同的表单提交将不会被处理两次。一般的想法是生成一个只能使用一次的令牌。使用有效令牌提交表单后,令牌将失效。

创建随机数非常容易:How to create and use nonces

答案 3 :(得分:1)

可能的解决方案是有两页。其中一个包含PHP代码,用于发送用户和另一个发送电子邮件的电子邮件。

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

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

答案 4 :(得分:0)

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