2011-08-16 4 views
1

私はPDO PHPを使い始めました。私もログイン関数を書こうとしていますが、資格情報が正しいことは分かっていますが、falseを返しています。PDOスクリプトが動作しない行の量を取得しますか?

私は、スクリプトを実行している行の量を取得しようとしていると思います。

function check_login($email, $username, $password) 
{ 
    $host = 'localhost'; 
    $port = 3306; 
    $database = 'example'; 
    $username = 'root'; 
    $password = ''; 

    $dsn = "mysql:host=$host;port=$port;dbname=$database"; 
    $db = new PDO($dsn, $username, $password); 
    $password = md5($password); 

    $statement = $db->prepare("SELECT * FROM users WHERE email = ? or username = ? and password = ?"); 
    $statement->execute(array($email, $username, $password)); 

    while ($result = $statement->fetchObject()) { 
     $sql = "SELECT count(*) FROM users WHERE email = ? or username = ? and password = ?"; 
     $result1 = $db->prepare($sql); 
     $result1->execute(array($email, $username, $password)); 
     $number_of_rows = $result1->fetchColumn(); 
     if ($number_of_rows == 1) 
     { 

      $_SESSION['login'] = true; 
      $_SESSION['uid'] = $result->uid; 
      return TRUE; 
     } 
     else 
     { 
      return FALSE; 
     } 
    } 
} 

答えて

1
  1. この:

    WHERE email = ? or username = ? and password = ? 
    

    が...この等しい:operator precedenceによる

    WHERE email = ? or (username = ? and password = ?) 
    

    ...。つまり、電子メールアドレスで検証する場合、ログインに有効なパスワードを入力する必要はありません。

  2. ユーザーが存在するかどうかを確認したら、一致するユーザーの数データベーステーブルは、最初に重複したユーザーを保持することはできません!列usernameおよびemailは、一意のインデックスとして定義する必要があります。

  3. ループの使用は、最初の繰り返しでreturnになる場合はありません。それはうまくいくかもしれませんが、混乱します。

これは十分なはずです:

$statement = $db->prepare('SELECT uid FROM users WHERE (email = ? or username = ?) and password = ?'); 
$statement->execute(array($email, $username, $password)); 

if ($result = $statement->fetchObject()) { 
    $_SESSION['login'] = true; 
    $_SESSION['uid'] = $result->uid; 
    return TRUE; 
}else{ 
    return FALSE; 
} 

は編集:はところで、あなたはプレーンテキストでパスワードを保存するべきではありません。無数のサイトがハッキングされ、パスワードが盗まれました。 Googleのパスワードはです。

関連する問題