如何避免在php中重新刷新数据

时间:2010-04-19 11:15:18

标签: php

我有一个页面“index.php”,其中有一个名为“add_users.php”的链接。在“add_users.php”中,我接受用户信息并返回到同一页面“index.php”,其中信息通过后期操作进入并插入到数据库中。

当我刷新页面或点击后退按钮时,会出现重新发送框。我经历了许多解决方案,他们要求我创建第三页。我尝试按如下方式执行此操作:在数据库中插入值后,我将页面重定向为标题('Location:http://thisisawebsite.com/thankyou.php,并在thankyou.php中我再次将页面重定向到index.php。但这导致获得了警告为“无法修改标题信息 - 已由[....]发送的标题”

什么是更好的解决方案?

6 个答案:

答案 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
}
?>

所以,它基本上是如何运作的:

  • 如果对脚本发出的请求不是POST请求(即表单尚未提交),并且该网址没有附加?message=success,则只需显示一个干净的表单。
  • 如果对脚本发出的请求是POST请求,则处理该表单。
    • 如果表单处理成功,请再次重定向到同一脚本,并附加?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, 戈壁。