Vai al contenuto

Progetto finale

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.

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.

  1. 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).
  2. Modello E/R con entità, attributi, identificatori e cardinalità. Disegnalo con draw.io ed esportalo come immagine.
  3. Schema logico, verificando la terza forma normale (lezione 3).
  4. Database. Scrivi il file database.sql a mano, come biblioteca.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.
  5. 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.
  6. Pagine pubbliche: elenco con ricerca, filtri e paginazione; scheda di dettaglio; una pagina di statistiche.
  7. Area riservata: login e logout, inserimento, modifica e cancellazione (CRUD) di almeno due tabelle, gestione dell'associazione N:M.
  8. Verifica con la lista di controllo qui sotto.
  9. Documentazione: un file LEGGIMI.md o un PDF (vedi "Cosa consegnare").

Requisiti minimi

  • ☐ Il database si importa senza errori e ha chiavi primarie, chiavi esterne con regole ON DELETE motivate, NOT NULL e UNIQUE dove 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 con password_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)

  1. Gestione degli autori e degli studenti (CRUD completo, con la cancellazione bloccata se ci sono libri o prestiti).
  2. Scheda dello studente con prestiti in corso e storico (esercizio 2 della lezione 14).
  3. Prenotazioni: uno studente prenota un libro non disponibile; quando viene restituito, la prenotazione compare nella pagina dei prestiti. Serve una nuova tabella.
  4. 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 usano autore_id.
  5. Esportazione CSV dei prestiti, da aprire con il foglio di calcolo (header('Content-Type: text/csv') e fputcsv).
  6. Copertine: caricamento di un'immagine per libro (<input type="file">, $_FILES, controllo di tipo e dimensione, move_uploaded_file).
  7. Solleciti: la pagina con i prestiti in ritardo e, per ciascuno, un link mailto: con il testo del sollecito già scritto.
  8. API JSON: api/libri.php restituisce 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.sql con le query commentate;
  • la documentazione (LEGGIMI.md o PDF), con:
    1. analisi e ipotesi aggiuntive;
    2. modello E/R (immagine) e schema logico;
    3. elenco delle pagine, con una riga su cosa fa ciascuna e chi può usarla;
    4. le scelte di sicurezza (quali difese, dove, perché);
    5. le credenziali di prova (es. admin / password) e le istruzioni per installare il progetto su XAMPP.

⚠️ Nella consegna, config.php contiene le credenziali di XAMPP (root senza 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.