代码之家  ›  专栏  ›  技术社区  ›  Bryan M.

条令原始SQL和准备好的语句

  •  4
  • Bryan M.  · 技术社区  · 17 年前

    我有一个使用准备好的语句的条令查询。但是,在生成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)
    

    我遇到了同样的问题,代币没有被替换。

    1 回复  |  直到 17 年前
        1
  •  3
  •   Charlie    17 年前

    我并不完全熟悉原则,但是占位符应该是单独的,而不是?%“,只是吗?并在要传递的变量上添加百分比。看一看 example #6 .

    推荐文章