Prenotazione posti su un aereo
Si supponga di voler gestire la prenotazione di posti su un aereo. Supponiamo per semplicità che sull'aereo ci siano 100 posti e che le prenotazioni vengano salvate su un file di testo contenente il nome del viaggiatore e il numero del posto prenotato, in questo modo:
Gianni Luporini
22
Alberto Galassi
13
Romeo Virgili
56
Ada Liguori
4
La pagina php per gestire le prenotazioni visualizza un form con l'elenco dei posti non ancora prenotati:
L'elenco dei posti liberi è realizzato mediante un tag <select>.
All'avvio la pagina legge il file contenente le prenotazioni e memorizza i posti prenotati in un vettore di 100 elementi. L'indice del vettore è il numero del posto: 0 significa che il posto è libero, 1 vuol dire invece che il posto è stato prenotato:
//il vettore delle prenotazioni viene inizializzato a zero
for ($i=0;$i<100;$i++)
{
$prenotati[$i] = 0;
}
//se esiste il file delle prenotazioni, viene aperto in lettura
if (file_exists("prenotazioni"))
{
$p = fopen("prenotazioni","r");
//ciclo di lettura fino alla fine del file delle prenotazioni
while (1)
{
//lettura del nome della persona che ha fatto la prenotazione
$nome = fgets($p);
//se si è arrivati alla fine del file, il ciclo è interrotto col break
if (feof($p))
break;
//lettura del numero di posto prenotato
$posto = fgets($p);
//questa istruzione è un trucco per convertire $posto in integer
$posto = $posto + 0;
//l'elemento $posto del vettore viene settato a 1 (posto già prenotato)
$prenotati[$posto] = 1;
}
fclose($p);
Il ciclo seguente consente di generare la casella a discesa del form con l'elenco di tutti i posti ancora liberi (vengono visualizzati solo i posti il cui numero corrisponde a un elemento del vettore $prenotati che ha valore zero):
<select name="liberi">
<?php
for ($i=0; $i<100;$i++)
{
//se il posto $i non è stato ancora prenotato...
if ($prenotati[$i]== 0)
//... viene visualizzato il numero del posto nell'elenco a discesa del form
echo "<option>".$i."</option>";
}
?>
</select>
Occupiamoci ora del problema di gestire la prenotazione di un nuovo posto. Questa avviene quando l'utente seleziona un posto ancora libero dall'elenco a discesa, inserisce il proprio nome e cognome nella casella di testo e quindi fa click sul pulsante Prenota.
Il click sul pulsante Prenota invia alla pagina stessa il numero del posto prenotato (elemento select con nome 'liberi') e il nome di chi ha effettuato la prenotazione (input text con nome 'nome'). Tali informazioni dovranno essere importate all'inizio della pagina php e quindi memorizzate nel file. Il codice è il seguente:
//il test serve per verificare se esiste la variabile 'liberi'
if (isset($_REQUEST['liberi']))
{
//i valori vengono importati nella pagina
$nuova = $_REQUEST['liberi'];
$nome = $_REQUEST['nome'];
//il file delle prenotazioni viene aperto in modalità append
$p = fopen("prenotazioni","a");
//il file viene bloccato per prevenire eventuali concorrenze
flock($p,LOCK_EX);
//scrittura dati sul file (il \n serve per andare a capo)
fwrite($p,$nome."\n");
fwrite($p,$nuova."\n");
//il file viene sbloccato
flock($p,LOCK_UN);
fclose($p);
echo "<p align='center'><strong>Posto ".$nuova." prenotato da ".$nome."</strong></p>";
}
Il risultato finale è il seguente:
Sito realizzato in base al
template offerto da
http://www.graphixmania.it