2016-10-10 4 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-Injection] (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를 반환합니다. TO

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'; 
} 

참고 :이름 필드가 있기 때문에 로그인 목적의 고유 한 열해야합니다.

관련 문제