MYSQL 行没有正确递增
MYSQL rows are not incrementing properly
我正在创建一段代码,在 24 小时内尝试使用错误密码登录 5 次后阻止用户 a 48 小时。如果用户在 24 小时内成功登录,则应重置尝试次数。
我在 ATM 上遇到的问题是尝试计数,如果我尝试更多次,它只会更新该用户的第一行。这是发生了什么的示例:
- 用户-时间-尝试次数()
- 用户 1 10:00pm 尝试 1 (5)
- 用户 1 10:02pm 尝试 2 (4)
- 用户 1 10:04pm 尝试 3 (3)
- 用户 1 10:06pm 尝试 4 (2)
- 用户 1 10:07pm 尝试 5 (1)
- 用户 2 10:15pm 尝试 1 (2)
- 用户 2 10:20pm 尝试 2 (1)
如您所见,所有尝试都会递增(括号中的数字),但最近的尝试将设置为一次。我如何得到它,以便所有尝试都增加,所以它看起来像这样。
- 用户-时间-尝试次数()
- 用户 1 10:00pm 尝试 1 (5)
- 用户 1 10:02pm 尝试 2 (5)
- 用户 1 10:04pm 尝试 3 (5)
- 用户 1 10:06pm 尝试 4 (5)
- 用户 1 10:07pm 尝试 5 (5)
- 用户 2 10:15pm 尝试 1 (2)
- 用户 2 10:20pm 尝试 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
的值设置为字符串:'cula_attempt_count'
.
这是一个数字字段的无效值,因此 MySQL 将该字段的值设置为 0
,然后在下一个查询中增加到 1
。
要完成您正在尝试做的事情,您需要向您的插入添加一个子查询,如下所示:
"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))"
此子查询将 return 用户在 48 小时内最后一次登录尝试的 cula_attempt_count
,并且 IFNULL
用于处理用户在此期间未登录的情况前 48 小时,所以它 returns 0.
要将 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)
您需要嵌套内部查询,因此它被视为一个 tmp table
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)
我正在创建一段代码,在 24 小时内尝试使用错误密码登录 5 次后阻止用户 a 48 小时。如果用户在 24 小时内成功登录,则应重置尝试次数。
我在 ATM 上遇到的问题是尝试计数,如果我尝试更多次,它只会更新该用户的第一行。这是发生了什么的示例:
- 用户-时间-尝试次数()
- 用户 1 10:00pm 尝试 1 (5)
- 用户 1 10:02pm 尝试 2 (4)
- 用户 1 10:04pm 尝试 3 (3)
- 用户 1 10:06pm 尝试 4 (2)
- 用户 1 10:07pm 尝试 5 (1)
- 用户 2 10:15pm 尝试 1 (2)
- 用户 2 10:20pm 尝试 2 (1)
如您所见,所有尝试都会递增(括号中的数字),但最近的尝试将设置为一次。我如何得到它,以便所有尝试都增加,所以它看起来像这样。
- 用户-时间-尝试次数()
- 用户 1 10:00pm 尝试 1 (5)
- 用户 1 10:02pm 尝试 2 (5)
- 用户 1 10:04pm 尝试 3 (5)
- 用户 1 10:06pm 尝试 4 (5)
- 用户 1 10:07pm 尝试 5 (5)
- 用户 2 10:15pm 尝试 1 (2)
- 用户 2 10:20pm 尝试 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
的值设置为字符串:'cula_attempt_count'
.
这是一个数字字段的无效值,因此 MySQL 将该字段的值设置为 0
,然后在下一个查询中增加到 1
。
要完成您正在尝试做的事情,您需要向您的插入添加一个子查询,如下所示:
"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))"
此子查询将 return 用户在 48 小时内最后一次登录尝试的 cula_attempt_count
,并且 IFNULL
用于处理用户在此期间未登录的情况前 48 小时,所以它 returns 0.
要将 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)
您需要嵌套内部查询,因此它被视为一个 tmp table
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)