2011-06-19 71 views
4

我有一個mySQL數據庫和一個創建項目新記錄的表。每個創建的項目都有一個「項目名稱」和一個事件創建日期(類型爲DATETIME)。檢查是否在最近x秒內添加了mySQL記錄

可以有兩個使用相同名稱創建的項目,但是如果它們是由同一用戶快速連續創建的,則可以安全地假定它是用戶部分的錯誤(單擊兩次,當事件刷新瀏覽器時變量傳遞等)。

如何編寫SQL語句來檢查是否存在具有相同名稱的記錄,它是否在最近10秒內被添加?到目前爲止,我有以下幾點,儘管我不知道如何檢查最近10秒。

select * from projects where user = 'johnsmith' AND projectname = 'test' AND active='y' AND DATE(projectcreatedon) = CURRENT_DATE AND DATEPART() < ....? 
+1

我認爲正確的方法是,如果名稱已經存在做插入的交易條件: ,所以你可以避免你的問題 –

+0

要明確一點,有一個項目添加了相同的名稱是好的,但如果它在過去的10秒左右就沒有了。如果用戶確實想要添加同名的項目,我會讓他們等待幾秒鐘。 – zee

回答

6

替換和日期(projectcreatedon)= CURRENT_DATE AND DATEPART()< ....?與:

AND projectcreatedon > (now() - INTERVAL 10 SECOND) 
0

您試圖以錯誤的方式解決問題。爲什麼不從源頭消除問題?使用戶無法連續創建這兩個項目。

如果您的應用程序使用戶可以通過刷新多次提交表單,請考慮在處理GET/POST變量後使用重定向。

此外,使用簡單的客戶端技巧來禁用點擊一次後的提交按鈕。你可以用very small amount of jQuery

2

我建議不要在MySQL中保留這種檢查,因爲這可能不是知道錯誤的完美方式,因爲用戶可能在10秒後點擊提交或刷新頁面。相反,將檢查放在前端代碼中禁用兩次單擊提交按鈕或將用戶重定向到不傳遞變量的頁面。

但是,如果這是不是你想做些什麼,那麼這可能是您的查詢:

SELECT * 
FROM `projects` 
WHERE `user` = 'johnsmith' 
AND `projectname` = 'test' 
AND `active`='y' 
AND TIMESTAMPDIFF(SECOND, projectcreatedon, now()) > 10;