Php 如何防止;“确认表格重新提交”;对话
如何在提交后清理表单中的信息,使其在页面刷新后不会显示此错误 请参见图片(来自chrome): 该对话框包含以下文本: 您要查找的页面已使用Php 如何防止;“确认表格重新提交”;对话,php,javascript,jquery,codeigniter,Php,Javascript,Jquery,Codeigniter,如何在提交后清理表单中的信息,使其在页面刷新后不会显示此错误 请参见图片(来自chrome): 该对话框包含以下文本: 您要查找的页面已使用 您输入的信息。回到那个 页面可能会导致您采取的任何操作无效 重复的。你想继续吗 我不希望出现此对话框。它与表单或表单中的值无关。它被浏览器触发,以防止用户对缓存的数据重复相同的请求。如果确实需要启用结果页面的刷新,则应通过PHP(标题(
您输入的信息。回到那个
页面可能会导致您采取的任何操作无效
重复的。你想继续吗
我不希望出现此对话框。它与表单或表单中的值无关。它被浏览器触发,以防止用户对缓存的数据重复相同的请求。如果确实需要启用结果页面的刷新,则应通过PHP(
标题(
)或正在使用的其他服务器端语言重定向用户。元标记解决方案也可以用于禁用刷新时重新发送。编辑:自从我最初发布此答案已经有几年了,尽管我获得了一些赞成票,但我对以前的答案并不满意,所以我已经完全重做了。我希望这有帮助
何时使用
GET
和POST
:
消除此错误消息的一种方法是让表单使用get
而不是POST
。请记住,这并不总是一个合适的解决方案(请阅读下文)
如果您正在执行不希望重复的操作,如果正在传输敏感信息,或者如果您的表单包含文件上载或发送的所有数据长度超过,请始终使用POST
何时使用POST
的示例包括:
- 登入表格
- 联系方式
- 提交付款单
- 从数据库中添加、编辑或删除条目的东西
- 图像上载程序(请注意,如果使用带有
字段的
,则只会将文件名发送到服务器,99.73%的时间不是您想要的。)GET
- 具有多个字段的表单(如果使用GET,将创建一个长URL)
- 在搜索引擎中执行搜索
- 用于浏览网站的导航表单
- 使用临时密码或一次性密码执行一次性操作(例如电子邮件中的“取消订阅”链接)
POST
:
对我来说,在大多数情况下,即使弹出“确认表单重新提交”对话框也表明存在设计缺陷。由于POST
被用于执行破坏性操作的本质,web设计师应该防止用户通过意外(或有意)刷新页面来多次执行这些操作。许多用户甚至不知道此对话框的含义,因此只需单击“继续”。如果这是在“提交付款”请求之后发生的呢?付款是否再次发送
那你是做什么的?幸运的是,我们有了设计模式。用户向服务器提交POST请求,服务器将用户的浏览器重定向到另一个页面,然后使用GET检索该页面
下面是一个使用PHP的简单示例:
if(!empty($_POST['username'] && !empty($_POST['password'])) {
$user = new User;
$user->login($_POST['username'], $_POST['password']);
if ($user->isLoggedIn()) {
header("Location: /admin/welcome.php");
exit;
}
else {
header("Location: /login.php?invalid_login");
}
}
请注意,在本例中,即使密码不正确,我仍然会重定向回登录表单。要向用户显示无效的登录消息,只需执行以下操作:
if (isset($_GET['invalid_login'])) {
echo "Your username and password combination is invalid";
}
处理POST页面后,将用户重定向到同一页面 在
http://test.com/test.php
header('Location: http://test.com/test.php');
这将删除该框,因为刷新页面不会重新提交数据。我遇到过无法使用上述任何答案的情况。我的案例涉及到使用搜索页面,如果用户在导航到任何搜索结果后单击返回,用户将获得“确认表单重新提交”。我编写了以下javascript来解决这个问题。这不是一个很好的解决方案,因为它有点闪烁,并且在IE8或更早版本上不起作用。尽管如此,对于处理这个问题的人来说,这可能是有用或有趣的
jQuery(document).ready(function () {
//feature test
if (!history)
return;
var searchBox = jQuery("#searchfield");
//This occurs when the user get here using the back button
if (history.state && history.state.searchTerm != null && history.state.searchTerm != "" && history.state.loaded != null && history.state.loaded == 0) {
searchBox.val(history.state.searchTerm);
//don't chain reloads
history.replaceState({ searchTerm: history.state.searchTerm, page: history.state.page, loaded: 1 }, "", document.URL);
//perform POST
document.getElementById("myForm").submit();
return;
}
//This occurs the first time the user hits this page.
history.replaceState({ searchTerm: searchBox.val(), page: pageNumber, loaded: 0 }, "", document.URL);
});
你似乎在寻找模式 作为另一种解决方案,您可能会停止使用重定向 您可以立即处理并呈现处理结果,而无需发出
POST
确认警报。您应该只操作浏览器历史记录对象:
history.replaceState("", "", "/the/result/page")
请参阅或回答您可以尝试在jQuery中使用AJAX调用。就像youtube在不刷新的情况下添加评论一样。这将消除刷新整体的问题 您需要通过ajax调用发送必要的信息。
我将以youtube评论为例
$.ajax({
type: 'POST',
url: 'ajax/comment-on-video.php',
data: {
comment: $('#idOfInputField').val();
},
success: function(obj) {
if(obj === 'true') {
//Some code that recreates the inserted comment on the page.
}
}
});
现在,您可以在video.php上创建文件comment,并创建如下内容:
<?php
session_start();
if(isset($_POST['comment'])) {
$comment = mysqli_real_escape_string($db, $_POST['comment']);
//Given you are logged in and store the user id in the session.
$user = $_SESSION['user_id'];
$query = "INSERT INTO `comments` (`comment_text`, `user_id`) VALUES ($comment, $user);";
$result = mysqli_query($db, $query);
if($result) {
echo true;
exit();
}
}
echo false;
exit();
?>
快速回答
使用不同的方法加载表单和保存/处理表单
例如
Login.php
加载登录信息
<script>
if ( window.history.replaceState ) {
window.history.replaceState( null, null, window.location.href );
}
</script>