1. Analisi del problema.
Il sistema ha lo scopo di gestire i prestiti in una biblioteca digitale:
- registrazione di libri e autori
- gestione utenti
- registrazione e monitoraggio prestiti
- interrogazioni su disponibilità, prestiti attivi e scaduti
Obiettivi:
- Digitalizzare dati della biblioteca
- Consentire interrogazioni e report
- Realizzare un’interfaccia web semplice
2. Progettazione della base di dati.
2.1 Modello concettuale (diagramma E-R).
+———+ +———–+ +———+
| Libri | 1——< | Prestiti | >——1 | Utenti |
+———+ +———–+ +———+
| ID_Libro PK | ID_Prestito PK | ID_Utente PK
| Titolo | ID_Libro FK | Nome
| Autore | ID_Utente FK | Cognome
| Anno_Pubblicazione | Data_Prestito | Email
| Genere | Data_Restituzione
Descrizione:
- Un libro può essere in prestito a un solo utente alla volta
- Un utente può avere più prestiti
2.2 Tabelle con dati di esempio.
Libri
| ID_Libro | Titolo | Autore | Anno | Genere |
| 1 | Il Nome della Rosa | Umberto Eco | 1980 | Storico |
| 2 | Harry Potter e la Pietra Filosofale | J.K. Rowling | 1997 | Fantasy |
| 3 | Il Gattopardo | Tomasi di Lampedusa | 1958 | Romanzo |
Utenti
| ID_Utente | Nome | Cognome | |
| 1 | Mario | Rossi | mario.rossi@mail.it |
| 2 | Luca | Bianchi | luca.bianchi@mail.it |
Prestiti
| ID_Prestito | ID_Libro | ID_Utente | Data_Prestito | Data_Restituzione |
| 1 | 1 | 1 | 2026-02-01 | NULL |
| 2 | 2 | 2 | 2026-01-28 | 2026-02-03 |
3. Interrogazioni SQL significative.
Query 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 i libri non attualmente in prestito. Risultato di esempio:
- “Harry Potter e la Pietra Filosofale”
Query 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. Risultato di esempio:
- Mario Rossi → Il Nome della Rosa
Query 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()[1];
Descrizione: elenca i prestiti non restituiti in tempo. Risultato di esempio:
- Nessuno (tutti restituiti o ancora attivi)
4. Interfaccia web.
4.1 Schermata principale.
Funzionalità:
- Visualizzazione libri disponibili
- Interrogazioni interattive su prestiti
- Pulsanti per aggiunta/modifica/cancellazione libri e utenti
Mockup[2]:
—————————————
| Biblioteca Digitale |
—————————————
| Libri disponibili: |
| – Harry Potter e la Pietra Filosofale|
| |
| [Aggiungi Libro] [Elimina Libro] |
| [Visualizza Prestiti] |
—————————————
4.2 Codice esempio per libri disponibili.
PHP Backend (get_libri_disponibili.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();
?>
Frontend HTML + JS
<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>
5. Flussi di lavoro.
[Utente] —> [Interfaccia Web] —> [PHP Backend] —> [Database MySQL]
| ^
|———————————-|
Spiegazione: l’utente interagisce con la pagina web; le richieste vengono inviate a PHP; PHP esegue le query sul database e restituisce i dati da visualizzare in pagina.
6. Criteri seguiti.
- Chiarezza della base dati
- Integrità referenziale tramite chiavi esterne
- Interrogazioni SQL significative e facilmente estendibili
- Interfaccia web semplice e interattiva
7. Mezzi impiegati.
- DBMS: MySQL
- Server web: XAMPP/WAMP
- Linguaggi: PHP, JavaScript, HTML5, CSS3
- Editor: Visual Studio Code
8. Risultati ottenuti.
- Base dati funzionante e normalizzata
- Query SQL testate con risultati coerenti
- Interfaccia web operativa e interattiva
- Possibilità di estendere a inserimento, modifica e cancellazione
[1] Restituisce la data corrente del sistema.
[2] Un Mockup SQL (spesso definito come mock database, database mocking o test data) è una simulazione di un database relazionale utilizzata durante lo sviluppo software, in particolare nelle fasi di testing. Invece di collegare l’applicazione a un vero database SQL (che sarebbe lento e complesso da configurare per ogni test), si utilizza una versione “finta” che risponde alle query come se fosse quella reale, restituendo dati predefiniti.
