sql >> Database >  >> RDS >> Mysql

Best practice voor PHP/MySQL Afspraken/Boekingssysteem

Uiteindelijk ben ik voor een systeem gegaan dat tijdstempels voor de begin- en einddatum in de database aanmaakte. Tijdens het controleren heb ik een seconde toegevoegd aan het begin en een seconde afgetrokken van het einde om overlappende tijd voor afspraken te voorkomen.

Wat heb ik uiteindelijk gedaan

Natuurlijk weet ik niet zeker of dit de beste methode is, maar bij mij werkte het wel. De gebruiker begint met het selecteren van hun geslacht en een voorkeur voor de dag. Dit stuurt een AJAX-verzoek om het beschikbare personeel en verschillende soorten afspraaktypes te krijgen (bijvoorbeeld haar kleuren, haar knippen, enz.).

Als alle instellingen zijn gekozen (geslacht, datum, personeel en type) begin ik met enkele eenvoudige validaties:controleren van de datum, controleren of de datum ("N") niet 7 (zondag) is. Als alles in orde is, wordt aan de belangrijkere dingen begonnen:

1) Het afspraaktype wordt opgehaald uit de database inclusief de totale hoeveelheid tijd die dit type in beslag neemt (30 minuten, 45 minuten, enz.) 2) Het beschikbare personeel wordt opgehaald (een volledige lijst van mensen op die dag of slechts één persoon indien één is gekozen) inclusief hun beschikbare tijden

Het personeel (of één persoon) wordt dan doorgelust, te beginnen met hun eigen starttijd. Op dit moment heb ik een set gegevens met:

$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)

Laten we deze demogegevens nemen:

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

Wat ik hier doe is:

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

Uiteraard is het in dit geval allemaal vereenvoudigd. Want als ik kijk op beschikbaarheid, en de plek niet vrij is. Ik heb de $startTime ingesteld om gelijk te zijn aan de laatst gevonden afspraak en begin vanaf daar in de lus.

Voorbeeld:

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.

Beschikbaarheidsfunctie controleren

// 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;
     } 
}

Aangezien ik afspraken bewaar als "Van:10.00 uur tot 11.00 uur" moet ik ervoor zorgen dat ik plekken van 11:00:01 tot 11:59:59 controleer, omdat anders de afspraak om 11:00 in de resultaten zal verschijnen.

Aan het einde van de functie, voor het geval er een afspraak wordt gevonden, loop ik de resultaten door en retourneer ik het laatste einde. Dit is de volgende start in de lus die ik hierboven noemde.

Hopelijk kan dit voor iedereen iets betekenen. Even ter info:ape_id is de ID van de "afspraakpersoon" waaraan het is gekoppeld.



  1. Wat is er nieuw in ProxySQL 2.0

  2. Laravel 4:meerdere waar met of in welsprekend

  3. Hoe gebruik ik CASE..WHEN op de juiste manier in MySQL

  4. Verkrijg MySQL-database-uitvoer via PHP naar XML