2013-05-22 7 views
-2

MySQL에서 PDO로 전환 중이며이 쿼리가 정확한지 확신 할 수 없습니다. if 명령을 작성해야합니다.PDO 로의 MySQL 쿼리

public function User_Login($_iUsername,$_iPassword) { 
    $username=mysql_real_escape_string($_iUsername); 
    $password=mysql_real_escape_string($password); 
    $md5_password=md5($_iPassword); 
    $query=mysql_query("SELECT _iD FROM users WHERE _iUsername='$_iUsername' and _iPassword='$md5_password' AND _iStatus='1'"); 
    if(mysql_num_rows($query) == 1) { 
     $row = mysql_fetch_array($query); 
     return $row['_iD']; 
    } else { 
     return false; 
    } 
} 

public function User_Login($_iUsername,$_iPassword) { 
    $md5_password = md5($_iPassword); 
    $sth = $db->prepare("SELECT _iD FROM users WHERE _iUsername='$_iUsername' and _iPassword='$md5_password' AND _iStatus='1'"); 
    $sth->execute(); 

    $result = $sth->fetchAll(); 
} 

답변

3

첫째, 당신은 제대로 쿼리를 매개 변수화 아닙니다. PDO를 사용하는 것은 좋지만 변경의 주요 목적 중 하나는 쿼리를 매개 변수화하는 것입니다. 둘째, md5은 매우 약한 해시입니다. 대신 bcrypt를 사용하는 것이 좋습니다. 마지막으로, PDOStatement::rowCount은 찾고있는 방법입니다.

$sth = $db->prepare("SELECT _ID FROM users WHERE _iUsername = ? 
    AND _iPassword = ? AND _iStatus = 1"); 
$sth->execute(array($_iUsername, $md5_password)); 
if ($sth->rowCount() == 1) { 
    $row = $sth->fetch(PDO::FETCH_ASSOC); 
    return $row['_iD']; 
} 
else { 
    return false; 
} 
+2

쿼리를 매개 변수화하면 SQL 주입 공격을 방지 할 수 있으므로 이점이 있습니다. – cdmckay

+1

'execute' 매개 변수는 배열이어야합니다. 'numRows'는'rowCount'이어야하며,'FETCH_ARRAY'라는 상수는 없습니다. –

+1

@JordanDoyle은 이미 다른 것들을 수정했지만'FETCH_ARRAY'를 업데이트했습니다. –