Mysql
 sql >> Base de données >  >> RDS >> Mysql

Meilleures pratiques pour le système de rendez-vous/réservation PHP/MySQL

En fin de compte, j'ai opté pour un système qui générait des horodatages pour les dates de début et de fin dans la base de données. Lors de la vérification, j'ai ajouté une seconde au début et soustrait une seconde à la fin pour éviter tout chevauchement de temps pour les rendez-vous.

Qu'est-ce que j'ai fini par faire

Évidemment, je ne suis pas sûr que ce soit la meilleure pratique, mais cela a fonctionné pour moi. L'utilisateur commence par sélectionner son sexe et une préférence pour la journée. Cela envoie une requête AJAX pour obtenir le personnel disponible et différents types de types de rendez-vous (par exemple, coloration des cheveux, coupe des cheveux, etc.).

Lorsque tous les paramètres ont été choisis (sexe, date, personnel et type) je commence par quelques validations simples :vérification de la date, vérification si la date ("N") n'est pas 7 (dimanche). Si tout va bien, les choses les plus importantes sont lancées :

1) Le type de rendez-vous est extrait de la base de données, y compris la durée totale de ce type (30 minutes, 45 minutes, etc.) 2) Le personnel disponible est extrait (une liste complète des personnes ce jour-là ou une seule personne si un est choisi) y compris leurs temps disponibles

Le personnel (ou une personne) est alors bouclé, en commençant par sa propre heure de départ. À ce stade, j'ai un ensemble de données contenant :

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

Prenons ces données de démonstration :

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

Ce que je fais ici est :

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

Évidemment, c'est tout simplifié dans ce cas. Parce que quand je vérifie la disponibilité, et que la place n'est pas libre. J'ai défini le $startTime pour qu'il soit égal au dernier rendez-vous trouvé et je commence à partir de là dans la boucle.

Exemple :

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.

Fonction de vérification de la disponibilité

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

Étant donné que je stocke les rendez-vous sous la forme "De :10h00 à :11h00", je dois m'assurer de vérifier les spots de 11:00:01 à 11:59:59, car sinon le rendez-vous à 11h00 apparaîtra dans les résultats.

A la fin de la fonction, dans le cas où un rendez-vous est trouvé, je boucle les résultats et renvoie la dernière fin. C'est le prochain début de la boucle que j'ai mentionnée ci-dessus.

Espérons que cela puisse être utile à quiconque. Juste comme info :ape_id est l'ID de la "Personne de rendez-vous" à laquelle il est lié.