2016-10-10 3 views
0

基本的なログインサンプルに少し問題があります。ユーザー名とパスワードの組み合わせが間違っていると、elseステートメントのエラーメッセージは表示されません。それはwhileループのためでしょうか?私は助けが必要です。コードはelse文にエラーメッセージを表示しません

<?php 

$db = new PDO('mysql:host=127.0.0.1;dbname=project', 'root', ''); 

if(isset($_POST['username'], $_POST['password'])) { 
    $username = $_POST['username']; 
    $password = $_POST['password']; 
    $result = $db->query("SELECT * FROM users WHERE username='$username' AND password='$password'"); 

    if(empty($username) || empty($password)) { 
     echo 'Empty'; 
    } 

    while($row = $result->fetch(PDO::FETCH_OBJ)) { 
     if($username == $row->username && $password == $row->password) { 
      echo 'Logged in'; 
     } else { 
      echo 'Incorrect username and password combination'; 
     } 
    } 
} 
+1

この質問に対する答えを見つけたら、[SQLインジェクション](http://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection)を参照してください。 -in-php) – Naruto

+1

_「表示されません」_画面に何も表示されないか、代わりに「ログイン」エコーを表示していますか? – Epodax

+0

@Epodax正しい組み合わせであれば、「ログイン済み」と表示されます。そうでない場合は、何も表示しません(null) – JTrixx16

答えて

1

もちろん表示されません。結果を取得すると、行が返されないか、単に空になるためです。つまり、whileループ内のコードは実行されません。

は、というユーザー名とパスワードの条件に基づいて返される行数をカウントするクエリを実行することもできます。

$result = $db->query("SELECT COUNT(*) FROM users WHERE username='$username' AND password='$password'"); 

if (($row = $result->fetchColumn()) != 0) { 
    // logged in 
} 
else { 
    // incorrect username and password 
} 
+0

メッセージが間違っています。申し訳ありませんが – JTrixx16

+0

ですので、 'fetchColumn()'が良い方法です。 – JTrixx16

+0

条件に一致する行数/行数のみを選択したい場合はあります。 –

0

selectステートメントは、ユーザー名とパスワードの両方が正しい場合にのみ値を返します。したがって、正しくない場合、ループ内のコードは実行されません。あなたのSQL文からパスワードチェックを外す

試してみてください。

"SELECT * FROM users WHERE username='$username';" 
2

クエリ結果を再確認する必要はありません。クエリが成功すると、fetch()関数は結果行を返します。それ以外の場合はfalseを返します。

コード以下の変更

while($row = $result->fetch(PDO::FETCH_OBJ)) { 
    if($username == $row->username && $password == $row->password) { 
     echo 'Logged in'; 
    } else { 
     echo 'Incorrect username and password combination'; 
    } 
} 

$row = $result->fetch(PDO::FETCH_OBJ); 
if($row){ 
    echo 'Logged in'; 
}else{ 
    echo 'Incorrect username and password combination'; 
} 
TO注: フィールドので、ログイン目的で、一意の列でなければなりません。

関連する問題