php - MYSQL 行没有正确递增

标签 php mysql

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

我遇到的 ATM 问题是,根据尝试计数,如果我尝试更多次,它只会更新该用户的第一行。以下是正在发生的事情的示例:

  • 用户 - 时间 - 尝试次数()
  • 用户 1 晚上 10:00 尝试 1 (5)
  • 用户 1 晚上 10:02 尝试 2 (4)
  • 用户 1 晚上 10:04 尝试 3 (3)
  • 用户 1 晚上 10:06 尝试 4 (2)
  • 用户 1 晚上 10:07 尝试 5 (1)
  • 用户 2 晚上 10:15 尝试 1 (2)
  • 用户 2 晚上 10:20 尝试 2 (1)

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

  • 用户 - 时间 - 尝试次数()
  • 用户 1 晚上 10:00 尝试 1 (5)
  • 用户 1 晚上 10:02 尝试 2 (5)
  • 用户 1 晚上 10:04 尝试 3 (5)
  • 用户 1 晚上 10:06 尝试 4 (5)
  • 用户 1 晚上 10:07 尝试 5 (5)
  • 用户 2 晚上 10:15 尝试 1 (2)
  • 用户 2 晚上 10:20 尝试 2 (2)

这是我的代码片段:

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"));
            }
    }

最佳答案

要将 cula_attempt_count 设置为尝试的总和,您需要执行子查询来获取总和,即。

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)

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

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)

关于php - MYSQL 行没有正确递增,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27851403/

相关文章:

php - PHP需要解析非常大的XML文件

php - MySQL数据中包含š、ć等特殊字符,但在网页上显示为 '?'。为什么?

MySQL 加入 MUL 键会影响性能吗?

php - 检查访问者IP是否在MySQL中

mysql - 更新 MySQL 中的日期格式

php - 使用 PHP 编辑 MySQL 条目

php - 无法加载模块 [redis],错误 :/usr/local/lsws//modules/redis. so: undefined symbol: zend_objects_destroy_object

php - 如何读取保存在客户端浏览器cookie内存中的laravel_session cookies?

php - 仅允许 HTML 净化器中类属性中的特定类

mysql - 将 Excel CSV 导入 MySQL 关系数据库?