1

我现在正在努力弄清楚如何使用 SHA1 + PDO + Prepared Statement 组合并且仍然能够登录到网页:) 所以我的问题是如何做到这一点?这是我的代码:

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 *有时处理版本,但并非总是如此。那么我如何将它组合在一起以按预期工作,结果为真,并填充我需要的所有变量?谢谢你。

4

1 回答 1

1

您的 SQL 语句只是计数,它没有选择用户名和 id,您需要将其用作您的 SQL 语句,或类似的东西:

"SELECT * FROM account WHERE username=:user AND sha_pass=:password"

对于您的密码绑定,以下应该可以正常工作。我也会使用rowCountand only fetch, not 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;
}
于 2012-06-11T21:06:54.410 回答