1

私は今、SHA1 + PDO + 準備済みステートメントの組み合わせを使用できるようにし、それでも Web ページにログインできるようにする方法を理解するために何時間も戦っています:)だから私の質問はそうする方法ですか? これが私のコードです:

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 になり、必要なすべての変数を埋めるにはどうすればよいでしょうか? ありがとうございました。

4

1 に答える 1

1

SQL ステートメントはカウントするだけで、ユーザー名と ID を選択していません。これを SQL ステートメントとして使用する必要があります。

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

パスワードのバインドについては、次のようにすれば問題なく動作するはずです。rowCountまた、 and 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 に答える