2009-07-07 66 views
4

我有一個使用預處理語句的Doctrine_RawSql查詢。但是,它們在生成SQL查詢時似乎會被忽略。但是,如果我忽略了令牌值,我會得到一個關於綁定變量數量不匹配的異常(所以它至少試圖將它們分入)。學說原始的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

感謝您的建議。我更正了佔位符字符串。但是,原來的問題仍然存在。 – 2009-07-07 17:44:04