7.1
Aggiunta di libri nella biblioteca
Una delle funzionalità centrali del progetto di creazione di una biblioteca online è, ovviamente, la possibilità di inserire nuovi libri all'interno del catalogo digitale. Questo passaggio rappresenta l'inizio del ciclo di vita dei dati all'interno dell'applicazione e costituisce la prima lettera della sigla CRUD: Create. L'operazione è gestita direttamente nella pagina libri.php, dove si trova un form HTML pensato per facilitare l'inserimento manuale da parte dell'utente.
Questa sezione è particolarmente utile non solo per gli amministratori del sistema, ma anche come esercizio per comprendere a fondo il meccanismo che collega un'interfaccia utente a un database relazionale. L'inserimento di nuovi record permette di popolare il sistema e verificarne la reattività.
Form per inserire nuovi libri.
Il form si trova nella parte iniziale della pagina e raccoglie tutti i campi essenziali per descrivere un libro: titolo, autore, genere, anno di pubblicazione e descrizione. Ogni campo è accompagnato da un'etichetta e da un input specifico, pensato per rendere l'esperienza di compilazione il più fluida possibile. La struttura è semplice, intuitiva e si adatta a diverse risoluzioni di schermo, mantenendo la compatibilità con dispositivi mobili.
<form method="post">
<input type="text" name="titolo" placeholder="Titolo" required>
<input type="text" name="autore" placeholder="Autore" required>
<input type="number" name="anno" placeholder="Anno">
<button type="submit" name="submit">Aggiungi libro</button>
</form>
I campi titolo e autore sono contrassegnati con l'attributo required, che attiva una prima forma di validazione lato client, impedendo l'invio del form se non vengono compilati. Questo riduce il carico sul server e migliora la user experience.
Ogni campo ha un significato preciso:
titolo: il nome del libro, fondamentale per l'identificazione e la ricerca.
autore: la persona che ha scritto il libro.
anno: l'anno di pubblicazione, utile per ordinare o filtrare.
Questa struttura è facilmente estendibile: in futuro potrai aggiungere campi per l'ISBN, la casa editrice, la disponibilità o la posizione in scaffale, senza dover modificare radicalmente il codice.
Validazione e salvataggio nel database.
Una volta inviato il form, i dati vengono elaborati nella stessa pagina libri.php attraverso un controllo PHP. All'inizio del file, il codice intercetta la richiesta e procede con la memorizzazione nel database:
if (isset($_POST['submit'])) {
$titolo = $_POST['titolo'];
$autore = $_POST['autore'];
$genere = $_POST['genere'];
$anno = $_POST['anno'];
$descrizione = $_POST['descrizione'];
$stmt = $pdo->prepare("INSERT INTO libri (titolo, autore, genere, anno, descrizione) VALUES (?, ?, ?, ?, ?)");
$stmt->execute([$titolo, $autore, $genere, $anno, $descrizione]);
echo "<p>Libro aggiunto con successo.</p>";
}
Il controllo isset($_POST['submit']) assicura che il codice venga eseguito solo in seguito all'invio del form, evitando elaborazioni indesiderate all'apertura della pagina. I dati vengono raccolti tramite la superglobale $_POST e poi inseriti nel database usando una query preparata con PDO.
L'utilizzo di prepare() con execute() garantisce sicurezza contro le SQL Injection, poiché i dati inseriti dall'utente non vengono concatenati direttamente alla query SQL, ma gestiti come parametri isolati. Questo è un punto fondamentale di buona pratica in ogni applicazione web che interagisce con un database.
Il messaggio "Libro aggiunto con successo" viene poi mostrato a schermo per confermare l'avvenuta operazione, migliorando la comunicazione con l'utente.
Questo tipo di logica è estremamente importante da apprendere, poiché rappresenta la base per molte delle interazioni tra linguaggio PHP e MySQL. E da qui in avanti, è possibile estendere il sistema con altre funzionalità più complesse: controlli più avanzati sul formato dei dati (es. anno solo numerico, campo descrizione con limite di lunghezza), gestione di errori con messaggi specifici, inserimento di contenuti multilingua o validazione lato server tramite espressioni regolari.
Con questa prima operazione CRUD, la biblioteca digitale inizia a prendere vita. Ogni libro inserito viene memorizzato in modo persistente e può essere richiamato, aggiornato o cancellato in qualsiasi momento.
7.3
Modifica ed eliminazione dei libri della biblioteca
Nel nostro progetto della biblioteca, la gestione dei libri non si limita alla semplice visualizzazione: sono già presenti e pienamente funzionanti le funzionalità per modificare ed eliminare ogni titolo direttamente dalla tabella di riepilogo. All'interno del file libri.php, ogni riga dell'elenco include due link: uno per modificare e uno per eliminare. Queste operazioni completano il ciclo CRUD, permettendo agli utenti di aggiornare o cancellare in modo dinamico le informazioni archiviate nel database. Approfondiamo entrambe le funzionalità.
Eliminazione dei libri.
L'eliminazione di un titolo specifico avviene tramite un link che invia una richiesta GET contenente l'ID del libro da cancellare. Il codice incluso in libri.php intercetta questa richiesta e la gestisce nel seguente modo:
if (isset($_GET['elimina'])) {
$id = $_GET['elimina'];
$stmt = $pdo->prepare("DELETE FROM libri WHERE id = ?");
$stmt->execute([$id]);
echo "<p>Libro eliminato con successo.</p>";
}
Questo frammento di codice verifica innanzitutto la presenza del parametro elimina nella stringa dell'URL, il che indica l'intenzione dell'utente di cancellare un libro specifico. Se tale parametro è presente, il codice estrae l'ID del libro e costruisce una query SQL che utilizza un segnaposto (?) per evitare che il valore venga concatenato direttamente nella stringa della query. In questo modo, l'interazione con il database avviene in totale sicurezza grazie all'uso della funzione prepare, che consente di prevenire vulnerabilità comuni come le SQL Injection.
Una volta eseguita la query attraverso il metodo execute, il database elimina in modo permanente il record associato all'ID passato. L'operazione si conclude con un messaggio a video che informa l'utente del buon esito della cancellazione. Questo tipo di feedback è importante per migliorare la user experience e mantenere l'utente consapevole delle modifiche effettuate.
Vale la pena notare che questa logica può essere facilmente estesa in futuro per includere conferme JavaScript prima della cancellazione, messaggi di avviso stilizzati con Bootstrap o addirittura una funzione di "eliminazione soft" che nasconde il libro senza rimuoverlo dal database.
Il collegamento corrispondente nel ciclo foreach è simile a:
<a href="libri.php?elimina=<?= $libro['id'] ?>">Elimina</a>
Modifica dei libri.
Anche la funzione di modifica è implementata nello stesso file, seguendo un approccio condizionale. Se nell'URL è presente il parametro modifica, il libro con quell'ID viene caricato e i suoi dati mostrati all'interno di un form HTML per la modifica:
if (isset($_GET['modifica'])) {
$id = $_GET['modifica'];
$stmt = $pdo->prepare("SELECT * FROM libri WHERE id = ?");
$stmt->execute([$id]);
$libroModifica = $stmt->fetch();
}
Il form è precompilato con i dati correnti del libro grazie all'utilizzo del valore value="<?= htmlspecialchars($libroModifica['campo']) ?>" per ciascun input. Questo metodo consente non solo di mostrare all'utente i dati attuali in modo chiaro, ma anche di facilitarne l'eventuale modifica senza il rischio di dover riscrivere tutto da capo. È una tecnica che migliora l'usabilità, soprattutto quando il numero di campi è elevato.
L'impiego della funzione htmlspecialchars è particolarmente importante in ottica di sicurezza: evita l'esecuzione involontaria di codice HTML o JavaScript potenzialmente malevolo, proteggendo l'applicazione da attacchi di tipo XSS (Cross-Site Scripting).
Inoltre, grazie a questa tecnica, il form di modifica diventa adattabile a qualsiasi dato proveniente dal database. In contesti più complessi, questa strategia può essere estesa con l'uso di funzioni PHP che generano dinamicamente l'intero set di input, rendendo il modulo scalabile e più semplice da mantenere nel tempo. Una volta modificati, i dati vengono inviati con POST, e il codice PHP li aggiorna nel database:
if (isset($_POST['update'])) {
$stmt = $pdo->prepare("UPDATE libri SET titolo = ?, autore = ?, genere = ?, anno = ?, descrizione = ? WHERE id = ?");
$stmt->execute([
$_POST['titolo'],
$_POST['autore'],
$_POST['genere'],
$_POST['anno'],
$_POST['descrizione'],
$_POST['id']
]);
echo "<p>Libro modificato con successo.</p>";
}
L'interfaccia include anche un campo hidden con l'ID del libro da modificare. Questo campo, invisibile all'utente ma fondamentale per il funzionamento dell'applicazione, permette di mantenere il riferimento preciso all'elemento selezionato nel database. In questo modo, il sistema è in grado di distinguere esattamente quale record aggiornare anche quando vengono gestiti più elementi contemporaneamente. L'utilizzo di un campo hidden è una tecnica comune nei form dinamici e contribuisce a rendere più affidabile la logica di aggiornamento.
Completa il paradigma CRUD con modifica ed eliminazione dei libri della biblioteca.
Con le funzionalità di modifica ed eliminazione, il progetto implementa in maniera completa le operazioni tipiche del paradigma CRUD:
Create: tramite il form iniziale di inserimento, che consente di aggiungere nuovi libri nel database
Read: attraverso la tabella HTML generata dinamicamente, che mostra tutti i libri salvati
Update: modificando i dati esistenti tramite il form precompilato
Delete: rimuovendo record specifici mediante il link di eliminazione.
Questa struttura non solo è utile per una biblioteca, ma rappresenta uno standard universale per la gestione di qualsiasi insieme di dati persistenti. Le stesse tecniche, infatti, possono essere facilmente riutilizzate in applicazioni aziendali o commerciali, ad esempio per il tracciamento di ordini, la gestione di clienti e fornitori, l'organizzazione di eventi, o la pubblicazione di articoli su una piattaforma di contenuti.
Apprendere questi meccanismi significa acquisire un linguaggio comune a molti settori dello sviluppo web: che si tratti di ecommerce, CRM, sistemi di prenotazione o CMS, la logica CRUD costituisce la spina dorsale di gran parte delle applicazioni moderne. Una comprensione approfondita di queste dinamiche è quindi fondamentale per strutturare soluzioni scalabili, manutenibili e coerenti con le best practice dello sviluppo back-end.