Gestione di una biblioteca digitale (II versione).

PHP e SQL
PHP e SQL

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:

  1. Digitalizzare dati della biblioteca
  2. Consentire interrogazioni e report
  3. 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_LibroTitoloAutoreAnnoGenere
1Il Nome della RosaUmberto Eco1980Storico
2Harry Potter e la Pietra FilosofaleJ.K. Rowling1997Fantasy
3Il GattopardoTomasi di Lampedusa1958Romanzo

Utenti

ID_UtenteNomeCognomeEmail
1MarioRossimario.rossi@mail.it
2LucaBianchiluca.bianchi@mail.it

Prestiti

ID_PrestitoID_LibroID_UtenteData_PrestitoData_Restituzione
1112026-02-01NULL
2222026-01-282026-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 databasedatabase 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.

** Se puoi sostenere il mio lavoro, comprami un libro | Buy me a book! **
** ISCRIVITI ALLA NEWSLETTER ! **

About the Author

Sergio Mauri
Blogger, autore. Perito in Sistemi Informativi Aziendali, musicista e compositore, Laurea in Discipline storiche e filosofiche e in Filosofia. Premio speciale al Concorso Claudia Ruggeri nel 2007; terzo posto al Premio Igor Slavich nel 2020. Ha pubblicato con Terra d'Ulivi nel 2007 e nel 2011, con Hammerle Editori nel 2013 e 2014, con PGreco nel 2015 con Historica Edizioni e Alcova Letteraria nel 2022 con Silele Edizioni (La Tela Nera) nel 2023 e con Amazon Kdp nel 2024 e 2025.