Una semplice implementazione di pagine web dinamiche di Giuseppe Sacco
Cominciamo col vedere la SELECT che ci permette di recuperare i
dati che interessano:
SELECT l.Localita, a.Postiletto, a.Prezzo,
t.Descrizione, a.Note
FROM appartamento a, localita l, tipologia t
WHERE a.Localita = l.ID AND a.tipologia = t.ID
che poi verrà ordinata in maniera scelta dall'utente.
L'ordinamento viene scelto in base a dei bottoni in cima alla pagina. Se li si
preme allora viene inviata una nuova richiesta al server web tramite il metodo
POST anziché l'usuale GET in quanto si va ad
aggiungere un parametro: il parametro orderby. Questo parametro
può avere tre differenti valori: località, postiletto, prezzo oppure può essere
non inizializzato. In base al suo valore viene aggiunta alla
query la clausola ORDER BY con il relativo campo. La
scelta dell'ordinamento è fatta tramite il tag FORM di
HTML. Ne è stato messo uno per ogni tipo di ordinamento.
Ecco la pagina risultante:
<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
<html>
<HTML><HEAD><TITLE>Lista delle località</TITLE>\
</HEAD><BODY>
<H1><CENTER>Lista degli appartamenti</CENTER></H1>
<TABLE><TR>
<TD><form method="post" action="appartamenti.phtml">
<input type="hidden" name="orderby" value="localita">
Ordina per <input type="submit" value="località">\
</form></TD>
<TD><form method="post" action="appartamenti.phtml">
<input type="hidden" name="orderby" value="postiletto">
Ordina per <input type="submit" value="numero di posti letto">\
</form></TD>
<TD><form method="post" action="appartamenti.phtml">
<input type="hidden" name="orderby" value="prezzo">
Ordina per <input type="submit" value="prezzo"></form>\
</TD>
</TR></TABLE>
<?php
/* Connessione con la base di dati */
$cannot = 'Errore di collegamento alla base di dati';
$conID = pg_pconnect("localhost", \
"", "", \
"", "case") or die($cannot);
/* selezione di tutti gli appartamenti */
$query = "SELECT a.ID, l.Localita, a.Postiletto, \
a.Prezzo, t.Descrizione, a.Note ";
$query = $query."FROM appartamento a, localita l, \
tipologia t ";
$query = $query."WHERE a.Localita = l.ID AND \
a.tipologia = t.ID";
if (isset($orderby)) {
if ($orderby=='localita')
$query = $query.' ORDER BY l.Localita';
if ($orderby=='postiletto')
$query = $query.' ORDER BY a.Postiletto';
if ($orderby=='prezzo')
$query = $query.' ORDER BY a.Prezzo';
}
$qID = pg_exec($conID, $query) or die($cannot);
/* Qui comincia un ciclo che prende tutti i
* record restituiti dalla
* query e li mostra in una tabella HTML */
$rows = pg_numrows($qID);
for ($i=0; $i < $rows; $i++) {
$row = pg_fetch_row($qID,$i);
if ($i==0) {
echo '<table NOSAVE BORDER=1>';
echo '<tr ALIGN=center><td><i>\
ID</i></td><td><i>\
Nome località</i></td>\
<td ALIGN=center><i>\
Num. di letti</i></td>\
<td><i>Prezzo per settimana\
</i></td><td><i>\
Tipologia</i></td><td>\
<i>Note</i></td></tr>
}
echo "<tr><td>$row[0]</td><td>\
$row[1]</td><td ALIGN=center>$row[2]\
</td><td ALIGN=right>$row[3]</td>\
<td>$row[4]</td><td>$row[5]</td>\
</tr>";
}
if ($i>0)
echo '</table>';
pg_freeresult($qID);
?>
</BODY>
La prenotazione viene fatta tamite una prima pagina,
prenotazioni.html, che richiede tutti i dati e che è interamente
scritta in HTML; una seconda pagina,
prenotazioni.phtml, che cerca di inserire nella base di dati la
nuova prenotazione ed eventualmente il cliente, scritta in php3. Ci
sono due caratteristiche importanti di questa pagina php3: l'uso della
funzione pg_connect() al posto della pg_pconnect() e
la gestione della transazione relegata al sistema di gestione della base di
dati.
Della prima si può dire che sia necessaria in ambienti concorrenti: Infatti
l'uso della pg_pconnect() fa sì che l'utente non si ricolleghi
ogni volta alla base di dati, ma usi la stessa connessione già aperta durante
l'interrogazione fatta alla pagina precedente. Allo stesso tempo, se ci sono
più utenti collegati si avrà che tutti utilizzeranno la stessa connessione con
la base di dati (nei sistemi ``grossi'' si avrà che ogni utente utilizzerà un
proprio account per accedere ai dati e quindi non si avrà questo problema.)
Quindi per evitare che la transazione compresa tra il begin work e
il commit work sia mescolata a interrogazini di altri utenti, si
deve fare in modo che sia fatta in una connessione a parte.
Della transazione si può dire che sia utile per eliminare il cliente appena
inserito nel caso in cui la prenotazione non sia fattibile. Le modifiche
apportate sono eliminate dalla base di dati stessa e non è necessario fare una
cancellazione esplicita del cliente.
Il testo della pagina HTML è il seguente:
<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
<html>
<HTML>
<HEAD>
<TITLE>Pagina delle prenotazioni</TITLE>
</HEAD><BODY>
<H1>
<CENTER>Pagina delle prenotazioni</CENTER>
</H1>
Per prenotare un appartamento di devono inserire i dati
personali o, se si è già clienti, il proprio codice personale.
<form method="post" action="prenotazioni.phtml">
<table>
<tr><td>Codice Personale:</td><td><
input type="text" size=8 name="idcliente"></td></tr>
<tr><td>Nome:</td><td><input type="text"
size=20 name="nomecliente"></td></tr>
<tr><td>Cognome:</td><td><input type="text"
size=20 name="cognomecliente"></td></tr>
<tr><td>Indirizzo:</td><td><input type="text"
size=100 name="indirizzocliente"></td></tr>
<tr><td>e-mail:</td><td><input type="text"
size=30 name="emailcliente"></td></tr>
</table>
e poi inserire il
<table>
<tr><td>Codice dell'appartamento:</td><td><
input type="text" size=3 name="idappartamento"></td></tr>
<tr><td>Data locazione:</td><td><input type="
text" size=10 name="dataaffitto"> (es: 2000-4-13)</td></tr>
<tr><td>Durata locazione:</td><td><input
type="text" size=10 name="fineaffitto"> (es: 2000-4-18)
</td></tr>
</table>
<input type="submit" value="Invia prenotazione"></form>
</BODY>
mentre quello dell'ultima pagina è:
<!doctype html public "-//w3c//dtd html 4.0 transitional//en">
<html>
<HTML><HEAD><TITLE>Risultato della prenotazione</TITLE>
</HEAD><BODY>
<H1><CENTER>Risultato della prenotazione</CENTER></H1>
<?php
function registracliente($conID,$nome, $cognome, \
$ind, $email) {
$query = "SELECT max(id) FROM cliente";
$qID = pg_exec($conID, $query);
if (pg_numrows($qID)>0) {
$row = pg_fetch_row($qID, 0);
$idcliente=$row[0]+1;
}
else
$idcliente=1;
$query = "INSERT INTO cliente (ID,Nome,Cognome, \
Indirizzo,Email)";
$query = $query." VALUES ('$idcliente','$nome', \
'$cognome','$ind',\
'$email')";
$qID = pg_exec($conID, $query);
return $idcliente;
}
/* Connessione con la base di dati */
$cannot = 'Errore di collegamento alla base di dati';
$conID = pg_pconnect("localhost", "", \
"", "", "case") \
or die($cannot);
/* inizio della transazione */
$qID = pg_exec($conID, "begin work") or die($cannot);
if (!isset($idcliente) or ($idcliente==""))
$idcliente = registracliente($conID,$nomecliente, \
$cognomecliente, $indirizzocliente, \
$emailcliente);
$query = "SELECT p.ID FROM prenotazioni p";
$query = $query." WHERE p.ID = $idappartamento AND";
$query = $query." (p.Da >= '$dataaffitto'::date OR";
$query = $query." p.A <= '$fineaffitto'::date)";
$qID = pg_exec($conID, $query);
if (pg_numrows($qID)>0) {
echo "L'appartamento non esiste oppure è già \
occupato in quel periodo.";
/* fine della transazione */
$qID = pg_exec($conID, "rollback work");
} else {
$query= "INSERT INTO prenotazioni (ID,Da,A,Cliente)";
$query= $query." VALUES ($idappartamento, '$dataaffitto',
'$fineaffitto', $idcliente)";
$qID = pg_exec($conID, $query);
/* fine della transazione */
$qID = pg_exec($conID, "commit work");
echo "L'appartamento è stato prenotato.";
}
?>
</BODY>
|
|
Giuseppe Sacco è laureato in Scienze dell'Informazione presso l'Ateneo di Pisa.
In passato si è occupato di Amiga (è uno dei fondatori di IPISA) e di Interfacce Utente Grafiche.
Attualmente lavora nell'ambito dei prodotti ERP e si sta specializzando in amministrazione di sistema con Oracle, Informix, Unix e Windows NT.
Da sempre ha tenuto sott'occhio il movimento attorno a Linux con un particolare riguardo alla distribuzione Debian della quale è coordinatore della traduzione del sito web in italiano.
| |
Puoi contattare l'autore scrivendo a:
gsacco@diff.org
| |
Articoli dello stesso autore:
Introduzione ad Oracle8i
Il modello entità - relazioni
Pagine web dinamiche
|
|