首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >MYSQL行没有正确地递增。

MYSQL行没有正确地递增。
EN

Stack Overflow用户
提问于 2015-01-08 23:26:39
回答 2查看 69关注 0票数 0

我正在创建一段代码,在尝试用错误的密码登录5次之后,在24小时内阻止用户a 48小时。如果用户在24小时内成功登录,则应重置尝试计数。

我有ATM机的问题是,使用尝试计数,如果我尝试更多次,它只是更新该用户的第一行。下面是正在发生的事情的一个例子:

  • 用户时间尝试计数()
  • 用户1:10:00下午1 (5)
  • 用户1 10:02pm尝试2 (4)
  • 用户1 10:04pm尝试3 (3)
  • 用户1 10:06pm尝试4 (2)
  • 用户1 10:07pm尝试5 (1)
  • 用户2 10:15下午1 (2)
  • 用户2 10:20下午2 (1)

如您所见,所有尝试都会增加(括号中的数字),但最近的尝试将设置为1。我如何得到它,使所有的尝试增加,所以它看起来像这样。

  • 用户时间尝试计数()
  • 用户1:10:00下午1 (5)
  • 用户1 10:02pm尝试2 (5)
  • 用户1 10:04pm尝试3 (5)
  • 用户1: 10:06pm尝试4 (5)
  • 用户1 10:07pm尝试5 (5)
  • 用户2 10:15下午1 (2)
  • 用户2 10:20下午2 (2)

下面是我的代码片段:

代码语言:javascript
复制
if (!$pw_ok)    {
            if (isset($_SERVER["REMOTE_ADDR"])) {
                    $str_RemoteHost = $_SERVER["REMOTE_ADDR"];
                } else {
                    $str_RemoteHost = '';
                }
        $qry_WriteToDatabase = "INSERT INTO cms_user_login_attempts
                                (
                                    cula_user_id,
                                    cula_date_time,
                                    cula_remote_host,
                                    cula_attempt_count
                                )
                        VALUES      (
                                    " . $db->SQLString($row->user_id) . ",
                                    Now(),
                                    " . $db->SQLString($str_RemoteHost, true) . ",
                                    'cula_attempt_count'
                                    )";
        $db->query($qry_WriteToDatabase);

        $qry_UpdateCount = "UPDATE 
                                cms_user_login_attempts
                            SET 
                                cula_attempt_count = cula_attempt_count + 1
                            WHERE 
                                cula_user_id = " . $db->SQLString($row->user_id) . " ";
        $db->query($qry_UpdateCount);                           

        $qry_CheckDatabase = "  SELECT 
                                    CASE WHEN count(*) >= 5 THEN 0 ELSE 1 END as allowed_login 
                                FROM
                                    cms_user_login_attempts
                                WHERE
                                    cula_date_time >= DATE_SUB(CURRENT_TIMESTAMP, interval 48 hour) 
                                AND 
                                    cula_user_id = " . $db->SQLString($row->user_id) . "";
            $rs_CheckDatabase = $db->query($qry_CheckDatabase);

            if (! (isset($qry_CheckDatabase) && $qry_CheckDatabase)) {
            $errors->defineError("invalid_user_pass", "Too many attempts, account locked for 48hours.", array("username","password"));
            }
    }
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-01-08 23:54:00

要将cula_attempt_count设置为尝试的和,您需要执行一个子查询来获得sum,即。

代码语言:javascript
复制
UPDATE cms_user_login_attempts 
SET cula_attempt_count = (
    SELECT COUNT(*)
    FROM cms_user_login_attempts
    WHERE cula_user_id = $db->SQLString($row->user_id)
    AND cula_date_time > DATE_SUB(NOW(), INTERVAL 24 HOUR))
WHERE  cula_user_id = $db->SQLString($row->user_id)
AND cula_date_time > DATE_SUB(NOW(), INTERVAL 24 HOUR)

您需要嵌套内部查询,因此它被视为tmp表。

代码语言:javascript
复制
UPDATE cms_user_login_attempts 
SET cula_attempt_count = (
  SELECT * FROM (
    SELECT COUNT(*) as `sum`
    FROM cms_user_login_attempts
    WHERE cula_user_id = $db->SQLString($row->user_id)
    AND cula_date_time > DATE_SUB(NOW(), INTERVAL 24 HOUR)
  )
)
WHERE  cula_user_id = $db->SQLString($row->user_id)
AND cula_date_time > DATE_SUB(NOW(), INTERVAL 24 HOUR)
票数 1
EN

Stack Overflow用户

发布于 2015-01-08 23:53:30

在新记录的insert语句中,您试图将cula_attempt_count的值设置为字符串:'cula_attempt_count'

这是一个数值字段的无效值,因此MySQL将该字段的值设置为0,然后该值在下一个查询中递增为1

要完成您想要做的事情,您需要在插入中添加一个子查询,如下所示:

代码语言:javascript
复制
"INSERT INTO cms_user_login_attempts (ula_user_id, cula_date_time, cula_remote_host, cula_attempt_count )
VALUES (" . $db->SQLString($row->user_id) . ",
        Now(),
        " . $db->SQLString($str_RemoteHost, true) . ",
        IFNULL((SELECT cula_attempt_count FROM cms_login_attempts
            WHERE ula_user_id=" . $db->SQLString($row->user_id) . "
            AND cula_date_time >= DATE_SUB(CURRENT_TIMESTAMP, interval 48 hour)
            ORDER BY cula_date_time DESC LIMIT 1), 0))"

该子查询将在48小时内返回用户上次登录尝试中的cula_attempt_countIFNULL在那里处理用户在前48小时内未登录的情况,因此返回0。

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/27851403

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档