我有一个向SQL表提交文本的简单表单。问题在于,在用户提交文本之后,他们可以刷新页面并再次提交数据,而无需再次填写表单。我可以在文本提交后将用户重定向到另一个页面,但我希望用户停留在同一页面上。
我记得我读过一些关于给每个用户一个唯一的会话id,并将其与另一个值进行比较,这解决了我所遇到的问题,但我忘记了它在哪里。
我有一个向SQL表提交文本的简单表单。问题在于,在用户提交文本之后,他们可以刷新页面并再次提交数据,而无需再次填写表单。我可以在文本提交后将用户重定向到另一个页面,但我希望用户停留在同一页面上。
我记得我读过一些关于给每个用户一个唯一的会话id,并将其与另一个值进行比较,这解决了我所遇到的问题,但我忘记了它在哪里。
当前回答
基本上,你需要重定向出该页面,但它仍然可以使一个问题,而你的互联网缓慢(重定向头从服务器端)
基本场景示例:
点击提交按钮两次
解决方法
客户端 一旦客户端点击它,禁用提交按钮 如果你使用Jquery: Jquery.one PRG模式 服务器端 使用基于差分的哈希时间戳/发送请求时的时间戳。 Userequest令牌。当主进程加载完成时,分配一个临时请求标记,如果重复则忽略该标记。
其他回答
处理表单时,重定向到另一个页面:
... process complete....
header('Location: thankyou.php');
您也可以重定向到同一页面。
如果您正在做一些类似评论的事情,并且希望用户停留在相同的页面上,您可以使用Ajax来处理表单提交
我找到了下一个变通办法。您可以通过操作历史对象在处理POST请求后转义重定向。
你有一个HTML表单
<form method=POST action='/process.php'>
<input type=submit value=OK>
</form>
当你在你的服务器上处理这个表单时,你不是重定向用户到/the/result/页面,而是像这样设置Location头:
$cat process.php
<?php
process POST data here
...
header('Location: /the/result/page');
exit();
?>
处理post数据后,呈现小的<脚本>和result/ the/result/page
<?php
process POST data here
render the <script> // see below
render `/the/result/page` // OK
?>
你应该渲染的<脚本>:
<script>
window.onload = function() {
history.replaceState("", "", "/the/result/page");
}
</script>
结果是:
如你所见,表单数据被post到process.php脚本。 这个脚本处理post数据并立即渲染/the/result/page:
没有重定向 当你刷新页面时没有rePOST数据(F5) 当你通过浏览器历史导航到上一页/下一页时,没有rePOST
UPD
作为另一个解决方案,我要求Mozilla FireFox团队允许用户设置NextPage头,它将像Location头一样工作,使post/redirect/get模式过时。
简而言之。当服务器处理表单POST数据成功时:
设置NextPage头而不是位置 呈现POST表单数据处理的结果,就像在POST /redirect/ GET模式中呈现GET请求一样
浏览器依次看到NextPage头:
调整窗口。位置与NextPage值 当用户刷新页面时,浏览器将协商GET请求NextPage而不是rePOST表单数据
我认为这将是极好的,如果实施,不是吗?=)
$_POST['submit']变量在页面初始加载时不存在,并且只有在以下条件为真时才可以运行curl。
if($_POST['submit'] == "submit"){
// This is where you run the Curl code and display the output
$curl = curl_init();
//clear $post variables after posting
$_POST = array();
}
正如其他人所说,不可能不使用post/redirect/get。但与此同时,在服务器端做你想做的事情也很容易。
在POST页面中,只需验证用户输入,但不对其进行操作,而是将其复制到SESSION数组中。然后再次重定向到主提交页面。您的主提交页面首先检查您正在使用的SESSION数组是否存在,如果存在,则将其复制到本地数组中并取消设置。从那里你可以采取行动。
这样你只需要做一次主要的工作,就能完成你想做的事情。
我还想指出,您可以使用javascript方法window.history.replaceState来防止在刷新和返回按钮时重新提交。
<script>
if ( window.history.replaceState ) {
window.history.replaceState( null, null, window.location.href );
}
</script>
这里的概念证明:https://dtbaker.net/files/prevent-post-resubmit.php(链接不再工作)
我仍然推荐Post/Redirect/Get方法,但这是一个新颖的JS解决方案。