2012-10-24 2 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 
    ) 
)); 

왜 이러한 해결책이 효과가 없는지 알고 있습니다. 모델 필드가 배열 값이 아닌 조건의 배열 키인 경우에만 모델 필드가 처리되기 때문입니다.

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

을하지만 난 SQL 주입에 대한 케이크의 보호의 혜택을받지 못했습니다 :

나는 난 그냥 문자열로() 조건 사이의 전체를 넣을 경우이 작업을 얻을 수 있습니다 알고 있습니다.


같은 문제의 또 다른 예는 간단하다,이다는 이해하기 :

원하는 SQL을 :

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

그리고 :

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

그래서 나는이 시도 케이크가 ' qu을 넣기 때문에 다시는 작동하지 않습니다. NOW() 부분 주위에.

CakePHP에서 만든 SQL :

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

답변

0

더 나은 그것으로() NOW 함수를 사용하지하고 기능은 인덱스를 사용하지 않습니다. 더 나은 해결책은 다음과 같습니다.

$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

관련 문제