是否有防止刷新后重复插入一个简单的方法? 我现在做的方式是选择与除ID的所有字段作为参数一切; 如果记录存在,我不插入。 有没有一种办法可以检测刷新?
Answer 1:
我想你可能要EXISTS的功能。 这里有一个简单的解释EXISTS我通过谷歌找到。
Answer 2:
假设这是一个数据库,你可以穿上“除ID的所有字段”的组合,唯一约束,赶上上插入或更新除外。
Answer 3:
我同意@Austin萨洛宁,你应该通过保护与DB主键,唯一约束和外键启动。
上述工作完成后,许多网站将包括一些JS背后的提交按钮立即发送的请求之前禁用按钮。 这样一来,谁双击用户不发送两个请求。
Answer 4:
就像Dereleased说,使用基于303重定向。 使表单提交使用POST并保存有后发303头,并将其通过Location头将通过GET来读取和刷新不会重新发布数据发送到提交之后的URL。
Answer 5:
这是一个很长的时间,因为我做了任何真正的Web工作。 但是,早在1.1天,我记得使用带有回传相关联的ID,以确定是否有刷新了发生。
快速搜索后,我觉得这是我根据我的解决方案从文章:
http://msdn.microsoft.com/en-us/library/ms379557(VS.80).aspx
基本上,它展示了如何建立一个新的页面类,你可以继承。 基类将暴露你的时候,你正在做的事情是不应该在刷新重复调用的方法,以及IsPageRefresh的方法来跟踪,如果刷新已发生。
那篇文章是为有类似目标的变化,很多的基础,所以它应该是一个良好的开端。 不幸的是我不记得有足够的了解它是如何去真正给予更多的帮助。
Answer 6:
我第二请求提交后(插入到数据库中的记录)的选项将用户重定向到另一个(确认)页面。 这样,他们将无法执行刷新。
你也可以有一个标志,指示插入请求是否已经提交,它要么存放的页面(使用JavaScript),或在会议上。 您还可以更进一步,它保存在别处,但是这是在你的web应用程序的一部分的架构决策。
如果您使用的是AJAX请求中插入一条记录,然后这是一个有点很难防止这种在客户端。
我宁愿做那么指示器/标志比较的字段。 这当然取决于你的记录。 例如,如果它是一个简单的商店,用户想要作出相同的顺序,那么你就会把它作为一个重复的秩序,有效防止功能。
Answer 7:
您正在使用什么数据库? 如果它的MySQL,以及实现对齐的某些其他因素,你总是可以使用 编辑:施特鲁克为SQL Server INSERT IGNORE INTO ...
。
或者,你可以创建“处理程序”页面,比如你的进程是这样的:
- 用户试图执行“行动”
- 用户被发送到“doAction.xxx”
- “doAction.xxx”完成,并重定向到“actionDone.xxx”
- ???
- 利润!
编辑:在重新阅读你的问题后,我会更倾向于第二种方案; 通过重定向创建一个中间页(通常是一个HTTP / 1.1 303查看其它 ),你通常可以防止这样的困惑。 在数据库上的唯一身份检查是一个好主意,但对于不想刷新重复上一个动作的简单情况,这是一个优雅和成熟的解决方案。