如何防止刷新页面时重新提交表单(F5 / CTRL+R)
我有一个简单的表单,可以将文本提交到我的 SQL 表。问题是,用户提交文本后,他们可以刷新页面并再次提交数据,而无需再次填写表单。我可以在提交文本后将用户重定向到另一个页面,但我希望用户留在同一页面上。
我记得读过一些关于为每个用户提供唯一的会话 ID 并将其与另一个值进行比较的内容,这解决了我遇到的问题,但我忘记了它在哪里。
I have a simple form that submits text to my SQL table. The problem is that after the user submits the text, they can refresh the page and the data gets submitted again without filling the form again. I could redirect the user to another page after the text is submitted, but I want users to stay on the same page.
I remember reading something about giving each user a unique session id and comparing it with another value which solved the problem I am having but I forgot where it is.
如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。
绑定邮箱获取回复消息
由于您还没有绑定你的真实邮箱,如果其他用户或者作者回复了您的评论,将不能在第一时间通知您!
发布评论
评论(21)
我还想指出,您可以使用 JavaScript 方法
window.history.replaceState
来防止刷新和后退按钮时重新提交。我仍然推荐 Post/Redirect/Get 方法,但这是一种新颖的 JS 解决方案。
I would also like to point out that you can use a javascript approach,
window.history.replaceState
to prevent a resubmit on refresh and back button.I would still recommend a Post/Redirect/Get approach, but this is a novel JS solution.
使用发布/重定向/获取模式。 http://en.wikipedia.org/wiki/Post/Redirect/Get
在我的网站中,我将在 cookie 或会话中存储消息,在发布后重定向,读取 cookie/会话,然后清除该会话或 cookie 变量的值。
Use the Post/Redirect/Get pattern. http://en.wikipedia.org/wiki/Post/Redirect/Get
With my website, I will store a message in a cookie or session, redirect after the post, read the cookie/session, and then clear the value of that session or cookie variable.
您可以通过会话变量防止表单重新提交。
首先,您必须在文本框中设置
rand()
并在表单页面上设置$_SESSION['rand']
:之后检查
$_SESSION['rand' ]
与文本框$_POST['randcheck']
值像这样:
确保在使用
session_start()
使用的每个文件上启动会话You can prevent form resubmission via a session variable.
First you have to set
rand()
in a textbox and$_SESSION['rand']
on the form page:After that check
$_SESSION['rand']
with textbox$_POST['randcheck']
valuelike this:
Make sure you start the session on every file you are using it with
session_start()
我使用此 JavaScript 行来阻止在提交表单后刷新时要求重新提交表单的弹出窗口。
只需将此行放在文件的页脚即可看到神奇的效果
I use this javascript line to block the pop up asking for form resubmission on refresh once the form is submitted.
Just place this line at the footer of your file and see the magic
您确实应该使用 Post Redirect Get 模式来处理此问题,但如果您以某种方式最终处于 PRG 不可行的位置(例如,表单本身位于包含中,防止重定向),您可以散列一些请求参数根据内容创建一个字符串,然后检查您是否尚未发送。
You should really use a Post Redirect Get pattern for handling this but if you've somehow ended up in a position where PRG isn't viable (e.g. the form itself is in an include, preventing redirects) you can hash some of the request parameters to make a string based on the content and then check that you haven't sent it already.
处理表单后,您将重定向到另一个页面:
您也可以重定向到同一页面。
如果您正在执行评论之类的操作并且希望用户停留在同一页面上,则可以使用 Ajax 来处理表单提交
When the form is processed, you redirect to another page:
you can also redirect to the same page.
if you are doing something like comments and you want the user to stay on the same page, you can use Ajax to handle the form submission
我找到了下一个解决方法。您可以在处理
POST
请求后通过操作history
来逃避重定向目的。所以你有 HTML 表单:
当你在服务器上处理此表单时,你不是通过设置
Location
标头将用户重定向到/the/result/page
,如下所示:处理后
POST
渲染的数据很小和结果
/the/result/page
code> 你应该渲染:
结果是:
,
您可以看到表单数据被
POST
编辑到process.php
脚本。此脚本处理
POST
数据并立即渲染/the/result/page
:POST
> 刷新页面 (F5) 时的数据POST
UPD
作为另一个解决方案,我问 功能请求Mozilla FireFox团队允许用户设置< code>NextPage 标头,其工作方式类似于
Location
标头,并使post/redirect/get
模式过时。简而言之。当服务器成功处理表单
POST
数据时:NextPage
标头而不是Location
POST
表单的结果以post/redirect/get
模式呈现GET
请求的数据浏览器在看到
NextPage
标头时依次:window.location
与NextPage
值GET
请求到NextPage
,而不是重新POST
表单数据我认为如果实现的话,这将是非常好的,不是? <代码>=)
I found next workaround. You may escape the redirection after processing
POST
request by manipulatinghistory
object.So you have the HTML form:
When you process this form on your server you instead of redirecting user to
/the/result/page
by setting up theLocation
header like this:After processing
POST
ed data you render small<script>
and the result/the/result/page
The
<script>
you should render:The result is:
as you can see the form data is
POST
ed toprocess.php
script.This script process
POST
ed data and rendering/the/result/page
at once with:POST
data when you refresh page (F5)POST
when you navigate to previous/next page through the browser historyUPD
As another solution I ask feature request the Mozilla FireFox team to allow users to setup
NextPage
header which will work likeLocation
header and makepost/redirect/get
pattern obsolete.In short. When server process form
POST
data successfully it:NextPage
header instead ofLocation
POST
form data as it would render forGET
request inpost/redirect/get
patternThe browser in turn when see the
NextPage
header:window.location
withNextPage
valueGET
request toNextPage
instead of rePOST
form dataI think this would be excelent if implemented, would not?
=)
使用标头并重定向页面。
header("Location:your_page.php");
您可以重定向到同一页面或不同页面。将$_POST插入数据库后取消设置。
unset($_POST);
Use header and redirect the page.
header("Location:your_page.php");
You can redirect to same page or different page.Unset $_POST after inserting it to Database.
unset($_POST);
一个非常可靠的方法是在帖子中实现一个唯一的 ID 并将其缓存在
然后在代码中执行以下操作:
A pretty surefire way is to implement a unique ID into the post and cache it in the
Then in your code do this:
Moob 帖子的精炼版。创建 POST 的哈希值,将其保存为会话 cookie,并比较每个会话的哈希值。
A refined version of Moob's post. Create a hash of the POST, save it as a session cookie, and compare hashes every session.
基本上,您需要重定向出该页面,但当您的互联网速度较慢时,它仍然会出现问题(从服务器端重定向标头)
基本场景示例:
单击提交按钮两次
解决
客户端
的 方法
服务器端
Basically, you need to redirect out of that page but it still can make a problem while your internet slow (Redirect header from serverside)
Example of basic scenario :
Click on submit button twice
Way to solve
Client side
Server side
如何防止 php 表单重新提交而不重定向。如果您使用 $_SESSION (在 session_start 之后)和 $_POST 表单,您可以执行以下操作:
在您的 html 表单中输入以下内容:
因此,每次提交表单时,都会生成一个新的行为,存储在会话中并与事后行为相比。
Ps:如果您使用的是 Get 表单,您可以轻松地将所有 POST 更改为 GET,并且它也可以工作。
How to prevent php form resubmission without redirect. If you are using $_SESSION (after session_start) and a $_POST form, you can do something like this:
In your html form put this:
So, every time when the form is submitted, a new act is generated, stored in session and compared with the post act.
Ps: if you are using an Get form, you can easily change all POST with GET and it works too.
$_POST['submit'] 变量在页面初始加载时不存在,并且仅当以下条件为真时才能运行curl。
The $_POST['submit'] variable would not exist on initial loading of page, and curl can be run only if below condition is true.
插入数据库后,调用unset()方法清除数据。
unset($_POST);
要防止刷新数据插入,请在记录插入后执行页面重定向到同一页面或不同页面。
header('位置:'.$_SERVER['PHP_SELF']);
After inserting it to database, call unset() method to clear the data.
unset($_POST);
To prevent refresh data insertion, do a page redirection to same page or different page after record insert.
header('Location:'.$_SERVER['PHP_SELF']);
使用 Keverw 答案中的 Post/Redirect/Get 模式是一个好主意。但是,您无法停留在您的页面上(我认为这就是您所要求的?)此外,有时可能失败:
如果应将文本写入 SQL 数据库,另一种选择是存储在会话中,如下所示:
Using the Post/Redirect/Get pattern from Keverw answer is a good idea. However, you are not able to stay on your page (and I think this was what you were asking for?) In addition, it may sometimes fail:
Another option would be to store in a session if text should be written to your SQL database like this:
正如其他人所说,不可能不使用 post/redirect/get。但同时在服务器端做你想做的事情也很容易。
在 POST 页面中,您只需验证用户输入,但不对其进行操作,而是将其复制到 SESSION 数组中。然后您再次重定向回主提交页面。您的主提交页面首先检查您正在使用的 SESSION 数组是否存在,如果存在,则将其复制到本地数组中并取消设置。从那里您可以采取行动。
这样你只需完成所有主要工作一次,即可实现你想做的事情。
As others have said, it is not possible to out of using post/redirect/get. But at the same time it is quite easy to do what you want to do server side.
In your POST page you simply validate the user input but do not act on it, instead you copy it into a SESSION array. You then redirect back to the main submission page again. Your main submission page starts by checking to see if the SESSION array that you are using exists, and if so copy it into a local array and unset it. From there you can act on it.
This way you only do all your main work once, achieving what you want to do.
我后来寻找解决方案来防止在一个巨大的项目中重新提交。
该代码与 $_GET 和 $_POST 高度兼容,并且我无法在没有不可预见错误风险的情况下更改表单元素行为。
所以,这是我的代码:
它只能避免重新提交 $_POST,而不是 $_GET。但这是我需要的行为。
重新提交问题不适用于文件上传!
I searched for solution to prevent resubmission in a huge project afterwards.
The code highly works with $_GET and $_POST and I can't change the form elements behaviour without the risk of unforeseen bugs.
So, here is my code:
It only works to avoid the resubmit of $_POST, not $_GET. But this is the behaviour I need.
The resubmit issue doesn't work with file uploads!
对我有用的是:
以你的形式
What Works For Me is :
And in your Form
$everything_fine 是表单验证的布尔结果。如果表单未验证,则通常会再次显示并提示要更正的内容,以便用户可以再次发送。因此,如果需要更正的形式,也会再次创建 $_SESSION['uniq']
$everything_fine is the boolean result of form-validation. If the form is not validating then it shall be usually displayed again with a hint what to correct, so that the user can send it again. Therefore the $_SESSION['uniq'] is created again too if a corrected form is desired
这个
form.php
示例展示了如何正确使用 PRG(当表单有效或无效时)。This
form.php
sample shows how to use PRG correct (when form is valid or not).为什么不直接使用
$_POST['submit']
变量作为逻辑语句来保存表单中的任何内容。您始终可以重定向到同一页面(如果它们刷新,并且当它们在浏览器中点击返回
时,则不会再设置提交帖子变量。只需确保您的提交按钮有submit
的name
和id
。Why not just use the
$_POST['submit']
variable as a logical statement in order to save whatever is in the form. You can always redirect to the same page (In case they refresh, and when they hitgo back
in the browser, the submit post variable wouldn't be set anymore. Just make sure your submit button has aname
andid
ofsubmit
.