Applicazione PHP/MySQL per prenotazioni: limitare il numero massimo di posti prenotabili

  • Creatore Discussione Creatore Discussione Fra_23
  • Data di inizio Data di inizio

Fra_23

Utente Attivo
4 Mag 2021
41
4
8
Salve, come da titolo vorrei chiedervi come potrei stabilire e far rispettare un numero massimo di prenotazioni.
Il database é molto semplice e ogni persona dopo aver inserito i dati personali seleziona il numero di posti.
Io per far vedere quanti posti sono ancora disponibili ho fatto: tot posti evento - somma della colonna posti, però le persone ovviamente possono prenotare anche quando i posti sono esauriti o in negativo.
Vi ringrazio anticipatamente.
 
Ciao,
secondo me dovresti inviare il form, dando la possibilità di prenotare i posti, solo se questi sono disponibili, altrimenti inviare un opportuno messaggio di errore; inoltre inserire nel form, se non presente, una casella indicante il nr di posti disponibili e inserire dei controlli affinché non si possano prenotare più posti di quelli disponibili; per un aiuto concreto (se è quello che vuoi) bisognerebbe sapere come è strutturato il DB e magari anche come hai impostato il form. Ciao
 
La tabella é strutturata così:
SQL:
CREATE TABLE IF NOT EXISTS `Evento` (
  `Nome` text NOT NULL,
  `Mail` varchar(50) NOT NULL,
  `Cell` int NOT NULL,
  `Timestamp` timestamp NOT NULL,
  `Posti` int NOT NULL
)
Per controllare se i posti sono disponibili potrei dare una cosa come questa?
PHP:
if ($row['difference'] == '8'){ } echo '<style>section{display: none; .soldout{display: block;} </style>'; echo "I posti sono terminati";

Ho anche un'altra domanda: come posso controllare che ogni valore della select dei posti da prenotare non superi i posti ancora disponibili?(tipo se ci sono ancora 5 posti nella select non deve comparire il 6)
Grazie
 
Piccola modifica sql:
SQL:
CREATE TABLE IF NOT EXISTS `Evento` (
  `Nome` text NOT NULL,
  `Mail` varchar(50) NOT NULL,
  `Cell` decimal(10,0) NOT NULL,
  `Timestamp` varchar(20) CHARACTER SET utf8mb4 COLLATE utf8mb4_0900_ai_ci NOT NULL,
  `Posti` int NOT NULL
) ENGINE=MyISAM DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci AUTO_INCREMENT=1 ;
 
L'HTML5 ha introdotto delle 'novità', in particolare per i form: ha introdotto il type="number" che, come si evince dal nome, permette di selezionare un numero; oltretutto, tra i parametri opzionali, sono previsti anche MIN e MAX per cui potresti impostare min a 1 e max al numero massimo di posti disponibili evitando così di dover inserire dei controlli per verificare se l'utente non abbia prenotato più posti di quelli effettivamente disponibili.
 
Andando avanti nella costruzione del sito ho trovato due problemi:
1-Prima di inviare il form volevo effettuare un controllo in modo che i posti disponibili sommati ai posti che una persona vuole prenotare non superino il totale disponibile. Ecco il codice che ho provato che però non funziona:
PHP:
$query = "SELECT (10) - SUM(posti) AS difference FROM Pizzeria"; $result = $conn->query( $query ); $row = $result>fetch_array(MYSQLI_ASSOC)) $total = $row['difference']-$posti; if($total > 0){ $sql = "INSERT INTO Pizzeria VALUES ('$name', '$lname','$cell', '$end', '$posti', '$data')"; }
$posti sono i posti che un utente vuole prenotare, mentre $row['difference'] sono i posti ancora disponibili

2-Vorrei chiedervi come voi strutturereste il db dato che gli utenti possono prenotare per qualsiasi giorno che è a sua volta diviso in due fascie orarie e io ho bisogno di poter controllare che i posti disponibili non vengano superati.

Spero di esser stato chiaro,grazie mille in anticipo!
 
Prima di inviare il form volevo effettuare un controllo in modo che i posti disponibili sommati ai posti che una persona vuole prenotare non superino il totale disponibile.
*Prima di inviare il form volevo effettuare un controllo in modo che i posti disponibili sottratti ai posti che una persona vuole prenotare non superi tutti i posti per cui risulti un numero negativo.
non vengano superati
per ogni fascia oraria.
 
Faccio qualche prova e ti faccio sapere; purtroppo in questo periodov sono un po' occupato ma ti faccio sapere il prima possibile. A presto
 
