views:

323

answers:

4

I'm trying to get all records with date greater then now. I tried this but it doeasnt work:

$all_dates = $this->TourDate->find('all', array('conditions' => array('TourDate.date >=' => 'NOW()'), 'order' => array('TourDate.date ASC')));

If I replace NOW() with the current date it works. Why's that?

+3  A: 

I do not use CakePHP but I am pretty sure that your 'NOW()' is parsing to string and finally you got something like

TourDate.date >= 'NOW()'

Maybe you should just try

array('TourDate.date >= NOW()')

as a value only instead of spliting it to key => value style ?

hsz
yes that made it. I didn't know it was possible to not to use the key => value style. Thank you
kaklon
Hint - if some answer is a solution - mark it by clicking on the check box outline to the left of the answer.
hsz
A: 

hsz is correct. Cake is interpreting the NOW() condition as the string 'NOW()'. Providing a full SQL snippet in your conditions will work, as hsz suggests.

You might be tempted to use date('Y-m-d H:i:s') in place of NOW() (as I suggested in the first version of this answer). Don't do it! As hsz points out below, this will prevent the query from being cached.

Daniel Wright
If you use `date()` queries will not be cached.
hsz
A: 

I believe CakePHP strips out any SQL like functions to prevent a SQL injection attacks. Much as it annoys me, I usually use the date('Y-m-d H:i:s') trick too.

Dan Berlyoung
No, it's not doing it for security purposes. Cake just takes the value inside the associative array and throws it into string literals for MySQL. The solution above (putting the NOW() function in the key, not the value) works. Still weird that you got downvoted for simply being incorrect.
Travis Leleu
+1  A: 

'conditions' => array('TourDate.date >= NOW()')

Otherwise, cakephp will quote the NOW() function, and mysql will think of it as a string.

antonienko