Doctrine原始sql和准备好的语句

时间:2009-07-07 16:39:58

标签: php sql doctrine pdo

我使用预处理语句获得了Doctrine_RawSql查询。但是,在生成SQL查询时,它们似乎会被忽略。但是如果我省略了令牌值,我会得到一个关于绑定变量数量不匹配的异常(所以它至少试图将它们分入)。

如果我将这些值内联包含在内,那么Doc​​trine是否会在幕后做任何事情来阻止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)

我遇到了相同的问题,令牌没有被替换。

1 个答案:

答案 0 :(得分:3)

我对Doctrine_RawSql并不完全熟悉,但占位符本身应该是,而不是“?%”,只是?并在您传递的变量上添加%。看看example #6