网上大部分教程是通过strtotime转换为时间戳来比较,其实可以通过msql自带的timestampdiff来快速比较优化代码。
user表中增加err_login_time,err_login_count 记录最后一次错误登陆时间和错误登陆次数。
关键代码如下:
public function isUserErr($username){
$UserErr = false;
$sql = "SELECT err_login_time,err_login_count FROM `user` WHERE username=:username and timestampdiff(MINUTE,err_login_time,now())<5";// :是一个占位符,为了防止sql注入
$stmt = $this->_db->prepare($sql);//进行预处理
$stmt->bindParam(':username',$username);//绑定变量
$stmt->execute();//执行查询
$err_login = $stmt->fetch(PDO::FETCH_ASSOC);//以数组索引的方式返回
if(!$err_login){
//echo "超过5分钟了,错误计数器归零";
$sql = "update user set err_login_count=0 where username=:username";
$stmt = $this->_db->prepare($sql);//进行预处理
$stmt->bindParam(':username',$username);//绑定变量
$stmt->execute();//执行查询
return false;
}
else{
if($err_login['err_login_count']<5)
{
return false;
}
else
{return true;}
}
}
//pdo相关内容自行补充
if($user->isUserErr("cas"))
{
echo "账号错误次数超过5次,账号禁用5分钟。";
}
else
{
echo "正常登陆";
};
在错误登陆时,需要记录错误时间和累计错误次数。