[an error occurred while processing this directive]
diff logo Informatica e sistemi alternativi
su questo sito sul Web
    Home   Chi siamo    Contattaci    Scrivi per diff    Proponi un argomento 21/12/24
    Cos'è diff    Come accedere    F.A.Q.    Promuovi    Dicono di diff    Amici di diff    
AmigaOS
Linux
FreeBSD
BeOS
OpenSource
Java
Database
Informatica
Hardware
E-Commerce
Narrativa

Una semplice implementazione di pagine web dinamiche
di Giuseppe Sacco

3.3 La pagina degli appartamenti: appartamenti.phtml

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>


3.4 Le pagine della prenotazione

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


 



© 1999,2000,2001,2002 NonSoLoSoft di Ferruccio Zamuner (Italia)- tutti i diritti sono riservati