Ciao, ho fatto un po’ di prove ed eccomi qua: sono partito dall’impostazione della tua tabella ma mi sono reso conto che non c’è possibilità di memorizzare (cosa fondamentale) né i posti totali per l’evento né i posti disponibili per cui, dopo parecchie prove, ho deciso di impostare così la tabella (ho inserito solamente i campi strettamente necessari per le prove):
PHP:
ID int autoincrement
POSTI_EVENTO int
POSTI_DISP int
NOMINATIVO varchar(30)
POSTI_PRENOTATI int


Ed ho inserito un record, parzialmente vuoto, dove ho registrato solamente POSTI_EVENTO e POSTI_DISP che, non essendoci state ancora prenotazioni, coincideranno, lasciando momentaneamente vuoti gli altri due. Quando un utente si vorrà prenotare gli apparirà un form che riporterà i posti-evento e i posti disponibili e chiederà quanti posti intende prenotare e il nominativo; a questo punto ci sarà un primo controllo: se i posti prenotati eccederanno i posti disponibili verrà emesso un messaggio d’errore, altrimenti verranno aggiornati i campi NOMINATIVO e POSTI_PREN e, contemporaneamente, inserito un nuovo record, anch’esso parzialmente vuoto, dove i POSTI_DISP stavolta saranno la differenza tra i posti precedentemente disponibili meno i posti prenotati; e così avanti fino al totale esaurimento dei posti; in questo caso, quando un nuovo utente proverà a prenotarsi verrà informato del completo esaurimento dei posti disponibili

Se, intanto, vuoi fare qualche prova ti mando il link e, nei prossimi giorni, ti mando tutti gli script, a presto
 
penso che siano passate 11 prenotazioni, oppure ha perso qualcosa per strada ...., prova a controllare

1657628608020.png


1657628638906.png
 
Ciao, ho fatto un po’ di prove ed eccomi qua: sono partito dall’impostazione della tua tabella ma mi sono reso conto che non c’è possibilità di memorizzare (cosa fondamentale) né i posti totali per l’evento né i posti disponibili per cui, dopo parecchie prove, ho deciso di impostare così la tabella (ho inserito solamente i campi strettamente necessari per le prove):
PHP:
ID int autoincrement
POSTI_EVENTO int
POSTI_DISP int
NOMINATIVO varchar(30)
POSTI_PRENOTATI int


Ed ho inserito un record, parzialmente vuoto, dove ho registrato solamente POSTI_EVENTO e POSTI_DISP che, non essendoci state ancora prenotazioni, coincideranno, lasciando momentaneamente vuoti gli altri due. Quando un utente si vorrà prenotare gli apparirà un form che riporterà i posti-evento e i posti disponibili e chiederà quanti posti intende prenotare e il nominativo; a questo punto ci sarà un primo controllo: se i posti prenotati eccederanno i posti disponibili verrà emesso un messaggio d’errore, altrimenti verranno aggiornati i campi NOMINATIVO e POSTI_PREN e, contemporaneamente, inserito un nuovo record, anch’esso parzialmente vuoto, dove i POSTI_DISP stavolta saranno la differenza tra i posti precedentemente disponibili meno i posti prenotati; e così avanti fino al totale esaurimento dei posti; in questo caso, quando un nuovo utente proverà a prenotarsi verrà informato del completo esaurimento dei posti disponibili

Se, intanto, vuoi fare qualche prova ti mando il link e, nei prossimi giorni, ti mando tutti gli script, a presto
Grazie mille, aspetto gli script quando avrai tempo!
 
Hai ragione, Marino.....Dopo aver aggiunto l'ultimo record il progrmma rilegge l'intera tabella e ne memorizza l'ID, che gli serve poi per l'aggiornamento; a volte invece, e non capico perchè, ho fatto diverse prove ed era tutto ok, non leggeva correttamente e memorizzava l'ID del penultimo record invece dell'ultimo. Ora l'ho modificato, aggiungendo la clausola WHERE, ho fatto diverse prove e funziona
 
