2012-12-05 78 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用户表