无需重新提交表单即可在浏览器中重新加载/刷新页面?

时间:2011-11-03 19:34:25

标签: php forms refresh reload

我在php页面上有一个提交到同一页面的表单。 我注意到,如果我重新加载/刷新页面,表单将被重新提交。 我如何编码以最简单的方式避免这种情况?

3 个答案:

答案 0 :(得分:3)

一种可能性是实现重定向后获取方法。

简单地说,POST请求永远不会传递给浏览器。相反,您执行所有必要的操作并在会话中存储所需的信息,然后使用代码303进行重定向。

$page = 'show_result.php';
header('Location: '.$page, true, 303);
exit;

这样做,浏览器将显示“show_result.php”页面(GET请求),而不是POST请求的页面。这也是添加到历史记录中的页面,因此刷新并使用后退按钮将永远不会执行另一个POST请求。作为一个很好的副作用,您可以摆脱有关重新发送数据的浏览器警告,通常用户无论如何都无法决定该做什么。

我认为这种方法的最大问题是,您需要一个会话来存储错误消息,这意味着您必须依赖cookie。如果没有重定向显示错误,浏览器将显示有关重新发送数据的警告。

答案 1 :(得分:2)

这假设了很多东西,但也许正是你在寻找的东西:

if ($_POST)
{
    $success = false;

    /*
     * if all goes OK managing POST data make $success = true;
     * 
     */

    if ($success)
    {
        // this will redirects to your original
        // form's page but using GET method
        // so re-submitting will be no possible
        header("location: {$_SERVER['PHP_SELF']}");
        exit;
    }
}

答案 2 :(得分:0)

根据HTTP标准,您应该在发送POST后让浏览器执行GET请求 这是一个草图示例,用于执行表单处理:

<?  
if ($_SERVER['REQUEST_METHOD']=='POST') {  

  $err = array();
  //performing all validations and raising corresponding errors
  if (empty($_POST['name']) $err[] = "Username field is required";  
  if (empty($_POST['text']) $err[] = "Comments field is required";  

  if (!$err) {  
    //if no errors - saving data and redirect
    header("Location: ".$_SERVER['PHP_SELF']);
    exit;
  }  else {
    // all field values should be escaped according to HTML standard
    foreach ($_POST as $key => $val) {
      $form[$key] = htmlspecialchars($val);
    }
} else {
  $form['name'] = $form['comments'] = '';  
}
include 'form.tpl.php';
?>