Ultima modifica:
Ciao, il primo script che ti mando (l'ho testato e funziona), e che deve essere eseguito per primo, è resetta.php

PHP:
<?php
//---------------leggo il DB---------------

include('conn.php');
$connessione = new mysqli($host, $user, $password, $db);

// verifica su eventuali errori di connessione
if ($connessione->connect_errno) {
    echo "Connessione fallita: ". $connessione->connect_error . ".";
    exit();
}

if (!$result = $connessione->query("SELECT * FROM PRENOTA order by ID asc")) {
    echo "Errore della query: " . $connessione->error . ".";
}else{
    // conteggio dei record
    if($result->num_rows > 0) {
       // conteggio dei record restituiti dalla query
       while($row = $result->fetch_array(MYSQLI_ASSOC)) {
             $id = $row['ID'];
             $postievento = $row['POSTI_EVENTO'];
             $postidisp = $row['POSTI_DISP'];
             $postiprenot = $row['POSTI_PREN'];
       }
       // liberazione delle risorse occupate dal risultato
       $result->close();
    }
}
session_start();
$_SESSION['posti_evento'] = $postievento;
$_SESSION['posti_disp'] = $postidisp;
$_SESSION['nominat'] = '';
$_SESSION['posti_prenotati'] = '';
$_SESSION['messaggio'] = '';
$_SESSION['ID'] = $id;

include('FORM2.php');
?>

il quale, come dice il nome, si occuperà di resettare le variabili di sessione, non prima, però, di aver letto l'intera tabella per memorizzare l'ID dell'ultimo record immesso, che servirà in seguito quando un utente vorrà prenotarsi e da dove recupererà il nr di posti ancora disponibili dopodiché richiamerà (include) il form vero e proprio FORM2.php
PHP:
<style>
green {
    color:green;
}
red {
    color:red;
}
</style>
<?php
session_start();
$postievento=$_SESSION['posti_evento'];
$postidisp=$_SESSION['posti_disp'];
$messaggio=$_SESSION['messaggio'];
$nrprenot=$_SESSION['posti_prenotati'];
$id=$_SESSION['ID'];

if ($postidisp<=0) {
    echo '<h3><red>Spiacenti. I posti disponibili per questo evento sono esauriti</red></h3>';
}else{
    echo 'ultimo ID inserito: '.$id;
    //----------------imposto il FORM-----------------
    echo '<form action="controlla.php" method="get">';
    echo '<br>Posti evento: '.$postievento.'<br>';
    echo '<br>Posti disponibili rimasti: '.$postidisp.'<br>';
    echo '<br>Immetti numero di posti che intendi prenotare: ';
    echo '<input type="text" name="nrposti" value="'.$nrprenot.'" size="5"><br><br>';
    echo '<br>Immetti il nomilnativo: ';
    echo '<input type="text" name="nominat" value="'.$nominat.'"><br><br>';
    if (substr($messaggio,0,2)=='Ok') {
        echo '<green>'.$messaggio.'</green><br><br>';
    }else{
        echo '<red>'.$messaggio.'</red><br><br>';
    }
    echo '<input type="submit" name="submit" value="Invia dati">';
    echo '</form>';
    if (substr($messaggio,0,2)=='Ok') {
        include('aggiorna.php');
    }
}
?>

Come puoi vedere sia in questo che negli altri script ho inserito parecchi echo che mi sono serviti solo per vedere la/le variabili effettivamente passate ma che tu puoi tranquillamente omettere. Nei prossimi giorni ti mando gli ultimi due script. In conn.php sono contenute le variabili di connessione. A presto
 
Ho visto che avevi fatto qualche prova col link che ti avevo mandato; ora l'ho sistemato, aggiungendo ORDER BY: in pratica, e non capisco perché, quando inseriva un nuovo record in realtà non lo inseriva in fondo alla tabella, come ci si aspetterebbe, ma magari tra il primo e il secondo per cui, quando chiedevo l'id dell'ultimo record mi dava, in realtà correttamente, il record in fondo alla tabella che però non era l'ultimo; questo infatti riporta il numero dei posti ancora disponibili e quindi, non leggendo corrrettamente il dato, dava continuamente la possibilità di prenotarsi anche quando i posti erano finiti. Ora, come ti ho detto, l'ho sistemato e ho fatto anche diverse prove e funziona; prima di mandarti gli altri script però preferirei, per qualsiasi evenienza, magari un piccolo cambiamento, che lo ritestassi. Ti rimando il link, fammi sapere. Ciao
 
Ultima modifica:
Ciao, intanto grazie dal link mi sembra che funzioni, l'unica cosa é che forse nel riepilogo non ti fa vedere il tuo ID ma l'ultimo inserito
 
Ciao, l'id è servito solo a me per controllare che effettivamente leggesse l'ultimo record, ma tu puoi anche toglierlo, tanto all'utente non interessa; oppure, se vuoi che venga visualizzato anche l'id derll'utente che si è appna prenotato, lo posso modificare, fammi sapeere. Al più presto ti mando gli altri due script. A presto
 

Discussioni simili