In questa lezione impari a
- progettare e realizzare un'applicazione web completa con PHP e MySQL
- documentare il progetto come all'Esame di Stato
- verificare sicurezza e funzionamento prima della consegna
Ora hai tutti gli strumenti per realizzare un'applicazione completa da solo (o in coppia, se il docente lo prevede). Il progetto si svolge in due modi a scelta.
- Percorso A – La biblioteca. Completi l'applicazione del corso, partendo dal kit, e aggiungi almeno due estensioni (vedi più sotto).
- Percorso B – Un tema tuo. Progetti e realizzi un'applicazione nuova, su uno dei temi proposti o su un'idea tua, approvata dal docente. È il percorso più vicino all'Esame di Stato, dove il tema è sempre nuovo.
- biblioteca-kit.zipIl punto di partenza: configurazione, connessione, funzioni, intestazione, piè di pagina, stile e database
- biblioteca.sqlIl database della biblioteca con i dati di prova
Il kit va bene anche per il percorso B: basta cambiare il nome del database in config.php, le voci del menu in header.php e i colori in stile.css.
Temi per il percorso B
| Tema | Entità principali | Associazione N:M |
|---|---|---|
| Palestra della scuola | corsi, istruttori, studenti, iscrizioni | studenti – corsi |
| Prenotazione dei laboratori | laboratori, docenti, classi, prenotazioni (data e ora) | docenti/classi – laboratori |
| Banco alimentare / raccolta solidale | prodotti, donatori, famiglie, consegne | prodotti – consegne (con quantità) |
| Torneo sportivo d'istituto | squadre, giocatori, partite, risultati | squadre – partite |
| Noleggio attrezzatura del laboratorio | dispositivi, categorie, studenti, noleggi | studenti – dispositivi |
| Mercatino dei libri usati | libri, venditori, acquirenti, annunci, vendite | studenti – libri |
Ogni tema deve avere almeno 4 tabelle, almeno un'associazione 1:N e almeno una N:M con un attributo proprio.
I passi del lavoro
Il lavoro segue l'ordine del corso. Non saltare la progettazione: un database sbagliato si paga in ogni pagina.
- Analisi. Scrivi a parole, in mezza pagina, cosa fa l'applicazione, chi la usa (visitatore, utente registrato, amministratore) e quali operazioni può fare ciascuno. Elenca le ipotesi aggiuntive (lezione 2).
- Modello E/R con entità, attributi, identificatori e cardinalità. Disegnalo con draw.io ed esportalo come immagine.
- Schema logico, verificando la terza forma normale (lezione 3).
- Database. Scrivi il file
database.sqla mano, comebiblioteca.sql:DROP DATABASE IF EXISTS,CREATE DATABASE, le tabelle con tutti i vincoli e dati di prova realistici (almeno 8–10 righe per tabella principale). Deve importarsi senza errori su un XAMPP pulito. - Query. Prima di scrivere il PHP, prova in phpMyAdmin tutte le query che ti serviranno e salvale in
query.sql, ciascuna con un commento che dice a cosa serve. - Pagine pubbliche: elenco con ricerca, filtri e paginazione; scheda di dettaglio; una pagina di statistiche.
- Area riservata: login e logout, inserimento, modifica e cancellazione (CRUD) di almeno due tabelle, gestione dell'associazione N:M.
- Verifica con la lista di controllo qui sotto.
- Documentazione: un file
LEGGIMI.mdo un PDF (vedi "Cosa consegnare").
Requisiti minimi
- ☐ Il database si importa senza errori e ha chiavi primarie, chiavi esterne con regole
ON DELETEmotivate,NOT NULLeUNIQUEdove servono. - ☐ Almeno una query con JOIN su tre tabelle, una con GROUP BY e una con LEFT JOIN o sottoquery.
- ☐ Tutte le query con dati dell'utente sono preparate.
- ☐ Tutti i dati stampati nell'HTML passano da
h(). - ☐ I dati dei form sono validati sul server, con messaggi d'errore chiari e il form ricompilato.
- ☐ Le azioni che modificano i dati usano POST, con token CSRF e Post/Redirect/Get.
- ☐ Le pagine riservate chiamano
richiedi_login(); le password sono salvate conpassword_hash. - ☐ Gli errori dei vincoli (duplicati, chiavi esterne) diventano messaggi comprensibili, non pagine d'errore di PHP.
- ☐ La pagina di dettaglio risponde 404 se l'id non esiste.
- ☐ Le pagine si usano bene anche sul telefono.
La prova dell'attaccante
Prima di consegnare, prova ad attaccare la tua applicazione come hai imparato nel corso:
| Prova | Cosa deve succedere |
|---|---|
Scrivi ' e ' OR 1=1 -- in ogni campo di ricerca e di login |
nessun errore SQL, nessun dato in più |
Scrivi <script>alert(1)</script> come titolo o nome, salva e apri l'elenco |
il testo compare scritto, nessun alert |
| Apri le pagine riservate dopo il logout (scrivendo l'indirizzo) | si torna al login |
Cambia l'id nell'indirizzo: ?id=999, ?id=abc, ?id=-1 |
pagina 404, nessun errore PHP |
Con F12, togli required da un campo o aggiungi un'opzione al <select>, poi invia |
il server rifiuta il dato |
| Dopo un salvataggio premi F5 | nessun doppio inserimento |
| Elimina un record collegato ad altri | messaggio chiaro, nessun dato perso |
Estensioni (percorso A: almeno due)
- Gestione degli autori e degli studenti (CRUD completo, con la cancellazione bloccata se ci sono libri o prestiti).
- Scheda dello studente con prestiti in corso e storico (esercizio 2 della lezione 14).
- Prenotazioni: uno studente prenota un libro non disponibile; quando viene restituito, la prenotazione compare nella pagina dei prestiti. Serve una nuova tabella.
- Più autori per libro: l'associazione autore–libro diventa N:M. Va modificato il database, con una tabella
libri_autori, e tutte le query che usanoautore_id. - Esportazione CSV dei prestiti, da aprire con il foglio di calcolo (
header('Content-Type: text/csv')efputcsv). - Copertine: caricamento di un'immagine per libro (
<input type="file">,$_FILES, controllo di tipo e dimensione,move_uploaded_file). - Solleciti: la pagina con i prestiti in ritardo e, per ciascuno, un link
mailto:con il testo del sollecito già scritto. - API JSON:
api/libri.phprestituisce il catalogo in JSON (json_encode), con la ricerca come parametro GET.
Cosa consegnare
Una cartella compressa con:
- tutti i file PHP, CSS e le immagini;
database.sql(struttura e dati di prova);query.sqlcon le query commentate;- la documentazione (
LEGGIMI.mdo PDF), con:- analisi e ipotesi aggiuntive;
- modello E/R (immagine) e schema logico;
- elenco delle pagine, con una riga su cosa fa ciascuna e chi può usarla;
- le scelte di sicurezza (quali difese, dove, perché);
- le credenziali di prova (es.
admin/password) e le istruzioni per installare il progetto su XAMPP.
⚠️ Nella consegna,
config.phpcontiene le credenziali di XAMPP (rootsenza password), quindi va bene includerlo. In un progetto reale, invece, il file con le password vere non si consegna né si pubblica: si consegna una copia di esempio (config.esempio.php), come fa il sito di questo corso con i suoi quiz.
Griglia di valutazione
| Criterio | Peso | Livello avanzato (punteggio pieno) |
|---|---|---|
| Progettazione del database (E/R, schema logico, normalizzazione, vincoli) | 25% | modello completo e corretto, cardinalità giuste, ipotesi dichiarate, tabelle in 3NF, vincoli e regole ON DELETE motivati |
| SQL (query, correttezza dei risultati) | 20% | query corrette ed efficienti, uso appropriato di JOIN, LEFT JOIN, GROUP BY/HAVING e sottoquery |
| Funzionalità PHP (CRUD, ricerca, paginazione, login) | 25% | tutte le funzioni richieste funzionano, anche nei casi limite (elenco vuoto, id inesistente, dati sbagliati) |
| Sicurezza | 15% | supera tutte le prove dell'attaccante; difese applicate in modo sistematico, non a caso |
| Qualità del codice e interfaccia | 5% | codice ordinato e commentato, nomi chiari, nessuna duplicazione inutile; pagine chiare, usabili anche sul telefono |
| Documentazione ed esposizione | 10% | documentazione completa; lo studente spiega le scelte e risponde a domande sul codice |
| Voto | Descrizione sintetica |
|---|---|
| 9–10 | progetto completo e sicuro, estensioni realizzate bene, scelte motivate con sicurezza all'orale |
| 7–8 | requisiti minimi tutti soddisfatti, qualche imprecisione nella progettazione o nei casi limite |
| 6 | applicazione funzionante nelle parti principali; alcune difese mancanti o applicate solo in parte |
| 4–5 | database o pagine incompleti; problemi di sicurezza gravi (query non preparate, nessuna validazione) |
| 1–3 | progetto non funzionante o non consegnato |
L'orale conta. Durante la presentazione il docente sceglie una pagina e ti chiede di spiegarla riga per riga, o di fare una piccola modifica sul momento ("aggiungi una colonna all'elenco", "ordina per data"). Un progetto che non sai spiegare non è il tuo progetto.
Esercizio
Il piano di lavoro. Prima di scrivere codice, prepara e fai approvare dal docente: il tema scelto, l'analisi con le ipotesi, il modello E/R e l'elenco delle pagine con le query che ciascuna userà. Stima anche il tempo per ogni passo.
Mostra un esempio (palestra della scuola)
Analisi. L'applicazione gestisce i corsi sportivi pomeridiani. Il visitatore vede i corsi con i posti liberi; lo studente registrato si iscrive e si cancella; l'amministratore gestisce corsi e istruttori.
Ipotesi: ogni corso ha un solo istruttore e un numero massimo di iscritti; uno studente può iscriversi a più corsi, ma non due volte allo stesso; un corso si svolge sempre nello stesso giorno e alla stessa ora.
Schema logico:
istruttori (id, nome, cognome, specialita) corsi (id, nome, giorno, ora, posti, istruttore_id*) studenti (id, nome, cognome, classe, email, password_hash) iscrizioni (studente_id*, corso_id*, data_iscrizione)
Pagine: index.php (corsi con posti liberi: LEFT JOIN + GROUP BY), corso.php (dettaglio con iscritti), iscriviti.php (POST, controllo dei posti sul server, chiave primaria doppia contro le doppie iscrizioni), login.php, admin/corsi.php (CRUD), statistiche.php (iscritti per corso e per classe).
Tempi: progettazione 2 ore, database e query 2 ore, pagine pubbliche 3 ore, area riservata 4 ore, verifica e documentazione 2 ore.