使用MySQL或PHP计算时差量(以分钟为单位)?

使用MySQL或PHP计算时差量(以分钟为单位)?,php,mysql,time,Php,Mysql,Time,我使用以下字段保存用户登录信息: 用户id、登录日期、登录时间、状态 在每次尝试登录后,将使用true或false状态向数据库中插入一条记录。我想锁定用户,如果他/她在过去3分钟内有3次登录失败。因此,我需要使用当前时间,并以分钟格式计算表中最后3条记录的时间差 我的问题是: 1-哪一个更适合进行此时间计算?PHP还是MySQL? 2-取决于你的建议,哪个功能更适合它 谢谢。不同的用法。如果我是您,我将在数据库中记录上次失败登录的日期和时间,这样您就可以从数据库中获取上次失败登录的时间以及数据库

我使用以下字段保存用户登录信息:

用户id、登录日期、登录时间、状态

在每次尝试登录后,将使用true或false状态向数据库中插入一条记录。我想锁定用户,如果他/她在过去3分钟内有3次登录失败。因此,我需要使用当前时间,并以分钟格式计算表中最后3条记录的时间差

我的问题是:
1-哪一个更适合进行此时间计算?PHP还是MySQL?
2-取决于你的建议,哪个功能更适合它


谢谢。

不同的用法。如果我是您,我将在数据库中记录上次失败登录的日期和时间,这样您就可以从数据库中获取上次失败登录的时间以及数据库中的用户数据

在PHP或MySQL中进行比较是可以的


但是,您应该记住MySQL服务器和Web服务器应该具有相同的时区,并且应该同步时间,否则您的结果将不准确。

不同的用法。如果我是您,我将在数据库中记录上次失败登录的日期和时间,这样您就可以从数据库中获取上次失败登录的时间以及数据库中的用户数据

在PHP或MySQL中进行比较是可以的


但是,您应该记住,MySQL服务器和Web服务器应该具有相同的时区,并且应该同步时间,否则您的结果将不准确。

考虑到您还需要做很多其他事情,我建议使用php。您可以在用户尝试使用登录时检索最后3条记录

SELECT login_date, login_time, status FROM table WHERE user_id=$id ORDER BY login_DATE DESC LIMIT 3
然后在PHP中可以进行检查。如果失败,您仍然需要通知用户他已被锁定,锁定用户(其他表?),并返回false进行登录

在php中,您可以执行如下检查

  • 是否返回树尝试(少即无锁)
  • 上次检索到的记录是否少于30分钟?(否则没有锁)
  • 所有树返回的值都是错误的尝试(否则没有锁)
  • 等等

    • 考虑到您还需要做很多其他事情,我建议使用php。您可以在用户尝试使用登录时检索最后3条记录

      SELECT login_date, login_time, status FROM table WHERE user_id=$id ORDER BY login_DATE DESC LIMIT 3
      
      然后在PHP中可以进行检查。如果失败,您仍然需要通知用户他已被锁定,锁定用户(其他表?),并返回false进行登录

      在php中,您可以执行如下检查

      • 是否返回树尝试(少即无锁)
      • 上次检索到的记录是否少于30分钟?(否则没有锁)
      • 所有树返回的值都是错误的尝试(否则没有锁)
      • 等等
    • 我认为MySQL总是一个更好的计算解决方案,因为它比PHP快得多
    • 如果您使用时间戳,您可以简单地执行time_x-time_y以秒为单位获得差值,您的总计算结果将是:(time_x-time_y)/60,您的查询将如下所示:

      选择用户id、登录日期、登录时间、状态((login\u time-NOW())/60)作为与usertable不同的颜色

    • 我认为MySQL总是一个更好的计算解决方案,因为它比PHP快得多
    • 如果您使用时间戳,您可以简单地执行time_x-time_y以秒为单位获得差值,您的总计算结果将是:(time_x-time_y)/60,您的查询将如下所示:

      选择用户id、登录日期、登录时间、状态((login\u time-NOW())/60)作为与usertable不同的颜色


    • 以下查询根据您的条件返回所有用户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
      

      以下查询根据您的条件返回所有用户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
      

      您可以对登录日期和时间使用相同的字段。(有一个
      DATETIME
      数据类型)@ShivanRaptor你也能告诉我
      TIMESTAMP
      的情况吗?它的值类似于
      DATETIME
      。它们有什么区别?
      TIMESTAMP
      DATETIME
      的范围不同。另外,
      时间戳
      不支持时区(始终以UTC格式保存)。请参阅:您可以使用同一字段作为登录日期和时间。(有一个
      DATETIME
      数据类型)@ShivanRaptor你也能告诉我
      TIMESTAMP
      的情况吗?它的值类似于
      DATETIME
      。它们有什么区别?
      TIMESTAMP
      DATETIME
      的范围不同。另外,
      时间戳
      不支持时区(始终以UTC格式保存)。见:谢谢你的回答。我知道这些步骤,只是我需要在PHP和MySQL之间做一个比较,然后为此选择最好的函数。谢谢你的回答。我知道这些步骤,只是我需要在PHP和MySQL之间做一个比较,然后选择最好的函数<代码>和状态='f'。是吗?是的。我已将此添加到查询中。我认为它在where子句中必须有另一个规则<代码>和状态='f'。是吗?是的。我已将此添加到查询中。