2012-12-05 130 views
1

我節省了用戶的使用下面的字段唱信息:用MySQL或PHP計算分鐘數量的時間差?

USER_ID,login_date,login_time,狀態

每個試圖進行登錄後,記錄將使用真正插入到數據庫或錯誤的狀態。如果他/她在最近3分鐘內有3次登錄失敗,我想鎖定用戶。所以我需要使用當前時間並以分鐘格式計算其與最後3個記錄表的差值。

我的問題是:
1-哪一個最好做這個時間計算? PHP還是MySQL?
2-取決於你的建議,哪個功能更好?

謝謝。

+2

您可以使用相同的字段登錄日期和時間。 (有'DATETIME'數據類型) – Raptor

+0

@ShivanRaptor你能告訴我關於'TIMESTAMP'嗎?它的價值與'DATETIME'類似。他們有什麼不同? –

+0

'TIMESTAMP'和'DATETIME'有不同的範圍。另外,'TIMESTAMP'不支持時區(始終以UTC保存)。請參閱:https://dev.mysql.com/doc/refman/5.5/en/datetime.html – Raptor

回答

1

下面的查詢返回所有USER_ID的根據您的情況:

select user_id from t 
where login_date= CURDATE() 
     and login_time>TIMESTAMPADD(MINUTE,-3,CURTIME()) 
     and status = 'f' 
group by user_id 
having count(*)>3 
+0

我認爲它在where子句中必須有另一個規則。 '和狀態='f''。這樣對嗎 ? –

+0

是的。我已經添加了這個查詢。 – valex

0

不同的用法。如果我是你,我會在數據庫中記錄上次失敗的登錄日期&時間,以便您可以從數據庫中獲取上次失敗的登錄時間以及數據庫中的用戶數據。

在PHP或MySQL中進行比較是可以的。

但是,您應該記住,MySQL服務器& Web服務器應該有相同的時區和時間應該同步,否則您的結果將不準確。

0

考慮到你還需要做很多其他的事情,我說使用PHP。當他嘗試登錄時,您可以檢索用戶的最後3條記錄。

SELECT login_date, login_time, status FROM table WHERE user_id=$id ORDER BY login_DATE DESC LIMIT 3 

然後在PHP中,您可以執行檢查。如果失敗,你仍然需要通知用戶他被鎖定,鎖定用戶(其他表?)並返回false登錄。

在PHP中,你可以做一些檢查像

  • 是否有樹嘗試返回(少即是無鎖)
  • 是最後的檢索記錄小於3分鐘老了嗎? (否則無鎖)
  • 都樹返回值虛假嘗試(別的無鎖)
+0

感謝您的回答。我知道這些步驟,只需要對PHP和MySQL進行比較,然後爲此選擇最佳功能。 –

0
  1. 我認爲MySQL是始終計算一個更好的解決方案,因爲它是快了很多然後是PHP。
  2. 如果使用時間戳,你可以簡單的做time_x - time_y獲得在幾秒鐘之差,你的總的計算將是:(time_x - time_y)/ 60和您的查詢看起來東西這樣的:

    SELECT USER_ID,login_date,login_time,狀態,((login_time-NOW())/ 60)爲differenceColomn FROM用戶表