sql >> データベース >  >> RDS >> Mysql

PHP / MySQL Appointment/Bookingシステムのベストプラクティス

    最後に、データベースで開始日と終了日のタイムスタンプを生成するシステムを選びました。チェックしている間、予定の重複時間を避けるために、最初に1秒を追加し、最後から1秒を減算しました。

    私は何をしたのか

    明らかに、これがベストプラクティスかどうかはわかりませんが、うまくいきました。ユーザーは、性別とその日の好みを選択することから始めます。これにより、AJAXリクエストが送信され、利用可能な人員とさまざまな種類の予定の種類(髪の色付け、髪の毛のカットなど)を取得します。

    すべての設定(性別、日付、人格、タイプ)が選択されたら、いくつかの簡単な検証から始めます。日付を確認し、日付( "N")が7(日曜日)でないかどうかを確認します。すべてが問題ない場合は、より重要な作業が開始されます:

    1)予定の種類は、この種類にかかる合計時間(30分、45分など)を含めてデータベースから取得されます。2)利用可能な個人が取得されます(その日の人の完全なリスト、または1人の場合は1人だけ) 1つが選択されます)利用可能な時間を含みます

    次に、ペルソナ(または1人)がループされ、自分の開始時刻から開始されます。この時点で、次のデータが含まれています。

    $duration (of the appointment type)
    $startTime (starting time of the person selected in the loop)
    $endTime (= $startTime + $duration)
    $personStart (= starting time of the person)
    $personEnd (= end time of the person)
    

    このデモデータを見てみましょう:

    $duration = 30 min
    $startTime = 9.00h
    $endTime = 9.30h
    $personStart = 9.00h
    $personEnd = 12.00h
    

    私がここでしていることは:

    while( $endTime < $personEnd )
    {
        // Check the spot for availability
        $startTime = $endTime;
        $endTime = $startTime + $duration;
    }
    

    明らかに、この場合は単純化されています。空室状況を確認すると、スポットが空いていないからです。 $ startTimeを、見つかった最新の予定と同じになるように設定し、ループ内でそこから開始します。

    例:

    I check for a free spot at 9.00 but the spot is not free because there's an appointment from 9.00 till 10.00, then 10.00 is returned and $startTime is set to 10.00h instead of 9.30h. This is done to keep the number of queries to a minimum since there can be quiet a lot.
    

    可用性機能の確認

    // Check Availability
    public static function checkAvailability($start, $end, $ape_id)
    {
      // add one second to the start to avoid results showing up on the full hour
      $start += 1;
      // remove one second from the end to avoid results showing up on the full hour
      $end -= 1;
    
      // $start and $end are timestamps
      $getAppointments = PRegistry::getObject('db')->query("SELECT * FROM appointments WHERE
        ((
            app_start BETWEEN '".date("Y-m-d H:i:s", $start)."' AND '".date("Y-m-d H:i:s", $end)."' 
              OR
            app_end BETWEEN '".date("Y-m-d H:i:s", $start)."' AND '".date("Y-m-d H:i:s", $end)."'
          ) 
        OR
          (
        app_start < '".date("Y-m-d H:i:s", $start)."' AND app_end > '".date("Y-m-d H:i:s", $end)."'
         ))
        AND
         ape_id = ".PRegistry::getObject('db')->escape($ape_id));
    
        if(PRegistry::getObject('db')->num_rows($getAppointments) == 0) {
          return true;
        } else {
          $end = 0;
          foreach(PRegistry::getObject('db')->fetch_array(MYSQLI_ASSOC, $getAppointments, false) as $app) {
            if($app['app_end'] > $end) {
              $end = $app['app_end'];
                }
        }
        return $end;
         } 
    }
    

    アポイントメントは「From:10.00Till:11.00」として保存しているので、11:00:01から11:59:59までは必ずチェックする必要があります。そうしないと、11:00のアポイントメントが結果に表示されます。

    関数の最後で、予定が見つかった場合は、結果をループして最新の終了を返します。これは、前述のループの次の開始です。

    うまくいけば、これは誰にとっても助けになるでしょう。情報と同じように:ape_id リンク先の「アポイントメントパーソン」のIDです。



    1. PHPでMySQLFound_Rows()を使用する方法は?

    2. LocalTimeStamp()がPostgreSQLでどのように機能するか

    3. 検索条件に「%」が含まれる「%」を使用したSQL「LIKE」クエリ

    4. djangoでのDISTINCTON