我正在创建一段代码,在尝试用错误的密码登录5次之后,在24小时内阻止用户a 48小时。如果用户在24小时内成功登录,则应重置尝试计数。
我有ATM机的问题是,使用尝试计数,如果我尝试更多次,它只是更新该用户的第一行。下面是正在发生的事情的一个例子:
如您所见,所有尝试都会增加(括号中的数字),但最近的尝试将设置为1。我如何得到它,使所有的尝试增加,所以它看起来像这样。
下面是我的代码片段:
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"));
}
}发布于 2015-01-08 23:54:00
要将cula_attempt_count设置为尝试的和,您需要执行一个子查询来获得sum,即。
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表。
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)发布于 2015-01-08 23:53:30
在新记录的insert语句中,您试图将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))"该子查询将在48小时内返回用户上次登录尝试中的cula_attempt_count,IFNULL在那里处理用户在前48小时内未登录的情况,因此返回0。
https://stackoverflow.com/questions/27851403
复制相似问题