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)
토큰이 대체되지 않는 동일한 문제가 발생합니다.
조언 해 주셔서 감사합니다. 자리 표시 자 문자열을 수정했습니다. 그러나 원래의 문제는 여전히 남아 있습니다. –
당신이 옳았다는 것이 드러납니다. 자리 표시 자 문자열을 수정하면 문제가 해결됩니다. 내 원래의 질문은 잘못되었습니다. Doctrine은 SQL을 올바르게 생성하고있었습니다. 그러나 PDO 수준에서 토큰 대체가 발생 했으므로 Doctrine은 최종 SQL 문자열을 내 보내지 않았습니다. –