2012-10-24 45 views
0

我無法在我的條件下使用SQL函數NOW()來使用任何查找操作。CakePHP - 如何在查找條件中使用SQL NOW()

我有效地試圖建立一個查找查詢,說:

期望中的SQL:

WHERE (NOW() BETWEEN Promotion.start AND Promotion.end) AND Promotion.active = 1 

我已經嘗試了多種組合,但無論怎樣我現在使用的時候做的()中條件,它不起作用,因爲Cake建立的查詢會在模型字段周圍引用'引號,所以它們被MySQL解釋爲一個字符串。

$this->find('all', array(
    'conditions' => array(
     '(NOW() BETWEEN ? AND ?)' => array('Promotion.start', 'Promotion.end'), 
     'Promotion.active' => 1 
    ) 
)); 

CakePHP中創建的SQL:

注意周圍的模型領域的單引號在()之間,因此它們被視爲字符串。

WHERE (NOW() BETWEEN 'Promotion.start' AND 'Promotion.end') AND `Promotion`.`active` = '1' 

這也不起作用。

$this->find('all', array(
    'conditions' => array(
     'NOW() >=' => 'Promotion.start', 
     'NOW() <=' => 'Promotion.end', 
     'Promotion.active' => 1 
    ) 
)); 

我知道爲什麼這些解決方案不起作用。這是因爲如果模型字段是條件中的數組鍵,而不是數組值,則這些模型字段只能被視爲這樣。

我知道我能得到這個,如果我只是把整個BETWEEN()條件爲一個字符串工作:

$this->find('all', array(
    'conditions' => array(
     'NOW() BETWEEN Promotion.start AND Promotion.end', 
     'Promotion.active' => 1 
    ) 
)); 

但後來我沒有收到蛋糕的針對SQL注入保護的利益。


同樣的問題的另一個例子是,這是容易理解:

期望中的SQL:

WHERE Promotion.start > NOW() AND Promotion.active = 1 

所以我試試這個:

$this->find('all', array(
    'conditions' => array(
     'Promotion.start >' => 'NOW()', 
     'Promotion.active' => 1 
    ) 
)); 

而且再次它不工作,因爲蛋糕放' qu NOW()部分周圍的註釋。

CakePHP中創建的SQL:

WHERE `Promotion`.`start` > 'NOW()' AND `Promotion`.`active` = '1'' 

回答

0

最好不要現在使用()作爲它的一個功能,功能不使用索引。一個更好的解決方案是:

$this->find('all', array(
    'conditions' => array(
     "'" . date('Y-m-d') . "' BETWEEN Promotion.start AND Promotion.end", 
     'Promotion.active' => 1 
    ) 
)); 
+0

函數不使用索引是什麼意思? – BadHorsie

+0

MySQL不支持基於函數的索引。當查詢包含函數(或表達式)時,它不能使用索引。它必須進行全表掃描。嘗試擴展解釋並查看它不使用的索引;-) – RichardAtHome

1
$this->find('all', array(
    'conditions' => array(
     'NOW() BETWEEN Promotion.start AND Promotion.end', 
     'Promotion.active' => 1 
    ) 
)); 
+0

我已經說過,這樣就沒有內置的SQL注入保護。 – BadHorsie

+3

究竟是在這裏注入什麼?沒有用戶輸入。 – tigrang

+0

誰說的?促銷開始和結束字段是用戶輸入。 – BadHorsie

相關問題