我有一个页面“index.php”,其中有一个名为“add_users.php”的链接。在“add_users.php”中,我接受用户信息并返回到同一页面“index.php”,其中信息通过后期操作进入并插入到数据库中。
当我刷新页面或点击后退按钮时,会出现重新发送框。我经历了许多解决方案,他们要求我创建第三页。我尝试按如下方式执行此操作:在数据库中插入值后,我将页面重定向为标题('Location:http://thisisawebsite.com/thankyou.php,并在thankyou.php中我再次将页面重定向到index.php。但这导致获得了警告为“无法修改标题信息 - 已由[....]发送的标题”
什么是更好的解决方案?
答案 0 :(得分:18)
普里,
你走在正确的轨道上。您要实现的实际上是Web开发中使用的一种众所周知的模式,称为POST/Redirect/GET pattern。 (模式现在是一个流行词,所以也许范式是一个更好的词)。
这种模式/范例的一个常见实现是只有一个入口点。
通过这样做,add_user.php
现在看起来像这样(它仍然不是最优雅的,但希望它会让你知道如何实现它):
<?php
// is this a post request?
if( !empty( $_POST ) )
{
/*
process the form submission
and on success (a boolean value which you would put in $success), do a redirect
*/
if( $success )
{
header( 'HTTP/1.1 303 See Other' );
header( 'Location: http://www.example.com/add_user.php?message=success' );
exit();
}
/*
if not successful, simply fall through here
*/
}
// has the form submission succeeded? then only show the thank you message
if( isset( $_GET[ 'message' ] ) && $_GET[ 'message' ] == 'success' )
{
?>
<h2>Thank you</h2>
<p>
You details have been submitted succesfully.
</p>
<?php
}
// else show the form, either a clean one or with possible error messages
else
{
?>
<!-- here you would put the html of the form, either a clean one or with possible error messages -->
<?php
}
?>
所以,它基本上是如何运作的:
?message=success
,则只需显示一个干净的表单。?message=success
?message=success
的请求,则只显示感谢信息,请勿显示该表单。希望这一点,以及我给你的例子,都足够了。
现在,您收到臭名昭着的Warning: headers already sent
消息的原因被解释为in this answer I gave另一个问题,为什么某些php调用最好放在脚本的顶部(实际上,它不是必须要在顶部,但必须在输出任何输出(偶数(偶然)空白)之前调用它。
答案 1 :(得分:3)
但收到警告为无法修改标题信息 - 标题已发送
使用输出缓冲有问题吗?为什么你的页面发送标题,即使它只在数据库中工作?你有第一个空格或换行符吗?
你已经有了解决方案,你应该让它发挥作用。
答案 2 :(得分:2)
我认为使用会话是防止此问题的最佳方法
session_start();
if(!isset($_SESSION['s'])){
$_SESSION['s'] = true;
};
if( !empty( $_POST ) && ($_SESSION['s']) )
{
//your code
$_SESSION['s'] = false;
}
如果您希望用户能够再次发布内容,您可以使用unset($_SESSION['s'])
或destroy_session()
。
答案 3 :(得分:1)
请使用ob_start();第一行本身的陈述。
答案 4 :(得分:1)
我使用评论框遇到的相同挑战,我所做的是将页面重定向到同一页面和特定的“锚点”。例如:
<form id="myForm" action="<?php echo $_SERVER['PHP_SELF'];?>#myForm" method="post">
<!--Stuff for form in here -->
</form>
然后我有PHP代码:
<?php
//Do your stuff and when finished...
$reloadpage = $_SERVER['PHP_SELF']."#myForm";
header("Location:$reloadpage");
exit();
?>
这可以避免F5重新发送表单中的数据
答案 5 :(得分:0)
使用元刷新
将数据添加到数据库后,&lt;%meta http-equiv =“refresh”content =“5; url = http://example.com/”/&gt;“在您成功消息时。
可能是避免重装的诀窍。
Thanxs, 戈壁。