2013-04-13 105 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