2009-07-07 4 views
4

준비된 문을 사용하여 Doctrine_RawSql 쿼리를 얻었습니다. 그러나 SQL 쿼리가 생성 될 때 무시됩니다. 그러나 토큰 값을 제외하면 일치하지 않는 바운드 변수의 수에 대한 예외가 생깁니다 (적어도 하위 변수를 포함하려고합니다).Doctrine 원시 SQL과 준비된 문

이 값을 인라인으로 포함하면 Doctrine이 SQL 주입을 방지하기 위해 무언가를하고 있습니까?

public function sortedPhotogsByLocation($location) 
{ 
    $q = new Doctrine_RawSql(); 
    $result = $q->select('{p.*}') 
      ->from('photographers p') 
      ->addComponent('p', 'Photographer') 
      ->where('p.city_id = ?', $location->id) 
      ->orderBy('CASE WHEN p.lname < "?%" THEN 1 ELSE 0 END, p.lname ASC', $location->photographer_sort) 
      ->execute(); 
    return $result; 
} 

이 다음과 같은 SQL 출력을 제공 :

SELECT * 
    FROM photographers p 
    WHERE p.city_id = ? 
    ORDER BY 
    CASE WHEN p.lname < "?%" THEN 1 ELSE 0 END, p.lname 
    ASC 

편집 : $location의 특성이 제대로 설정되고

여기 내 코드입니다. 매개 변수를 하드 코드하면 다음과 같습니다.

->where('p.city_id = ?', 5) 

토큰이 대체되지 않는 동일한 문제가 발생합니다.

답변

3

Doctrine_RawSql에 익숙하지 않지만 "%%"가 아니라 자리 표시자가 있어야합니다. 전달할 변수에 %를 추가하십시오. example #6을보십시오.

+0

조언 해 주셔서 감사합니다. 자리 표시 자 문자열을 수정했습니다. 그러나 원래의 문제는 여전히 남아 있습니다. –

+1

당신이 옳았다는 것이 드러납니다. 자리 표시 자 문자열을 수정하면 문제가 해결됩니다. 내 원래의 질문은 잘못되었습니다. Doctrine은 SQL을 올바르게 생성하고있었습니다. 그러나 PDO 수준에서 토큰 대체가 발생 했으므로 Doctrine은 최종 SQL 문자열을 내 보내지 않았습니다. –