[PHP] Creare script di prenotazione con controllo disponibilità.

Gabriele_04

Nuovo Utente
3 Set 2021
9
0
1
Buongiorno a tutta la comunità di mrw. Sono un novellino con PHP, per esercitarmi ho voluto creare una piattaforma dove un cliente può prenotare il proprio posto a sedere e il proprio servizio presso un barbiere. Ho già creato la pagina profilo, la dashboard e tutto, ora sono giunto alla creazione dello script PRENOTAZIONI, ho perciò creato un form con i seguenti campi:

- Data di prenotazione
- Orario di prenotazione
- Servizio richiesto (menù select tra taglio, taglio + barba, barba).

Ora un semplice INSERT INTO non basta perché prima devo controllare se ci sono posti disponibili per ognuno di questi servizi, ad esempio per un semplice taglio servono solo 30 minuti mentre per un taglio+barba ne servono 45.
Adesso poniamo il caso ci siano due clienti, uno prenota alle 9:00 un taglio (ciò significa che ci sarà un nuovo posto alle 9:30) e uno che prenota un taglio + barba sempre alle 9, il sistema dovrebbe avvertire che ci sia un posto disponibile alle 9:30. E così via....

Scusate un po' la richiesta confusionaria, spero che qualcuno possa essermi di aiuto.

Grazie ancora.
 
Ciao, la prima cosa che noto (e che secondo me non è corretta, ma ripeto secondo me...) è che gli appuntamenti siano singoli, dovresti prevedere la possibilità di avere almeno 2 appuntamenti contemporanei nella stessa fascia oraria (come verosimilmente viene fatto). Questo aggiunge sicuramente complessità ai controlli che devi fare prima di salvare l'appuntamento, ma d'altra parte se ho capito bene lo fai per studio no?

Dal punto di vista logico puoi seguire diverse strade:

1° opzione:
calcolare prima gli orari disponibili per il giorno scelto, in modo che quando l'utente sceglie l'ora sei sicuro che è libero.
PRO: il processo è guidato e dovrebbe essere più semplice per l'utente la prenotazione
CONTRO: Se 3 utenti scelgono contemporaneamente lo stesso orario si potrebbero generare degli errori. Se l'utente rimane fermo un po' di tempo prima di scegliere l'orario poi potrebbe non essere più disponibile.

2° opzione
prima di salvare la prenotazione fai tutti i controlli del caso, se l'orario scelto è disponibile tutto ok, altrimenti restituirai un messaggio, magari proponendo degli orari alternativi
PRO: la procedura è sicuramente più affidabile, difficilmente si dovrebbero sovrapporre più prenotazioni
CONTRO: probabilmente le performance

Dal punto di vista tecnico devi fare una query che controlla gli appuntamenti, prendendo l'ora di inizio e sommando i tempi dei servizi scelti, poi prendi l'ora richiesta dall'utente, ci sommi i tempi dei servizi e controlli che non ci siano (o ce ne siano meno di x) altri appuntamenti salvati nello slot che impegnerebbe l'utente.

Chiaramente tutto questo implica che tu abbia una tabella di servizi con i relativi tempi.

Io sto facendo la stessa cosa qui https://stage.mko.digitalbubbles.cloud/ se vai nella sezione degli appuntamenti vedi il flusso che ho previsto (se vuoi puoi provare tranquillamente tanto è un ambiente di stage). Non ti posto il mio codice perchè non è php, ma la logica è la stessa. Qui anche io (su richiesta del cliente) ho previsto slot di 15 min, indipendentemente dal resto
 
Ciao rikk73, io ti ringrazio moltissimo per la tua risposta e i consigli dati... La doppia prenotazione non potrei accettarla perché sto supponendo il caso in cui il dipendente sia solo uno...

Ho capito il concetto da te spiegato, volevo chiederti solo una cosa. A questo punto quante tabelle dovrei avere attive ? Quello per le tempistiche e quello delle prenotazioni?

Grazie ancora per la tua risposta
 
Fai una tabella x le prenotazioni e in fase di richieste nei fai il count ovviamente considerando i ranges temporali etc etc.
 
