-1

予約システムがあります。

MySQL データベースには、指定された予約の開始時刻と終了時刻のフィールドが の形式で含まれる予約テーブルがありますhh:mm:ss。秒は常に 00 です。

私の予約システムから、新しい予約が行われるまでの時間を、開始時刻と終了時刻の形式で hh:mm:ss の形式で送信します。

作成しようとしている新しい予約が、既にデータベースにある以前の予約と重複していないかどうかを確認する必要があります。

まず、POST で送信された開始時刻と終了時刻を含む 2 つの変数を用意します。

$startNewBooking$endNewBooking

だから私のSQLはおそらくこのように始まるでしょう

SELECT * FROM bookings WHERE starttime>=$startNewBooking AND .........

row count > 0次に、重複する時間が見つかった場合はエラーをエコーし​​ます....

このための構文またはロジックを教えてください。

ありがとうございました

4

1 に答える 1

2

これは私のクエリです。必要に応じて値を編集してください

  $sql = "SELECT COUNT(*) as num FROM meeting_room_bookings
            WHERE
            (
            (startdate < start_at AND startdate > start_at)
            OR
            (startdate > start_at AND enddate < end_at)
            )
            AND
            meeting_room_id = whatever_id i was on about at the time :P";

データをサニタイズする場合は、開始日と終了日の値を「?」に置き換える必要があります。そして、このようなことをします->

 $sql = "SELECT COUNT(*) as num FROM meeting_room_bookings
            WHERE
            (
            (? < start_at AND ? > start_at)
            OR
            (? > start_at AND ? < end_at)
            )
            AND
            meeting_room_id = ?";

    $result = p4a_db::singleton()->fetchRow($sql, array($date, $date, $date, $dateend, $merono));

さらに進むには:

$sql = "SELECT COUNT(*) as num FROM meeting_room_bookings
                WHERE
                (
                ( start_at >= ? AND start_at <= ? )
                OR
                ( start_at <= ? AND end_at >= ? )
                OR
                ( end_at >= ? AND end_at <= ? )
                OR
                ( ? >= ? )
                )
                AND
                meeting_room_id = ?";

        $result = p4a_db::singleton()->fetchRow( $sql, array( $date, $dateend, $date, $dateend, $date, $dateend, $date, $dateend, $merono ) );

この方法では、フィールドの周囲のフィールドの外側のフィールド内に日付が入らないようにするか、その領域からのその他の可能性を許可しません (図を参照)。

||       |-----------|      ||   first booking 
|-----|                          ok
        |---|                    fails
                  |----|         fails
             |----|               fails

完全な説明が必要な場合は、このトピックに移動してください

エラーメッセージを実行するときは、 if else も実行する必要があるため、次の構文で作業を行う必要があります。

if ( 0 == $result["num"] )
        {
            p4a_db::singleton()->query( "INSERT INTO meeting_room_bookings ( start_at, end_at, meeting_room_id, tennant_id, centre_id )
                    VALUES
                    ( ?, ?, ?, ?, ? )", array( $date, $dateend, $merono, $row['tennant_id'], $centreRow['id'] ) );
            return true;
        }
        else
        {
            P4A::singleton()->messageError("The selected times conflict with another booking. Please select another time or meeting room!");
        }

センター ID とテナント ID のフィールドは無視してください (これらを使用しない場合)。これらのフィールドは、予約が正しいテナントと正しい会議室に設定されるようにするためのものです。必要に応じてこれを使用し、必要なものを置き換えてください。


ところで、私はp4aアプリケーションフレームワークを使用しているのでP4A::singleton()->messageError、phpエラーメッセージmoboberに置き換える必要があります

于 2013-01-24T14:32:51.423 に答える