0

ユーザーが要求した時間内にセッションがすでにスケジュールされているかどうかを確認するスクリプトがあります。その時間枠に別のセッションがある場合、ユーザーがセッションをスケジュールできないようにする必要があります。これが私がやったことです:

//Check to make sure no sessions have been already scheduled for this time

$session_check_query = "SELECT * FROM requested_sessions WHERE username_t = '{$tutor_usernname}'";
$session_check_process = mysql_query($session_check_query);

while ($session_check = mysql_fetch_array($session_check_process)) {
    if ($session_check['time_from'] - $session_to_time <= 900 && $session_check['time_from'] > $session_to_time && $session_check['accepted'] == 1) {
        header("Location:../../../iframes/schedule-session.php?".$url_string."&error=notavail");
        exit;
    }

    if ($session_check['time_from'] <= $session_from_time && $session_check['time_to'] >= $session_to_time && $session_check['accepted'] == 1) {
        header("Location:../../../iframes/schedule-session.php?".$url_string."&error=notavail");
        exit;
    }
}

最初の "if" ステートメントは、次の 15 分以内に次のセッションがないことを確認し、2 番目の "if" ステートメントは、入力された時間がスケジュールされたセッションの範囲内に収まらないことを確認します。

ただし、午後 11 時から午後 12 時までにスケジュールされたセッションがあるとします。このコードは、たとえば 11:15 から 11:30 と入力すると正常に機能しますが、11:30 から 12:15 または 10:45 から 12:15 のように入力すると、テストに合格します。

ユーザーが入力した時間範囲と、すでにスケジュールされているセッションとの間に重複がないことを確認するコードが必要です。

4

3 に答える 3

3

必要なのは、選択した時間がセッションの開始後に終了し、セッションの終了前に開始するかどうかを知ることです。

// You obviously need to set these appropriately or change the code below for your needs
$userSelectedStart = 1;
$userSelectedEnd   = 2;
$knownStart        = 3;
$knownEnd          = 4;

if ($userSelectedStart <= $knownEnd && $userSelectedEnd >= $knownStart) {

}
于 2013-02-13T20:07:39.317 に答える
0
"SELECT COUNT(*) FROM requested_sessions WHERE username_t = '{$tutor_usernname}'
    AND
(time_to > ".($session_from_time - 900)." OR  time_from < ".($session_to_time + 900).")";

セッションの終了時間が新しいセッションの開始時間 (必要な 15 分の休憩を差し引いた時間) よりも長い場合、セッションは重複します。

セッションの開始時間が新しいセッションの終了時間 (これに 15 分間の休憩を加えた時間) よりも短い場合、それらは重複しています。

Ergo: COUNT(*) がゼロ以外の場合、何かが重複しています。もちろん、必要に応じて重複するセッションの実際のデータを照会することもできます。

于 2013-02-13T20:24:19.517 に答える
0

この問題は、重複するセッションの ID のリストを返す単純なクエリを使用して解決することもできます。クエリ (@S/@E) で変数を使用しましたが、それらは実際の値に置き換えることができ、おそらく置き換えるべきです。また、開始時刻 (@S) から 15 分を引き、終了時刻 (@E) に 15 分を加算する必要があることにも注意してください。

スキーマ:

CREATE TABLE SESSION (
  ID BIGINT NOT NULL PRIMARY KEY,
  USER_ID VARCHAR(30) NOT NULL,
  START DATETIME NOT NULL,
  END DATETIME NOT NULL 
  );

INSERT INTO SESSION VALUES (1, 'test', '2013-02-10 14:00:00', '2013-02-10 14:30:00');
INSERT INTO SESSION VALUES (2, 'test', '2013-02-10 12:00:00', '2013-02-10 13:30:00');
INSERT INTO SESSION VALUES (3, 'test', '2013-02-10 16:00:00', '2013-02-10 21:30:00');
INSERT INTO SESSION VALUES (4, 'test', '2013-02-10 8:00:00', '2013-02-10 11:30:00');

クエリ:

SET @S = '2013-02-10 14:40:00';
SET @E = '2013-02-10 16:00:00';
SELECT ID FROM SESSION
 WHERE START <= @S AND END > @S
 OR START > @S AND START <= @E;

SQL Fiddle のリンクは次のとおりです: http://sqlfiddle.com/#!2/5d958e/6/2

于 2013-02-13T21:12:22.420 に答える