0

開始日と終了日の間に時間がない会議室予約システムを作成しているため、理論的には、検証では開始日と終了日の時間枠内に日付/時間がないことを確認する必要があります。

私は2つのテーブルを持っています。開始日と終了日の両方で問題なく挿入できるので、現時点で興味のある列はこれらだけです

会議室
|------------------------------------|
|- ブッキングタイム -|-bookingend-|

サニティ チェックの背後にある原理と、疑似コードで実行できるチェックを理解しています。ここに私がこれまでに得たコードがあります - >

p4a_db::singleton()->query("INSERT INTO meetingrooms(location_id, bookingtime, bookingend, merono_id)
                WHERE bookingtime < " . $date . " AND bookingend > " . $date . "
                OR
                bookingdate < " . $date . " AND bookingend > " . $dateend . "
                VALUES(?,?,?,?)",
                array($location, $date, $dateend, $merono));

ステートメントにデータを直接挿入したくありませんが、これを行う方法を理解するまで行き詰まっているので、質問は、

予約された時間内に日付を取得しないように、データが挿入されるにサニティ チェックを実行するにはどうすればよいですか。

どんな助けでも大歓迎です。

4

2 に答える 2

2

編集:

私は自分の答えを考えすぎていましたが、開始日と終了日を比較するのは役に立たないため、期間が必要なため、古いソリューションはあなたのケースでは機能しないことに気付きました。

これを処理する私の方法は次のようになります。

  1. 日付を int として保存し、24 時間制を使用します (午前 7 時 40 分は 740、午後 9 時 50 分は 2150 です)。
  2. 保存されている日付を確認します: ( Start<NewStart<End)
  3. 保存されている日付を確認します: ( Start<NewEnd<End)
  4. 複数の部屋を処理する場合は、部屋番号 + 時間を int として格納するだけです。そうすれば、2 と 3 の方法を引き続き使用できます。

2 と 3 は SQL クエリで実行できます。このリンクを確認してください。

古い回答 (重複のチェック)

これは、テキストを挿入する前に重複 (この場合は電子メール) をチェックする方法の例です。

    $emailexist = $mysqli->prepare("select email from users where email = ?");
    $emailexist->bind_param('s', $email);
    $emailexist->execute();
    $emailexist->store_result();
    if ($emailexist->num_rows > 0) {
        $emailexist->close();
        $mysqli->close();
        return true;
    }
    else {
        $emailexist->close();
        $mysqli->close();
        return false;
    }

文字列を含む行があるかどうかを確認します。その場合 (行数が 0 より大きい場合)、true を返します (つまり、日付が既に存在することを意味します)。

これをコードに適応させることができます。

ただし、列を UNIQUE に設定することもできます。次に、挿入しようとするとエラーが発生します。その方が簡単で、同時接続に問題はありません。

于 2012-12-07T14:36:41.623 に答える
0

長く集中的な検索の後、SQL インジェクションから保護する方法とともに、この方法の実際の例を取得しました。コードは次のとおりです。

if ($this->BookingValue == 1)
    {
        $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));

        if ( 0 == $result["num"] )
        {

         p4a_db::singleton()->query("INSERT INTO meeting_room_bookings (start_at, end_at, meeting_room_id)
                    VALUES
                    (?,?,?)", array($date, $dateend, $merono));

            return true;
        }       
        else
        {
         return false;

このコードについて説明することはあまりありませんが、違いに関しては (テーブルの列名の変更を除く)、値が設定される前にクエリが準備され、ifステートメントで使用できるようになりました。したがって、異なる日付間で結果をフィルタリングするために検証を行うことができます。

ANDこれに加えて、会議室 ID が単一の値に制限されているステートメントを介して、他の会議室からの日付がステートメントに含まれないようにするための検証を追加しました。

別の質問につながるのは、このステートメントから発生する別のスローされたエラーですが、挿入が適切であることはわかっていますが、この準備されたステートメントの何かがエラーを引き起こします。

SQLSTATE[HY093]: Invalid parameter number: number of bound variables does not match number of tokens File: Pdo.php, Line: 234

現在、準備されたステートメントからスローされたエラーを調べており、修正があったときにこの回答を更新します。助けてくれてありがとう。

于 2012-12-13T09:21:47.343 に答える