Relazione della prova di laboratorio.
Titolo: Gestione di una biblioteca digitale.

1. Analisi del problema.
Il sistema ha lo scopo di gestire prestiti di libri in una biblioteca digitale, consentendo:
- registrazione di libri e autori
- gestione utenti della biblioteca
- registrazione e monitoraggio dei prestiti
- interrogazioni per sapere quali libri sono disponibili, in prestito o scaduti
Obiettivi principali:
- Digitalizzare e gestire i dati della biblioteca
- Consentire interrogazioni e report utili per gli utenti e per la biblioteca
- Realizzare un’interfaccia web semplice per consultazione e gestione
2. Progettazione della base di dati.
2.1 Modello concettuale E-R.
[Libri] 1—N [Prestiti] N—1 [Utenti]
Entità e attributi principali:
- Libri: ID_Libro (PK), Titolo, Autore, Anno_Pubblicazione, Genere
- Utenti: ID_Utente (PK), Nome, Cognome, Email
- Prestiti: ID_Prestito (PK), ID_Libro (FK), ID_Utente (FK), Data_Prestito, Data_Restituzione
Relazioni:
- Un libro può essere prestato a un solo utente alla volta
- Un utente può avere più prestiti
2.2 Schema logico SQL.
CREATE TABLE Libri (
ID_Libro INT PRIMARY KEY AUTO_INCREMENT,
Titolo VARCHAR(100) NOT NULL,
Autore VARCHAR(50) NOT NULL,
Anno_Pubblicazione INT,
Genere VARCHAR(30)
);
CREATE TABLE Utenti (
ID_Utente INT PRIMARY KEY AUTO_INCREMENT,
Nome VARCHAR(50) NOT NULL,
Cognome VARCHAR(50) NOT NULL,
Email VARCHAR(100)
);
CREATE TABLE Prestiti (
ID_Prestito INT PRIMARY KEY AUTO_INCREMENT,
ID_Libro INT NOT NULL,
ID_Utente INT NOT NULL,
Data_Prestito DATE NOT NULL,
Data_Restituzione DATE,
FOREIGN KEY (ID_Libro) REFERENCES Libri(ID_Libro),
FOREIGN KEY (ID_Utente) REFERENCES Utenti(ID_Utente)
);
3. Interrogazioni SQL significative.
3.1 Libri disponibili.
SELECT Titolo, Autore
FROM Libri
WHERE ID_Libro NOT IN (SELECT ID_Libro FROM Prestiti WHERE Data_Restituzione IS NULL);
Descrizione: mostra tutti i libri non attualmente in prestito.
3.2 Prestiti attivi di un utente.
SELECT u.Nome, u.Cognome, l.Titolo, p.Data_Prestito
FROM Prestiti p
JOIN Utenti u ON p.ID_Utente = u.ID_Utente
JOIN Libri l ON p.ID_Libro = l.ID_Libro
WHERE p.Data_Restituzione IS NULL AND u.ID_Utente = 1;
Descrizione: mostra i libri in prestito all’utente con ID 1.
3.3 Prestiti scaduti.
SELECT u.Nome, u.Cognome, l.Titolo, p.Data_Restituzione
FROM Prestiti p
JOIN Utenti u ON p.ID_Utente = u.ID_Utente
JOIN Libri l ON p.ID_Libro = l.ID_Libro
WHERE p.Data_Restituzione < CURDATE();
Descrizione: elenca i prestiti non restituiti entro la data prevista.
4. Interfaccia web.
4.1 Struttura.
- Frontend: HTML5, CSS, JavaScript
- Backend: PHP + MySQL
- Pagina principale con elenco libri disponibili e pulsanti per altre query
4.2 Pagina web esempio (Libri disponibili).
<!DOCTYPE html>
<html lang=”it”>
<head>
<meta charset=”UTF-8″>
<title>Biblioteca Digitale</title>
</head>
<body>
<h1>Gestione Biblioteca</h1>
<h2>Libri disponibili</h2>
<div id=”libriDisponibili”></div>
<script>
fetch(‘get_libri_disponibili.php’)
.then(response => response.json())
.then(data => {
let container = document.getElementById(‘libriDisponibili’);
data.forEach(libro => {
let p = document.createElement(‘p’);
p.textContent = libro.Titolo + ” – ” + libro.Autore;
container.appendChild(p);
});
});
</script>
</body>
</html>
4.3 Script PHP
<?php
$conn = new mysqli(“localhost”, “root”, “”, “biblioteca”);
if ($conn->connect_error) { die(“Connessione fallita: ” . $conn->connect_error); }
$sql = “SELECT Titolo, Autore
FROM Libri
WHERE ID_Libro NOT IN
(SELECT ID_Libro FROM Prestiti WHERE Data_Restituzione IS NULL)”;
$result = $conn->query($sql);
$libri = [];
while($row = $result->fetch_assoc()) { $libri[] = $row; }
echo json_encode($libri);
$conn->close();
?>
5. Diagramma dei flussi di lavoro.
[Utente] —> [Interfaccia Web] —> [PHP Backend] —> [Database MySQL]
| ^
| |
——————- REST API / SQL
Spiegazione: l’utente interagisce con l’interfaccia web, che invia richieste PHP al database. Il database restituisce risultati JSON che vengono visualizzati dinamicamente.
6. Criteri seguiti nella progettazione.
- Semplicità: schema chiaro e facilmente estendibile
- Integrità dei dati: vincoli chiave primaria/esterna
- Interattività web: aggiornamento dinamico dei dati senza ricaricare la pagina
- Riutilizzabilità: query e interfaccia modulari
7. Mezzi impiegati.
- DBMS: MySQL
- Server web locale: XAMPP / WAMP
- Linguaggi: PHP, JavaScript, HTML5, CSS3
- Strumenti di sviluppo: Visual Studio Code
8. Risultati ottenuti.
- Base dati funzionante e normalizzata
- Query SQL corrette e testate con risultati coerenti
- Interfaccia web semplice, ma interattiva
- Possibilità di estendere il sistema a inserimento, modifica, cancellazione e altre interrogazioni
