2017-09-17 4 views
1

PostgreSQL과 PHP를 사용하는 많은 SQL 문을 사용하며 그 중 많은 부분은 'WHERE'절에 변수가 있습니다. INSERT 및 UPDATE에 대해 잘 실행되도록 준비된 명령문을 얻을 수는 있지만 WHERE 절에 변수가있는 SELECT 문에서 작동하게 만들 수는 없습니다. 나는 성공을위한 대답을 위해 구글을 샅샅이 뒤졌다. 아래 예를 살펴보십시오. 이것은 bankrec이라는 테이블에서 최근에 조정 된 은행 잔고를 선택하는 것입니다. 내가 뭘 놓치고 있니? 나는이 프로그램을 실행할 때WHERE 절에 매개 변수를 바인드 할 수 없습니다. PDO

$rec = $dbh->prepare('SELECT clearedbal FROM bankrec WHERE bankno = :bankno '); 
$result = $rec->execute(['bankno'=>$bankno])->fetch(PDO::FETCH_ASSOC); 

내가 얻을 :

"Fatal error: Call to a member function fetch() on boolean" 

을하지만, 나는 단순히 준비된 문없이 쿼리를 실행하는 나에게 내가 원하는 결과를 얻을 수 있기 때문에 쿼리가 올바른지 알고 있지만, 그것은에 취약 SQL 주입 :

$rec = $dbh->query("SELECT clearedbal FROM bankrec WHERE bankno = '$bankno' ")->fetch(PDO::FETCH_ASSOC); 
+1

'$ rec-> fetch (PDO :: FETCH_ASSOC);하지만 execute는'bool'을 반환합니다. –

+0

@LawrenceCherone 그게 간단한 수정 이었어! 그게 효과가있어! INSERT 및 UPDATE에 대해 체인을 연결할 수 있지만 SELECT는 연결할 수없는 이유는 무엇입니까? 고마워요! – AppreciateCo

+0

@AppreciateCo'execute()'는 부울을 반환하고,'query()'는 메서드 체이닝을 할 수있게 해주는'PDOStatement'를 반환합니다. – ishegg

답변

3

당신은 당신에게 PDO의 execute 방법은 정의에 의해 부울을 반환 this 링크를 볼 수 있듯이. 당신은 당신이 쿼리가 성공적으로 실행 여부를 결정하기 위해 execute을 사용할 수 있습니다 볼 수 있듯이

$rec = $dbh->prepare('SELECT clearedbal FROM bankrec WHERE bankno = :bankno '); 
if($rec->execute(['bankno'=>$bankno])){ 
    $result=$rec->fetch(PDO::FETCH_ASSOC); 
    //do another stuff there 
} else { 
    //Query failed handle error 
} 

:

나는이 방법을 추천 할 것입니다. 또한 결과를 한 줄 이상 가져와야 할 경우 http://php.net/manual/en/pdostatement.fetchall.php

+1

감사합니다 Dimitrios. 기본적으로 로렌스와 같은 말을 했어. 답변으로 의견을 표시 할 수 없으므로 귀하의 의견을 표기했습니다. 둘 다 감사합니다. – AppreciateCo