GESTIONE DI UNA BIBLIOTECA DIGITALE: analisi+SQL+PHP+HTML+Javascript.

PHP e SQL
PHP e SQL

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:

  1. Digitalizzare e gestire i dati della biblioteca
  2. Consentire interrogazioni e report utili per gli utenti e per la biblioteca
  3. 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.

  1. Semplicità: schema chiaro e facilmente estendibile
  2. Integrità dei dati: vincoli chiave primaria/esterna
  3. Interattività web: aggiornamento dinamico dei dati senza ricaricare la pagina
  4. 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
** 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.