
Ecco la pagina della soluzione della seconda prova di Informatica per l’istituto ITIA – Informatica e telecomunicazioni Articolazione informatica.
Soluzione Seconda Prova Informatica
PARTE PRIMA
Punto 1: Schema ER

Nello schema generale della base dati abbiamo innanzitutto utilizzato una Gerarchia per gestire i due tipi di utenti.
Siccome un utente puo’ essere sia passeggero che autista, la Gerarchia e’ non-totale, , e quindi la somma delle entita’ figlie puo’ essere maggiore dell’entita’ padre, e non-esclusiva, perche’ l’utente puo’ trovarsi contemporaneamente in entrambe le entita’ figlie.Abbiamo poi valutato l’attributo CodiceFiscale come chiave primaria dell’entita’ Utente, perche’ univoco per definizione.
Abbiamo poi creato l’entita’ Citta’ con chiave primaria Nome e con una relazione ricorsiva su se stessa per indicare la provincia.
Per quanto riguarda l’entita’ Viaggio, tra gli attributi locali all’entita’ troviamo Chiuso che serve all’utente-autista per chiudere dalla propria area riservata la disponibilita’ di prenotazione da parte di utenti-passeggeri. Questa azione viene effettuata quando l’utente-autista raggiunge il massimo di passeggeri che puo’ portare.
L’attributo Annotazioni, infine, e’ per indicare eventuali note che i passeggeri debbono tenere presente (aria condizionata si/no, musica in auto, eventuale disponibilita’ a fare fermate durante il percorso, etc).
Da notare che la chiave primaria dell’entita’ Viaggio e’ composta dal proprio attributo Data/Ora partenza e dall’utente-autista. In questo modo siamo sicuri dell’integrita’ dei dati, perche’ un utente-autista, nello stesso istante, puo’ fare un solo viaggio.
L’entita’ Viaggio ha poi due relazioni con Citta’: una per la partenza e una per l’arrivo.
Infine l’entita’ Feedback ha due relazioni con l’entita’ Utente: una per chi lascia e una per chi riceve. Ha poi una data/ora, un voto (numerico) e un giudizio (testuale). In questo caso, per semplicita’, abbiamo aggiunto un attributo ID (numerico/autoincrementale) come chiave primaria.
Punto 2: Schema logico
Di seguito la traduzione del precedente schema ER in schema logico:
Utente
Abbiamo deciso di gestire l’attributo Foto per contenere il path al file immagine.
Passeggero
Autista
In questa tabella sarebbe possibile migliorare la gestione dell’Autovettura con tabelle esterne per Marche e Modelli. Per questa prima implementazione si suppone un campo di testo semplice.
Feedback
Città
Viaggio
La tabella Viaggio ha tre attributi che costituiscono la chiave primaria. Qui un miglioramento potrebbe essere gestire le Annotazioni in modo piu’ strutturato, per esempio con una tabella esterna che riguarda i servizi disponibili (aria condizionata, fermate durante il tragitto, etc).
PasseggeriViaggio
Questa mappa contiene l’elenco dei passeggeri di ogni viaggio. La chiave primaria e’ quindi composta sia dal viaggio che dal passeggero.
Punto 3: Query SQL
Query ASELECT Utente.Nome, Utente.Cognome, Viaggio.Partenza, Viaggio.[Data], Viaggio.Ora, Viaggio.Arrivo, Autista.Autovettura, Viaggio.Importo
FROM (Autista INNER JOIN Utente ON Autista.CodiceFiscale = Utente.CodiceFiscale) INNER JOIN Viaggio ON Viaggio.Autista = Autista.CodiceFiscale
WHERE Viaggio.Partenza = "..." AND Viaggio.Arrivo = "..." AND Viaggio.Data = '...' AND Viaggio.Chiuso = false
ORDER BY Viaggio.Ora ASC;
Query B
SELECT Utente.Nome, Utente.Cognome, Autista.Autovettura, Viaggio.Partenza, Viaggio.[Data], Viaggio.Ora, Viaggio.Arrivo, Viaggio.TempoStimato, Viaggio.Importo
FROM ((PasseggeriViaggio INNER JOIN Viaggio ON PasseggeriViaggio.AutistaViaggio = Viaggio.Autista AND PasseggeriViaggio.DataViaggio = Viaggio.Data AND PasseggeriViaggio.OraViaggio = Viaggio.Ora) INNER JOIN Autista ON Autista.CodiceFiscale = Viaggio.Autista) INNER JOIN Utente ON Autista.CodiceFiscale = Utente.CodiceFiscale
WHERE PasseggeriViaggio.CodicePrenotazione = 0000;
Query C
SELECT Utente.Nome+" "+Utente.Cognome AS NomeUtente, Avg(Feedback.voto) AS FeedbackMedio
FROM (((Passeggero INNER JOIN Utente ON Passeggero.CodiceFiscale = Utente.CodiceFiscale) INNER JOIN PasseggeriViaggio ON Passeggero.CodiceFiscale = PasseggeriViaggio.Passeggero) INNER JOIN Viaggio ON (PasseggeriViaggio.AutistaViaggio = Viaggio.Autista) AND (PasseggeriViaggio.DataViaggio = Viaggio.[Data]) AND (PasseggeriViaggio.OraViaggio = Viaggio.Ora)) INNER JOIN Feedback ON Passeggero.CodiceFiscale = Feedback.RicevutoDa
WHERE (((Viaggio.Autista)="...") AND ((Viaggio.Data)="...") AND ((Viaggio.Ora)="..."))
GROUP BY (Utente.Nome+" "+Utente.Cognome)
HAVING (((Avg(Feedback.voto))>X));
Passo 4: Implementazione Web
Lato Client (HTML)Form HTML per richiedere i viaggi disponibili
<form action=”mostraviaggi.php”>
<input type=”text” name=”partenza” value=”Inserisci da dove vuoi partire...”>
<input type=”text” name=”data” value=”Inserisci quando vuoi partire...”>
<input type=”text” name=”arrivo” value=”Inserisci dove vuoi andare...”>
<input type=”submit”>
</form>
Lato Server (PHP)
Codice per recuperare un viaggio a partire da Citta’ di partenza, data e Citta’ di arrivo. (PHP):
// Impostiamo i parametri di connessione del database
$servername = "dbserver";
$username = "username";
$password = "password";
$dbname = "nomedatabase";
// Creiamo la connessione al database
$conn = new mysqli($servername, $username, $password, $dbname);
// Query per recuperare i viaggi
$sql = " SELECT Utente.Nome, Utente.Cognome, Viaggio.Partenza, Viaggio.Ora, Viaggio.Arrivo, Autista.Autovettura, Viaggio.Importo
FROM (Autista INNER JOIN Utente ON Autista.CodiceFiscale = Utente.CodiceFiscale) INNER JOIN Viaggio ON Viaggio.Autista = Autista.CodiceFiscale
WHERE Viaggio.Partenza = "..." AND Viaggio.Arrivo = "..." AND Viaggio.Data = '...' AND Viaggio.Chiuso = false
ORDER BY Viaggio.Ora ASC;”;
$result = $conn->query($sql);
// Se ci sono risultati, li visualizziamo
if ($result->num_rows > 0) {
while($row = $result->fetch_assoc()) {
echo "Autista: " . $row["Nome"].” “.$row[Cognome]. "
Partenza da: " . $row["Partenza"]. " alle ore: “. $row["Ora"]. “
Arrivo a: ".$row["Arrivo"]. "
Con Autovettura: ".$row["Autovettura"]. "
Importo viaggio: ".$row["Importo"];
}
} else {
echo "0 results";
}
// Chiudiamo la connessione al database
$conn->close();
?>