简单的PDO暴力查询不起作用

时间:2016-02-01 13:00:20

标签: php mysql database pdo

我尝试检查用户已提交的尝试登录信息。由于某些原因,它跳过甚至很难我在我的数据库中有7个条目,达到+1的尝试,具有类似的IP和print...

这是我的查询,可以找到完整代码here

user_id

用户怎么跳过这部分?

图片: 表结构

enter image description here

表格

enter image description here

我的代码

enter image description here

VAR_DUMP结果

enter image description here

1 个答案:

答案 0 :(得分:4)

来自phpdoc

  

PDOStatement :: rowCount()返回受相应PDOStatement对象执行的最后一个DELETE,INSERT或UPDATE语句影响的行数。

     

如果关联的PDOStatement执行的最后一条SQL语句是SELECT语句,则某些数据库可能会返回该语句返回的行数。但是,并不保证所有数据库都有这种行为,不应依赖于便携式应用程序。

请注意不要使用rowCount进行select次查询的建议。相反,我会改变你的代码:

$sql = "
SELECT  count(*) AS attempt_nr
FROM    users_login_attempts 
WHERE   user_id = :userid 
AND     time > DATE_ADD(NOW(), INTERVAL -1 HOUR)
AND     user_ip = :userip
";

$results = $db_connect->prepare($sql);
if ($results->execute(array(':userid' => $user_id,':userip' => $remote_ip))) {
    $row = $results->fetch(PDO::FETCH_ASSOC);
    $count_tries = $row['attempt_nr'];
    if ($count_tries < 5) {
        // DO SOMETHING IF LIMIT IS NOT REACHED
    }
    else { 
        // RETURN FAILURE 
    }
}

此外,请注意,如果代码正常运行,即使用户成功登录,您也可以在5次登录尝试失败后有效锁定用户,因此您还需要确保清除成功登录失败的历史记录或使您的SQL更复杂以解决这个问题。