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