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>
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>
<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>
<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>
<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>
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:
Il periodo da-a cade a cavallo della data di Arrivo.
Il periodo da-a è interno al periodo Arrivo-Partenza
Il periodo da-a cade a cavallo della data di Partenza.
Il periodo da-a copre l'intero periodo Arrivo-Partenza
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:
A = (Arrivo>da)
B = (Arrivo>a)
C = (Partenza>da)
D = (Partenza>a)
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 → | 11 | 1 | 1 | ← A·!B·C·D | ||
!A·!B·C·!D → | 10 | 1 | 1 | ← A·!B·C·!D |
si ottiene la funzione semplificata:
non disponibile = !B · C
Cioè non disponibile = Arrivo < a AND Partenza >da
<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>
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.