Esame di stato 2011

Creazione del database "Vacanze" e delle tabelle.

Nome del file: amministra.php

Lo script seguente crea il data base e le tabelle.
Esercizio: Dopo aver esaminato gli attributi di ogni tabella, costruire lo schema E/R del data base.

Scrivere una fase di analisi del problema per motivare le scelte fatte.

<html>

<head>

<title>Agenzia turistica</title>

</head>

<body>

<?php

if ($con = mysql_connect("localhost", "root", ""))

  echo "connesso a MySQL<br />";

else {

  echo "impossibile connettersi a MySQL";

  exit();

}

$nomeDB = "vacanze";

$sql = "CREATE DATABASE ".$nomeDB;

if (mysql_query($sql))

  echo "creato il database ".$nomeDB."<br />";

else {

  echo "database: ".$nomeDB." non creato ".mysql_error();

  exit();

}

if (mysql_select_db($nomeDB))

  echo "data base ".$nomeDB." selezionato <br />";

else

  echo "data base ".$nomeDB." non selezionato <br />";

$sql = "CREATE TABLE appartamenti (

      id int not null auto_increment primary key,

      posti int,

      costo decimal(6,2),

      localita int,

      proprietario int,

      servizi varchar(50),

      descrizione varchar(200)

      )";

echo $sql."<br />";

if (mysql_query($sql))

  echo "Creata tabella appartamenti<br />";

else

  echo "Non Creata tabella appartamenti<br />";

$sql = "CREATE TABLE localita (

       id int not null auto_increment primary key,

       nome varchar(30),

       cap varchar(5),

       provincia varchar(2)

       )";

echo $sql."<br />";

if (mysql_query($sql))

  echo "Creata tabella localita<br />";

else

  echo "Non Creata tabella localita<br />";

$sql = "CREATE TABLE foto (

       id int not null auto_increment primary key,

       idApp int,

       foto varchar(50),

       descrizione varchar(50)

       )";

echo $sql."<br />";

if (mysql_query($sql))

  echo "Creata tabella foto<br />";

else

  echo "Non Creata tabella foto<br />";

$sql = "CREATE TABLE prenotazioni (

       id int not null auto_increment primary key,

       arrivo date NOT NULL,

       partenza date NOT NULL,

       idApp int NOT NULL,

       cliente int NOT NULL

       )";

echo $sql."<br />";

if (mysql_query($sql))

  echo "Creata tabella prenotazioni<br />";

else

  echo "Non Creata tabella prenotazioni<br />";

$sql = "CREATE TABLE clienti (

       id int not null auto_increment primary key,

       nome varchar(100) NOT NULL,

       recapito varchar(200) NOT NULL,

       telefono varchar(15) NOT NULL

       )";

echo $sql."<br />";

if (mysql_query($sql))

  echo "Creata tabella clienti<br />";

else

  echo "Non Creata tabella clienti<br />";

$sql = "CREATE TABLE proprietari (

       id int not null auto_increment primary key,

       cognome varchar(100) NOT NULL,

       contatto varchar(200) NOT NULL

       )";

echo $sql."<br />";

if (mysql_query($sql))

  echo "Creata tabella proprietari<br />";

else

  echo "Non Creata tabella proprietari<br />";

echo "<br />rilascio della connessione con MySQL";

mysql_close($con);

?>

</body>

</html>

Pagina Iniziale dell'applicazione.

nome del file index.php

La pagina iniziale deve mostrare varie sezioni. Ad esempio, la possibilità di scegliere la zona di ricerca dell'appartamento, un elenco di offerte last minute, l'accesso all'area riservata per consentire operazioni di inserimento-modifica degli appartamenti in affitto, la possibilità di registrazione di un nuovo cliente, ecc.

<html>

<head>

<title></title>

</head>

<body>

<h1>Agenzia immobiliare</h1>

<p>Trova la tua casa per le vacanze tra le nostre proposte</p>

<table>

<tr><td>Città</td><td>Nr Posti</td><td>Prezzo</td><td>Servizi</td><td>Consulta</td></tr>

<?php

$con = mysql_connect("localhost", "root", "");

$nomeDB = "vacanze";

mysql_select_db($nomeDB);

$sql = "select * from appartamenti";

$rs = mysql_query($sql);

while ($riga=mysql_fetch_array($rs)) {

  $sql="select nome from localita where id=".$riga['localita'];

  $rSet=mysql_query($sql);

  $citta=mysql_fetch_array($rSet);

  echo "<tr><td>".$citta['nome']."</td>";

  echo "<td>".$riga['posti']."</td>";

  echo "<td>".$riga['costo']."</td>";

  echo "<td>".$riga['servizi']."</td>";

  echo "<td><a href='vedi.php?id=".$riga['id']."'>vai</a></td></tr>";

}

?>

</table>

<hr />

<p>Area Riservata</p>

<form action="nuovoApp.php" method="POST">

Utente: <input type="text" name="ut" /><br />

Password: <input type="password" name="pw" />

<input type ="submit" name="login" value="login" />

</form>

</body>

</html>

Form di inserimento di un nuovo appartemento

nome del file: nuovoApp.php

