在浏览器中重新加载/刷新页面而不重新提交表单


Reload/refresh page in browser without re-submitting form?

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

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

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

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

这样做,浏览器将显示"show_result.php"页面(GET请求)而不是POST请求的页面。这也是添加到历史记录中的页面,因此刷新和使用后退按钮不会再执行POST请求。作为一个很好的副作用,你摆脱了浏览器对重发送数据的警告,通常用户无法决定接下来该做什么。

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

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

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;
    }
}

根据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';
?>