2012-12-11 4 views
0

아래 코드를 시도 할 때 약간 혼란 스럽습니다. 원하는 결과가 나타납니다.PHP PDO DB 함수가 요청한 값 대신 1을 반환합니다.

include_once('config.class.php'); 
    $db = Core::getInstance();  
    $whr = '[email protected]'; 

    $inv = $db->dbh->prepare("SELECT * FROM ruj_users WHERE email=:whr"); 
    $inv->execute(array(":whr"=>$whr)); 
    $row = $inv->fetch(PDO::FETCH_ASSOC); 
    echo $row['email']; 
    echo $row['full_name']; 

그러나 다음 코드를 실행하면 원하는 결과가 아닌 1이 반환됩니다.

 include_once('config.class.php'); 
    $db = Core::getInstance();  
    $whr = '[email protected]';  

    function fetchUser($whr){ 
    $db = Core::getInstance();    
    $inv = $db->dbh->prepare("SELECT * FROM ruj_users WHERE :whr"); 
      $inv->execute(array(':whr'=>$whr)); 
    $res = $inv->fetch(PDO::FETCH_ASSOC); 
    return $res; 
} 
    $row = fetchUser("email = '".$whr."' "); 
    echo $row['email']; 
    echo $row['full_name']; 
+0

난 그냥이 $ 행을 반영하는 코드를 편집 = fetchUser ("이메일 = '"WHR $.. "'"); 나는 다시 1을 받았다. –

+1

'a = b'와 같은 명령문이 아니라 변수 만 바인딩 할 수 있습니다. – jeroen

+1

변수 만 바인딩 할 수 있고 명령문을 바인딩 할 수없는 이유는 전체 바인딩 된 변수가 SQL 문을 컴파일한다는 것이고 값만 누락하기 때문입니다. 명령문의 실행 부분은 변경되지 않습니다. DB가 매번 명령문을 다시 컴파일하지 않고 데이터가 더럽지도 실행될 코드를 수정하지 않기 때문에 보안 구멍을 제거하기 때문에 성능 이점이 있습니다. –

답변

1

이 쿼리처럼 쿼리의 SQL 주입 및 하드 코드를 방지하기 위해 화이트 목록에 대해 확인해야합니다 :

SELECT * FROM ruj_users WHERE :whr 

확장 할 때 :

표현 email = \'[email protected]\' 부울로 MySQL에 의해 평가하고 retu 있도록 항상 truthy입니다됩니다
SELECT * FROM ruj_users WHERE 'email = \'[email protected]\'' 

모든 행은 ruj_users입니다. 사용자 정의 조건을 원하는 경우

, 당신은 같은 것을 할 수 있습니다

function fetchUser(array $conditions) 
{ 
    // ... 
    $sql = 'SELECT * FORM ruj_users WHERE'; 
    $params = array(); 
    foreach ($conditions as $column => $value) { 
     if (preg_match('/^[a-z]+$/', $column)) { 
      $sql .= "`$column` = ?"; 
      $params[] = $value; 
     } 
    } 
    $inv = $db->dbh->prepare($sql); 
    $inv->execute(array_values($params)); 
    // ... 
} 

fetchUser(array(
    'email' => '[email protected]', 
    'status' => 23, 
)); 
+0

반환 할 함수에 항상 변수를 전달할 수 있도록 코드를 수정하려면 어떻게해야합니까? 컬럼 결과? –

+0

@ClaudeGrecea 추가 조건을 추가하는 방법의 예가 추가되었습니다. –

+0

빠른 처리를 보내 주셔서 감사합니다! –

1

당신은 기능에서 쿼리에 오류가 있습니다

$inv = $db->dbh->prepare("SELECT * FROM ruj_users WHERE :whr"); 

은 다음과 같아야합니다

$inv = $db->dbh->prepare("SELECT * FROM ruj_users WHERE email=:whr"); 

편집 : 당신은뿐만 아니라 열 이름을 전달하려는 경우, 함수에 다른 변수를 추가해야합니다.

function fetchUser($column, $value) { 
단지 값이 준비된 명령문에 바인딩 할 수 있습니다

참고 열 변수는이 ... WHERE $column = :whr ...

+0

흥미 롭습니다.이 답변 (그리고 @ 잭스)의 문제점은 무엇입니까? – jeroen

+0

$ row = fetchUser ("email = '". $ whr. "'");로 변경되었습니다. 그리고 여전히 1을 반환했습니다. 또한 귀하의 답변을 시도하고 1도 반환했습니다. –

+0

@Claude Grecea 질문 아래 내 의견을 참조하십시오. – jeroen