sql >> Database teknologi >  >> RDS >> Mysql

Bedste praksis for PHP/MySQL aftale/booking system

Til sidst gik jeg efter et system, der genererede tidsstempler for start- og slutdatoer i databasen. Mens jeg tjekkede, tilføjede jeg et sekund til starten og trak et sekund fra slutningen for at undgå overlappende tid for aftaler.

Hvad endte jeg med at gøre

Jeg er naturligvis ikke sikker på, at dette er den bedste praksis, men det virkede for mig. Brugeren starter med at vælge sit køn og en præference for dagen. Dette sender en AJAX-anmodning for at få det tilgængelige personale og forskellige typer aftaletyper (f.eks. farve hår, klipning af hår osv.).

Når alle indstillinger er valgt (køn, dato, person og type) starter jeg med nogle simple valideringer:tjekker datoen, tjekker om datoen("N") ikke er 7 (søndag). Hvis alt er okay, startes de vigtigere ting:

1) Aftaletypen hentes fra databasen inklusive den samlede tid denne type tager (30 minutter, 45 minutter osv.)2) Den tilgængelige personlige hentes (en komplet liste over personer på den dag eller kun en enkelt person, hvis en er valgt) inklusive deres tilgængelige tider

Personen (eller én person) bliver derefter loopet, startende med deres eget starttidspunkt. På dette tidspunkt har jeg et sæt data, der indeholder:

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

Lad os tage disse demodata:

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

Det jeg laver her er:

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

Det er klart, at det er forenklet i dette tilfælde. For når jeg tjekker for ledighed, og stedet ikke er gratis. Jeg indstiller $startTime til at være lig med den senest fundne aftale og starter derfra i løkken.

Eksempel:

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.

Kontrollér tilgængelighed

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

Da jeg gemmer aftaler som "Fra:10.00 Til:11.00" skal jeg sørge for at tjekke spots fra 11:00:01 til 11:59:59, for ellers vil aftalen kl. 11:00 fremgå af resultaterne.

I slutningen af ​​funktionen, i tilfælde af, at en aftale er fundet, sløjfer jeg resultaterne og returnerer den seneste slutning. Dette er den næste start i løkken, jeg nævnte ovenfor.

Forhåbentlig kan dette være til nogen hjælp for nogen. Bare som info:ape_id er ID'et for den "Aftaleperson", den er knyttet til.



  1. Sådan droppes en tabel i SQL

  2. Sådan får du året fra en Datetime-kolonne i MySQL

  3. Forening af to tabeller med forskelligt antal kolonner

  4. sletning af entiteter i kaskade virker ikke i ManyToMany-relationen