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

ロジックの分離の観点から、これはコントローラーで処理する必要があると思います。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 に答える
1

SQL インジェクションについて警告するコメントは正しいです。

データ型検索に使用BETWEENするのは問題があります。DATETIMEこれがあなたの問題かどうかはわかりませんが、そうかもしれません。

DATETIMEたとえば、 の値を考えてみましょ'2013-04-13 11:00:00' う。これは になると思いますがBETWEEN '2013-04-13' AND '2013-04-13'、そうではありません'2013-04-13 00:00:00'

この の使用に関する不快な問題の 1 つは、BETWEEN1 日の範囲が機能しないことです。

日付範囲の一致に必要なのは

      date_to_test >= start_date
  AND date_to_test < end_date + INTERVAL 1 DAY
于 2013-04-13T13:08:11.053 に答える