我有一个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';
?>