Buon pomeriggio a tutti, come dicevo prima sono un novellino e sto cercando di imparare, tuttavia ho cominciato a scrivere il codice e ho inserito direttamente nel codice le tempistiche, sono arrivato a questo punto ma non so come continuare... Ho inoltre creato una tabella che dovrebbe raccogliere le prenotazioni. Il form è composto da un datapicker e due campi select, per il servizio da scegliere e per l'orario.
PHP:
<?php

//Eseguo connessione



$db_host = 'localhost';
$db_user = 'root';
$db_pass = '';
$db_name = 'barber';



// connessione al DB utilizzando MySQLi
$cn = mysqli_connect($db_host, $db_user, $db_pass, $db_name);
if (mysqli_connect_errno()) {
    // If there is an error with the connection, stop the script and display the error.
    exit('Failed to connect to MySQL: ' . mysqli_connect_error());
}





if(isset($_POST['submit'])){
    $servizio=$_POST['servizio'];
    $data=$_POST['data'];
    $orario_richiesta=$_POST['orario'];
    
    $tempo_taglio = 30 ;

    $tempo_tagliobarba = 45;

    $tempo_barba = 15;
    
    
?>
 
Ciao, hai già creato la tabella per le prenotazioni? Se sì, puoi mandare la struttura?

In generale secondo me potresti fare così: innanzitutto essendo che i tempi richiesti sono 15,30,45 (multipli di 15) la soluzione più veloce può essere "splittare" tutta la giornata in sezioni da 15 minuti, ad esempio quello che va da 00:00 a 00:15 è sezione1, da 00:15 a 00:30 sezione2 ecc. A questo punto nella tabella prenotazioni, quando salvi una prenotazione inserisci il giorno e il numero di sezione d'inizio e di fine (ad esempio se va dalle 10:15 alle 10:45 quella d'inizio sarà la sezione 42 (10:15-10:30), quella di fine sezione 43 (10:30-10:45)). Poi nel sito mostri una lista di tutte le sezioni ancora disponibili, ovviamente se nel primo campo il cliente sceglie il servizio da 45', gli mostrerai solo le opzioni in cui ci sono 3 sezioni consecutivi disponibili ecc.

Forse in generale ti complica un po' la vita ma dato che gli orari sono tutti multipli di 15 può essere utile fare una cosa del genere
 
Ciao, hai già creato la tabella per le prenotazioni? Se sì, puoi mandare la struttura?

In generale secondo me potresti fare così: innanzitutto essendo che i tempi richiesti sono 15,30,45 (multipli di 15) la soluzione più veloce può essere "splittare" tutta la giornata in sezioni da 15 minuti, ad esempio quello che va da 00:00 a 00:15 è sezione1, da 00:15 a 00:30 sezione2 ecc. A questo punto nella tabella prenotazioni, quando salvi una prenotazione inserisci il giorno e il numero di sezione d'inizio e di fine (ad esempio se va dalle 10:15 alle 10:45 quella d'inizio sarà la sezione 42 (10:15-10:30), quella di fine sezione 43 (10:30-10:45)). Poi nel sito mostri una lista di tutte le sezioni ancora disponibili, ovviamente se nel primo campo il cliente sceglie il servizio da 45', gli mostrerai solo le opzioni in cui ci sono 3 sezioni consecutivi disponibili ecc.

Forse in generale ti complica un po' la vita ma dato che gli orari sono tutti multipli di 15 può essere utile fare una cosa del genere
In realtà avevo pensato di avere una lista slots liberi con delle classi datetime che calcolano start time e end time, dato che tutti i servizi hanno durate diverse... Anche se non ho ancora capito bene come strutturarlo in codice
 
La cosa migliore sarebbe quella di avere una tabella servizi, che ha sia il prezzo che il tempo previsto, nella tabella delle prenotazioni, poi metti il riferimento a questa tabella.
Questo tipo di struttura ti permetterebbe, oltre che soddisfare la tua esigenza, di poter estendere la tabella delle prenotazioni mettendo ad esempio un prezzo/tempo per servizio diverso da quello di default.

Ti allego uno screenshot dello schema della parte del db che riguarda questa discussione del sito che ti avevo postato, il db è SQL ma comunque può servirti per dei concetti
 

Allegati

  • db.png
    db.png
    50,2 KB · Visite: 345

Discussioni simili