我在php页面上有一个提交到同一页面的表单。 我注意到,如果我重新加载/刷新页面,表单将被重新提交。 我如何编码以最简单的方式避免这种情况?
答案 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';
?>