<html>

<head>

<title></title>

</head>

<body>

<?php

if (!$con = mysql_connect("localhost", "root", "")) exit();

$nomeDB = "vacanze";

mysql_select_db($nomeDB);

?>

<h3>Inserimento di un nuovo appartamento</h3>

<form action="insApp.php" method="post" enctype="multipart/form-data">

Numero di posti letto: <input type = "text" name="pl" /><br />

Costo mensile <input type="text" name="costo" /><br />

Descrizione <input type="text" name="des" />

<hr />

indirizzo:

<select name="citta">

<option value="0">Scegli</option>

<?php

$sql = "SELECT * from localita";

$rSet = mysql_query($sql);

while ($riga = mysql_fetch_array($rSet)) {

echo "<option value=";

echo $riga['id'];

echo '>';

echo $riga["nome"].'</option>';

}

?>

</select><br />

<input type="text" name="nloca" value="inserisci nuova città"/>

Nuova: <input type="checkbox" name="nl" />

<hr />proprietario:

<select name="pr" >

<option value="0">Scegli</option>

<?php

$sql = "SELECT * from proprietari";

$rSet = mysql_query($sql);

while ($riga = mysql_fetch_array($rSet)) {

echo "<option value='";

echo $riga['id'];

echo "'>";

echo $riga["cognome"].'</option>';

}

?>

</select><br />

Proprietario:

<input type="text" name="npr" value="inserisci nuovo nome"/>

Nuovo: <input type="checkbox" name="np" />

<hr />

servizi accessori:<br />

aria condizionata: <input type="checkbox" name="ac" /><br />

televisore: <input type="checkbox" name="tv" /><br />

foto: <input type="file" name="foto" accept="image/jpg,image/gif" />

<br />Didascalia foto: <input type="text" name="dida" />

<hr />

<input type="submit" value="inserisci" />

</form>

<br />Torna <a href="index.php">inizio</a>

<?php

mysql_close($con);

?>

</body>

</html>

Script insApp.php

<html>

<head>

<title></title>

</head>

<body>

<?php

if ($con = mysql_connect("localhost", "root", ""))

  echo "connesso a MySQL<br />";

else {

  echo "impossibile connettersi a MySQL";

  exit();

}

$nomeDB = "vacanze";

if (mysql_select_db($nomeDB))

  echo "data base ".$nomeDB." selezionato <br />";

else

  echo "data base ".$nomeDB." non selezionato <br />";

$posti = $_POST['pl'];

$euro = $_POST['costo'];

$des = $_POST['des'];

// località scelta da casella combinata

if (isset($_POST['citta'])) $idl=$_POST['citta'];

// nuova località

if (isset($_POST['nl'])) {

  $citta = $_POST['nloca'];

  $sql = "insert into localita (nome) values ('".$citta."')";

  if (mysql_query($sql)) echo "<br />aggiunta nuova città";

  else echo "<br />Query errata: non aggiunta nuova città";

  $idl = mysql_insert_id();

}

// nome scelto da casella combinata

if (isset($_POST['pr'])) $idp = $_POST['pr'];

// nuovo proprietario

if (isset($_POST['np'])) {

  $prop = $_POST['npr'];

  $sql = "insert into proprietari (cognome) values ('".$prop."')";

  if (mysql_query($sql)) echo "<br />aggiunto nuovo proprietario";

  else echo "<br />Query errata: non aggiunto nuovo proprietario";

  $idp = mysql_insert_id();

}

$sql = "insert into appartamenti (

       posti,

       costo,

       localita,

       proprietario,

       descrizione,

       servizi

       ) values (

       ".$posti.",

       ".$euro.",

       ".$idl.",

       ".$idp.",

       '".$des."',

       'box auto'

       )";

if (mysql_query($sql))

  echo "inserito Nuovo appartamento<br />";

else

  echo "non inserito Nuovo appartamento. Dati errati";

// acquisiszione foto

if ((($_FILES['foto']['type'] == "image/gif")

      || ($_FILES['foto']['type'] == "image/jpeg")

      || ($_FILES['foto']['type'] == "image/pjpeg"))

      && ($_FILES['foto']['size'] < 20000)) {

  if ($_FILES['foto']['error'] > 0) {

    echo "codice di errore: ".$_FILES['foto']['error']."<br />";

  } else {

    if (file_exists("img/".$_FILES['foto']['name'])) {

      echo $_FILES['foto']['name']." esiste. ";

    } else {

      move_uploaded_file($_FILES['foto']['tmp_name'],

          "img/" . $_FILES['foto']['name']);

      $ida = mysql_insert_id();

      $sql="insert into foto(idApp, foto, descrizione) values(".$ida.",'img/".$_FILES['foto']['name']."','".$_POST['dida']."')";

      if (mysql_query($sql)) echo "<br />Inserita foto";

      else echo "<br />Foto non inserita";

    }

  }

} else {

  echo "file non ammesso";

}

echo "rilascio della connessione con MySQL<br />";

mysql_close($con);

?>

<br />torna a <a href="index.php">home</a>

<br />torna a <a href="nuovoApp.php">inserimento</a> di un altro appartamento

