我现在正在为弄清楚如何使用 SHA1 + PDO + 预准备语句组合而仍然能够登录网页:)所以我的问题是如何做到这一点?这是我的代码:
if (!empty($user) && !empty($password))
{
$password = $this->doHash($user, $password);
$stmt = $db_login->prepare("SELECT COUNT(*) FROM account WHERE username=:user AND sha_pass=:password");
$stmt->bindValue(':user', $user, PDO::PARAM_STR);
$stmt->bindValue(':password', $password, PDO::PARAM_STR);
$stmt->execute();
$results_login = $stmt->fetchAll(PDO::FETCH_ASSOC);
if ($results_login['COUNT(*)'] > 0)
{
$_SESSION['user_name'] = $results_login['username'];
$_SESSION['user_id'] = $results_login['id'];
return true;
}
else
{
return false;
}
}
else
{
return false;
}
我的函数doHash看起来像这样:
public function doHash($user, $password)
{
return sha1(strtoupper($user).":".strtoupper($password));
}
所以我的问题是:$results_login***
从不使用SELECT COUNT(*)
版本进行处理,并且有时会处理SELECT *
版本,但并非总是如此。那么,我如何将其组合在一起以按预期工作,产生 true,并填充我需要的所有变量呢?谢谢。
您的 SQL 语句
只是计数,它没有选择用户名和 id,您需要将其用作您的 SQL 语句,或类似的东西:
"SELECT * FROM account WHERE username=:user AND sha_pass=:password"
对于密码绑定,以下内容应该可以正常工作。 我也会使用rowCount
,而且只使用fetch
,而不是fetchAll
。 试一试,看看它是否有效。
$stmt->bindValue(':password', doHash($user,$password), PDO::PARAM_STR);
$stmt->execute();
if($stmt->rowCount()==1){
$results_login=$stmt->fetch(PDO::FETCH_ASSOC);
$_SESSION['user_name'] = $results_login['username'];
$_SESSION['user_id'] = $results_login['id'];
return true;
}else{
return false;
}