我有一个mySQL数据库和一个创建项目新记录的表。创建的每个项目都有一个“项目名称”和一个事件创建日期(类型为DATETIME)。
可以使用相同的名称创建两个项目,但如果它们由同一个用户快速连续创建,则可以安全地假设用户方面存在错误(单击两次,在事件变量时刷新浏览器通过,等等。)。
如何编写SQL语句来检查是否已存在同名记录,是否在最近10秒内添加了?到目前为止,我有以下内容,虽然我不知道如何检查最后10秒。
select * from projects where user = 'johnsmith' AND projectname = 'test' AND active='y' AND DATE(projectcreatedon) = CURRENT_DATE AND DATEPART() < ....?
答案 0 :(得分:10)
替换AND DATE(projectcreatedon)= CURRENT_DATE和DATEPART()&lt; ....?用:
AND projectcreatedon > (now() - INTERVAL 10 SECOND)
答案 1 :(得分:3)
我建议不要在MySQL中保留这样的检查,因为这可能不是了解错误的完美方式,因为用户可能会在10秒后点击提交或刷新页面。相反,将检查放在前端代码中以禁用单击提交按钮两次或将用户重定向到没有传递变量的页面。
但如果这不是您想要做的,那么这可能是您的查询:
SELECT *
FROM `projects`
WHERE `user` = 'johnsmith'
AND `projectname` = 'test'
AND `active`='y'
AND TIMESTAMPDIFF(SECOND, projectcreatedon, now()) > 10;
答案 2 :(得分:1)
您正试图以错误的方式解决问题。为什么不在源头消除问题?使用户无法连续创建这两个项目。
如果您的应用程序使用户可以通过刷新多次提交表单,请考虑在处理GET / POST变量后使用重定向。
此外,使用简单的客户端技巧在单击一次后禁用提交按钮。您可以使用very small amount of jQuery
完成此操作