2013-04-13 36 views
1

我堅持這一點。我自己的技能還不足以解決這個問題。CakePHP:搜索BETWEEN日期時間和驗證表單

我有這些領域的一種形式:

  • PLACE_ID
  • START_DATEDATETIME
  • END_DATEDATETIME

我儘量做到什麼:

  • 如果數據庫已在相同時間範圍內預訂, 在同一地點,則提交將失敗。

因此,查詢將是這個樣子:

SELECT * 
FROM bookings 
WHERE place_id=".$_POST['placeId']." 
AND('".$_POST['startDate']."' 
BETWEEN start_date 
AND end_date 
OR '".$_POST['endDate']."' 
BETWEEN start_date 
AND end_date)" 

如果返回NULL,提交意志成功。如何與CakePHP一起工作?請幫忙...

+0

您使用sql注入的風險非常高,您的代碼將在2秒內被黑掉 –

+0

搜索查詢僅僅是一個例子。只是不知道如何將其轉換爲CakePHP的方式。 – user1428033

回答

1

從邏輯角度來看的分離,我想這應該在你的控制器來處理。從奧利·瓊斯的建議的基礎上,在從用戶的瀏覽器後回,你應該做的事情如下所示:

$this->Booking->find('all', array('conditions' => array('Booking.start_date BETWEEN' => array($new_start_date, $new_end_date), 'Booking.end_date BETWEEN' => array($new_start_date, $new_end_date)) 

$new_start_date應設置爲$this->data['Booking']['start_date']和同樣的$new_end_date。答案剛開始看起來很亂,否則!

如果查詢不返回任何內容,則可以繼續並保存新的預訂。如果有預訂,您應該相應地通知您的用戶。

+0

謝謝。這是我需要的解決方案。但是,「BETWEEN」也會選擇相同的時間。所以,我想我需要使用比較,它只選擇時間範圍之間的日期時間,而不是等於'start_date'或等於'end_date'的日期時間。有人舉例說明如何做到這一點? – user1428033

+0

'BETWEEN'根據您的數據庫選擇包含範圍或獨佔範圍。如果你想有一個保證的排除範圍,那麼你應該使用'「Booking.start_date>」 => $起始日期,「Booking.end_date <' => $ start_date'。 –

+1

非常感謝你!現在看來工作。我使用的代碼如下:'$條件=陣列( \t \t \t \t '條件'=>數組( \t \t \t \t \t 'Booking.place_id'=> $這 - >數據[ '的預訂'] [ 'place_id'], \t \t \t \t \t 'Booking.start_date <' => $這 - >數據[' 的預訂 '] [' END_DATE'], \t \t \t \t \t 'Booking.end_date>'=> $這 - >數據[ '的預訂'] [ '起始日期'] \t \t); \t \t \t $預訂= $這個 - > Booking->找到( '所有',$條件); \t \t \t $這個 - >設置( '預約',$預約);' – user1428033

1

有關SQL注入的警告是正確的。

對於DATETIME使用BETWEEN數據類型搜索是有問題的。我不確定這是你的問題,但可能是。

考慮一個DATETIME價值,比方說,'2013-04-13 11:00:00'你會認爲這將是BETWEEN '2013-04-13' AND '2013-04-13',但它不是,因爲它是'2013-04-13 00:00:00'後。

這種使用BETWEEN的令人不快的問題之一是單天範圍不起作用。

您需要的日期範圍匹配什麼是

 date_to_test >= start_date 
    AND date_to_test < end_date + INTERVAL 1 DAY