</body>

</html>

Consultazione delle caratteristiche di un appartamento

Script: vedi.php

<html>

<head>

<title></title>

</head>

<body>

<?php

if (!$con = mysql_connect("localhost", "root", "")) exit();

$nomeDB = "vacanze";

mysql_select_db($nomeDB);

$casa = $_GET['id'];

$sql = "select * from appartamenti where id=".$casa;

$rs = mysql_query($sql);

$riga = mysql_fetch_array($rs);

$sql="select * from localita";

$rSet=mysql_query($sql);

$rigaLoc=mysql_fetch_array($rSet);

$Loc=$rigaLoc['nome'];

echo "Appartamento in ".$Loc."<br />";

echo $riga['descrizione']."<br />";

echo "Servizi accessori: ".$riga['servizi']."<br />";

echo "Costo: ".$riga['costo']."Euro<br />";

$sql="select * from foto where idApp=".$casa;

if ($rsf=mysql_query($sql)) echo "<br />Query su foto Ok";

else echo "<br />Query su foto errata";

while($rigaF=mysql_fetch_array($rsf)) {

  echo "<br /><img src='".$rigaF['foto']."' />";

  echo "<br />".$rigaF['descrizione'];

}

?>

<hr />

Prenotazione.<br />

<form action="prenota.php" method="post">

inserire la data nel formato AAAA-MM-GG<br />

data di arrivo: <input type="date" name="arrivo" /><br />

data di partenza: <input type="date" name="partenza" />

<input type="hidden" name="idApp" value=<?php echo "'".$casa."'"?> />

<input type="submit" />

</form>

<?php

mysql_close($con);

?>

</body>

</html>

Prenotazione

Nella tabella Prenotazioni l'attributo Arrivo indica la data di inizio e l'attributo Partenza indica la data finale di un soggiorno prenotato.

Prima di accettare una nuova richiesta di soggiorno, per lo stesso appartamento, bisogna accertarsi che il periodo di soggiorno richiesto non copra il periodo già prenotato.

Si indichi con da la data di inizio e con a la data finale del soggiorno richiesto.

Si devono considerare i seguenti casi:

  Arrivo    Partenza 
  |——————————————| 
 da  a    
I caso|—————————|    
   da a   
II caso  |—————|   
      da a
III caso    |——————|
 da      a
IV caso|——————————————————|

Un appartamento è "non disponibile" se si verifica almeno uno dei casi precedenti:

non disponibile

=

(Arrivo>da) and (Arrivo<a) and (Partenza>da) and (Partenza>a)

 

OR

(Arrivo<da) and (Arrivo<a) and (Partenza>da) and (Partenza>a)

 

OR

(Arrivo<da) and (Arrivo<a) and (Partenza>da) and (Partenza<a)

 

OR

(Arrivo>da) and (Arrivo<a) and (Partenza>da) and (Partenza<a)

Se si fanno le seguenti posizioni:

La funzione diventa:

  _       _ _       _ _   _     _   _
A·B·C·D + A·B·C·D + A·B·C·D + A·B·C·D

Rappresentata sulla mappa di Karnaugh:

      AB
CD    
 00  01  11  10  
 00     
 01     
!A·!B·C·D → 111  1 ← A·!B·C·D
!A·!B·C·!D → 101  1 ← A·!B·C·!D

si ottiene la funzione semplificata:

non disponibile = !B · C

Cioè non disponibile = Arrivo < a AND Partenza >da

Script: prenota.php

<html>

<head>

<title></title>

</head>

<body>

<?php

$da=$_POST['arrivo'];

$a=$_POST['partenza'];

$idApp=$_POST['idApp'];

if (!$con = mysql_connect("localhost", "root", "")) exit();

$nomeDB = "vacanze";

mysql_select_db($nomeDB);

$sql="select * from prenotazioni where idApp=".$idApp." and arrivo<'".$a."' and partenza>'".$da."'";

echo "<br />".$sql."<br />";

if ($rs=mysql_query($sql)) echo "<br />query Ok<br />";

else echo "<br />query errata<br />";

$q=mysql_num_rows($rs);

if ($q==0) {

$sql="insert into prenotazioni (arrivo, partenza, idApp) values('".$da."','".$a."',".$idApp.")";

mysql_query($sql);

echo "<br />".$sql."<br />";

echo "Prenotazione accettata";

} else echo "Appartamento non disponibile nel periodo dal ".$da." al ".$a;

?>

<br />torna a <a href="index.php">home</a>

</body>

</html>

Problemi:

Disegnare il diagramma E/R.

Calcolare il costo di un periodo di soggiorno

Dalla pagina di visualizzazione delle caratteristiche di un appartamento disdire la prenotazione di un cliente (o di un periodo).

Aggiungere uno script per inserire altre foto, ad esempio dalla pagina di visualizzazione di un appartamento.

Nella pagina iniziale offrire la possibilità di selezionare gli appartamenti per numero di posti letto e per città

Il form di inserimento di un nuovo appartamento comprende la possibilità di inserire anche i servizi disponibili, ma lo script proposto li ignora. Implementare l'operazione di registrazione dei servizi.