1

我被这个困住了。我自己的技能不足以自己解决这个问题。

我有一个包含这些字段的表单:

  • PLACE_ID
  • START_DATE( DATETIME)
  • END_DATE( DATETIME)

我试图达到的目标:

  • 如果同一时间范围内同一地点的数据库中已有预订,则提交失败。

因此,查询看起来像这样:

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 一起工作?请帮忙...

4

2 回答 2

1

警告您有关 SQL 注入的注释是正确的。

用于数据类型搜索是有问题的BETWEENDATETIME我不确定这是你的问题,但它可能是。

考虑一个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
于 2013-04-13T13:08:11.053 回答
1

从逻辑分离的角度来看,我认为这应该在您的控制器中处理。根据 Ollie Jones 的建议构建,在从用户浏览器回发后,您应该执行以下操作:

$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。否则,答案就会开始变得混乱!

如果查询没有返回任何内容,那么您可以继续保存您的新预订。如果有预订,您应该相应地通知您的用户。

于 2013-04-13T13:41:45.907 回答