2011-08-16 2 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. 사용자가 있는지 여부를 확인한 후에는 일치하는 사용자의 수 데이터베이스 테이블은 처음부터 중복 된 사용자를 보유 할 수 없어야합니다! usernameemail 열은 고유 인덱스로 정의해야합니다.

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

편집 : 일반 텍스트 BTW, 당신은 저장해서는 안 암호. 수많은 사이트가 해킹되어 비밀번호가 도난당했습니다. Google 에 대한 비밀번호는입니다.

관련 문제