主义原始的SQL和预处理语句(Doctrine raw sql and prepared state

2019-07-29 18:42发布

我有使用准备语句的Doctrine_RawSql查询。 然而,他们似乎是生成的SQL查询时会被忽略。 但是,如果我离开了标记值,我得到不匹配(所以它至少试图子他们)绑定变量的数目异常。

如果我有这些值内联,被教条做幕后的东西,以防止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)

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

Answer 1:

我并不完全熟悉Doctrine_RawSql,而是一个占位符应本身,而不是“?%”,公正? 和你传递变量添加%。 看看例子#6 。



文章来源: Doctrine raw sql and prepared statements