4

基本上,我有一个带有阻塞系统的登录系统。如果用户尝试超过 5 次,则阻止,如果他仍会尝试,则尝试次数会增加。

要删除它,我这样做:

"DELETE FROM login_attempts WHERE date < DATE_SUB(NOW(), INTERVAL :time) AND ip_address = :ip"

:time = 间隔日期

例子:

            if ($fetch['attempts'] < 6)
            {
                $time = "10 MINUTE";
            } 
            else if ($fetch['attempts'] < 10) 
            {
                $time = "1 HOUR";
            }
            else if ($fetch['attempts'] < 21)
            {
                $time = "1 DAY";
            }
            else if ($fetch['attempts'] > 21)
            {
                $time = "14 DAY";
            }

基本上我想要做的是,我需要找出如何告诉玩家他什么时候会被解锁。

如果我知道他将被解锁的时间量,我如何回应直到他被解锁的时间?我不想只回显日期,我需要准确回显多少天、多少小时等。

我从来没有这样做过,我被困在这一点上。

4

2 回答 2

2

您写道:“这些失败将在 1 天后重置”。那么失败的尝试次数不可能超过 21 次,因为在第 21 次尝试失败时,该帐户将被锁定一天。

我认为你应该只在成功尝试时重置计数器。

话虽如此,让我们回到您的实际问题。您试图显示该帐户将保持锁定多长时间。

我会采取相反的方法:根据失败的尝试次数,计算帐户解锁的日期,然后计算到该日期的剩余时间。

第 1 步:失败的尝试次数

SELECT COUNT(*) AS failed_count
FROM login_attempts WHERE account_id = :account AND ip_address = :ip

第 2 步:解锁日期/时间,基于失败的尝试次数

纯 SQL 中的解决方案:

SELECT
    CASE
        WHEN COUNT(*) <= 5 THEN DATE_ADD(MAX(date_of_attempt), INTERVAL 10 MINUTE)
        WHEN COUNT(*) <= 10 THEN DATE_ADD(MAX(date_of_attempt), INTERVAL 1 HOUR)
        WHEN COUNT(*) <= 20 THEN DATE_ADD(MAX(date_of_attempt), INTERVAL 1 DAY)
        ELSE DATE_ADD(MAX(date_of_attempt), INTERVAL 14 DAY)
    END AS unlock_date
FROM login_attempts WHERE account_id = :account AND ip_address = :ip

注意:我将根据您将在应用程序层中维护的规则从 PHP 动态构建上述查询。但请坚持使用此查询,因为您可以在一个查询中获取所有内容,并且如果您有适当的索引,它几乎可以立即运行。

第 3 步:距离解锁日期/时间还有多长时间

要么在 PHP 中计算(应该很简单),要么直接从 MySQL 中计算:

SELECT
    TIMEDIFF(
        NOW(),
        CASE
            WHEN COUNT(*) <= 5 THEN DATE_ADD(MAX(date_of_attempt), INTERVAL 10 MINUTE)
            WHEN COUNT(*) <= 10 THEN DATE_ADD(MAX(date_of_attempt), INTERVAL 1 HOUR)
            WHEN COUNT(*) <= 20 THEN DATE_ADD(MAX(date_of_attempt), INTERVAL 1 DAY)
            ELSE DATE_ADD(MAX(date_of_attempt), INTERVAL 14 DAY)
        END          
    ) AS time_remaining_in_hours
FROM login_attempts WHERE account_id = :account AND ip_address = :ip
于 2013-07-08T10:53:25.473 回答
-2

您可能想在这里查看 timediff 函数, http: //dev.mysql.com/doc/refman/5.5/en/date-and-time-functions.html#function_timediff

于 2013-07-04T17:05:45.180 回答