Esercitazione 8 Basi di dati e web Rev. 1 Basi di dati - prof. Silvio Salza - a.a. 2014-2015 E8-1
Basi di dati e web Una modalità tipica di accesso alle basi di dati è tramite interfacce web Esiste una molteplicità di tipologie applicative, ad esempio: Interfacce web per l interrogazione e l effettuazione di transazioni su basi di dati DBMS, o più in generale CMS (Content Management Systems) per la gestione di contenuti in portali web In tutte le tipologie applicative abbiamo architetture a tre livelli: Web server, con funzioni di front-end Application server Database server, con funzioni di back-end Il client è sempre un Internet browser Basi di dati - prof. Silvio Salza - a.a. 2014-2015 E8-2
Pagine statiche e pagine dinamiche Il protocollo http prevede: Una richiesta da parte del client (browser), consistente nella specifica di un file, accompagnata da un eventuale passaggio di parametri, con modalità varie Una risposta da parte del web server (file html, immagine, ecc.) Il file restituito dal server può essere: Una pagina statica: tipicamente un file html (di contenuto prefissato) memorizzato nel server, in particolare quello specificato nella richiesta Una pagina dinamica : un file contenente codice html costruito run-time in base ai contenuti del file di richiesta, della base di dati, e in base al valore dei parametri Basi di dati - prof. Silvio Salza - a.a. 2014-2015 E8-3
Scripting lato-server e lato-client Lo strato applicativo è costituito da codice eseguibile (script) e si sviluppa a due livelli Lato-server : Esecuzione di uno script lanciato dal web server in base alla richiesta del browser per costruire una pagina dinamica Lo script può lanciare a sua volta l esecuzione di altro codice applicativo e coinvolgere livelli di back-end dell architettura Tipici linguaggi di scripting lato-server sono PHP, Perl, ASP Lato-client: Esecuzione di uno script sul browser durante l interpretazione della pagina e sulla base dell interazione dell utente Tipico linguaggio di scripting lato-client è Javascript Basi di dati - prof. Silvio Salza - a.a. 2014-2015 E8-4
PHP (Hypertext Preprocessor) È un linguaggio di scripting lato-server specificamente progettato per la costruzione di pagine html dinamiche È un free software rilasciato sotto una particolare licenza Il codice PHP è immerso (embedded) nel sorgente html ed interpretato da un apposito modulo, che è parte del web server Quando al web server viene richiesto un file.php, oppure incontra codice PHP in un file html, esso ne demanda l esecuzione ad un suo apposito modulo, il PHP runtime (interprete PHP) L interprete PHP agisce come un filtro: Accetta in ingresso testo e istruzioni PHP da un file Produce in uscita un file, tipicamente un file html Nel costruire l output, l interprete PHP interagisce con altri moduli applicativi, tipicamente il DBMS Basi di dati - prof. Silvio Salza - a.a. 2014-2015 E8-5
Esecuzione degli script PHP Web server Script PHP Pagina dinamica Web browser PHP Comandi SQL Risultati (tabelle) RDBMS Basi di dati - prof. Silvio Salza - a.a. 2014-2015 E8-6
Architetture lato server Un architettura lato server comprende: Un sistema operativo Un web server Un modulo di interpretazione PHP (parte del web server) Un DBMS A parte gli ambienti proprietari, le più diffuse piattaforme sono: LAMP: Linux Apache MySQL PHP WAMP: Windows Apache MySQL PHP A parte Windows, la piattaforma WAMP è tutta open source Basi di dati - prof. Silvio Salza - a.a. 2014-2015 E8-7
Form in pagine html Le form sono moduli di richiesta inserite in pagine html Una form (letteralmente modulo) permette di raccogliere valori che vengono poi passati come parametri in una richiesta http Oltre a caselle per l input di testo, una form può contenere anche elementi speciali, denominati control, quali: menu, checkbox, pulsanti, ecc. Ci sono tre tipi di pulsanti: Pulsanti di submit: provocano la trasmissione (submit) della form ed il relativo passaggio dei parametri Pulsanti di reset: provocano il ripristino dei valori iniziali Pulsanti di push: usati per attivare il lancio di uno script latoclient Basi di dati - prof. Silvio Salza - a.a. 2014-2015 E8-8
Passaggio dei parametri e azione Il passaggio dei parametri, consiste nella trasmissione del form data set, cioè dell insieme dei valori associati ai vari control Quando una form viene trasmessa il passaggio dei parametri può avvenire in due diversi modi Metodo GET: quando la richiesta è inviata, il form data set è inserito come parte della URL Metodo POST: il form data set è inviato, in forma opportunamente codificata insieme alla richiesta, ma i parametri non sono visibili nella URL Inoltre nella form viene specificata una azione, ovvero il nome di un file (es. un file php che deve essere mandato in esecuzione sul server) Basi di dati - prof. Silvio Salza - a.a. 2014-2015 E8-9
Interrogazione da web della base di dati (A) È possibile interrogare una base di dati tramite un web server tramite una sequenza di passi: A. Compilazione e trasmissione della form 1. L utente tramite il browser richiede una URL cui corrisponde una pagina html contenete una form 2. La pagina è interpretata dal browser che sviluppa i vari controlli, menu, checkbox, pulsanti ecc. 3. L utente compila la form specificando, direttamente o indirettamente il form data set cioè i parametri che specificano l interrogazione 4. All atto del submit viene inoltrata una richiesta al web server del file specificato nella action (ad es. un file.php), con associato il form data set Basi di dati - prof. Silvio Salza - a.a. 2014-2015 E8-10
Interrogazione da web della base di dati (B) B. Esecuzione lato-server 5. Il web server riconosce il file.php e ne demanda l interpretazione al modulo PHP 6. Il modulo PHP si connette al DBMS e gli passa una serie di comandi SQL (l interrogazione) 7. Il DBMS valuta l interrogazione e restituisce al modulo PHP il risultato (una tabella) tramite il meccanismo dei cursori 8. Il modulo PHP usa il risultato per costruire una pagina html con il risultato dell interrogazione e la restituisce al web server 9. Il web server restituisce la pagina html al browser 10. Il browser interpreta la pagina e visualizza il risultato dell interrogazione Basi di dati - prof. Silvio Salza - a.a. 2014-2015 E8-11
Sviluppo dell ambiente di esercitazione Per preparare l ambiente di esercitazione occorre installare: MySQL Apache Il modulo PHP (in realtà parte di Apache) Si assume che tutto ciò sia stato installato la piattaforma di sviluppo web/database, XAMPP Dal pannello di controllo lanciare sia MySQL cheapache Apache una volta partito si pone in ascolto sulla porta 80 Negli esempi che seguono si suppone che XAMP sia stato installato nella directory C:\xampp In questo caso Apache assume come sua directory di root C:\xampp\htdocs Ricopiare in questa directory la cartella db scaricata dal sito Basi di dati - prof. Silvio Salza - a.a. 2014-2015 E8-12
Esempi Come esempi prepariamo una serie di form per l interrogazione della base di dati La Famiglia Persone (Nome, Sesso, Anno, Città) Discendenza (Genitore, Figlio) Stato (Città, Inizio, Fine, Stato) Matrimoni (Marito, Moglie, Anno) Le interrogazioni come struttura sono predefinite, ma possono essere parametriche, nel qual caso i parametri vengono raccolti tramite le form Basi di dati - prof. Silvio Salza - a.a. 2014-2015 E8-13
Sviluppo dell ambiente di esercitazione (2) Per editare i file PHP conviene, ma non è indispensabile, usare un editor guidato dalla sintassi Una scelta efficace e facile da installare è Notepad++ facilmente reperibile in rete Oltre che per il PHP funziona per molti altri tipi di file I colori e le altre caratteristiche sono personalizzabili Posizione del web server e dei contenuti Se il web server è nello stesso host del client, allora si trova all indirizzo localhost A volte localhost potrebbe non funzionare: allora basta provare con 127.0.0.1 Basi di dati - prof. Silvio Salza - a.a. 2014-2015 E8-14
Esempio 1 ES1. Nome di tutte le persone nella base di dati All interrogazione corrisponde la query SQL: SELECT Nome FROM Persone Non ci sono parametri, pertanto non è necessario predisporre una form Basta predisporre sul server un file php in cui: Viene effettuata la connessione al DBMS Viene selezionato il DB Famiglia Viene passata la query, che restituisce la tabella Persone La tabella viene letta tupla per tupla e stampata, tramite il comando echo, nella pagina html statica che viene generata Basi di dati - prof. Silvio Salza - a.a. 2014-2015 E8-15
Esempio 1: il file pagina.php Basi di dati - prof. Silvio Salza - a.a. 2014-2015 E8-16
Esempio 1: recupero delle tuple L idea è quella che dall ambiente applicativo si vede un cursore, il quale contiene inizialmente la prima tupla della tabella risultato Successivamente ogni operazione di fetch sposta il cursore sulla tupla successiva Nella fattispecie: Il risultato della Select viene messo in $r Il comando $d=mysql_fetch_array($r)mette in $d la successiva tupla della tabella Al termine della tabella $d vale falso La tupla corrente ( $d ) viene usata per generare una riga nella pagina html generata da PHP contenente il valore dell attributo Nome Nel browser chiedere la pagina: http://localhost/db/pagina.php Basi di dati - prof. Silvio Salza - a.a. 2014-2015 E8-17
Esempio 2 ES2. Sesso, nome e anno di nascita di tutti membri della famiglia nati dopo un certo anno All interrogazione corrisponde la query SQL: SELECT Nome, Sesso, Anno FROM Persone where Anno>inizio order by anno Occorre una form perché deve essere acquisito il parametro inizio La form2.html prevede una casella per inserire l anno il comando input specifica: L etichetta associata alla casella: Anno di inizio La specifica del nome del parametro name="inizio" Tipo type="text" e dimensione size="20" Il valore iniziale value="" (stringa vuota) Azione associata: action="pagina2.php" method="post" Basi di dati - prof. Silvio Salza - a.a. 2014-2015 E8-18
Esempio 2: il file pagina2.php Quando la form form2.html viene restituita dal browser il web server manda in esecuzione la action pagina2.php Trattandosi di un file.php la sua interpretazione è demandata al modulo PHP: La parte di codice PHP è contornata da <?php e?> Il resto è codice html Dopo la connessione e selezione del DB viene inviata la query SQL Nella query viene passato il parametro proveniente dalla form: $_REQUEST[inizio] Il risultato restituito dal DBMS è messo in $res Basi di dati - prof. Silvio Salza - a.a. 2014-2015 E8-19
Esempio 2: la costruzione della pagina L interprete PHP genera una pagina html costituita da: Le parti già in codice html in pagina2.php Le parti generate dall esecuzione delle echo Le stringhe generate da echo sono concatenate tramite l operatore. La stringa <br /> è inserita nella pagina per essere interpretata dal browser e provocare un a capo Il carattere \n provoca un a capo nella pagina html La pagina così generata è di fatto una pagina statica costruita dinamicamente La pagina è restituita dal modulo PHP al web server che la manda a sua volta come risposta al browser Basi di dati - prof. Silvio Salza - a.a. 2014-2015 E8-20
Esempio 2a (controllo lato client) Nell esempio 2 non c è alcuna forma di controllo sui dati inseriti nel campo Anno di inizio, né sul fatto che essi vengano inseriti A questo esempio corrispondono la pagina form2a.html e la pagina di risposta pagina2a.php In form2a.html: viene inserito un controllo lato client tramite una funzione javascript; la definizione della funzione checkform()è nel header; La funzione è richiamata in corrispondenza dell evento di submit della form: onsubmit="return checkform()" Solo se la funzione restituisce true la submit ha luogo pagina2a.php è identica a pagina2.php ritorna su form2a.html salvo che Basi di dati - prof. Silvio Salza - a.a. 2014-2015 E8-21
Esempio 2b (controllo lato server) A questo esempio corrispondono la pagina form2b.html e la pagina di risposta pagina2b.php form2b.html è identica a form2.html salvo che lancia pagina2b.php In pagina2b.php: viene inserito un controllo lato server tramite un controllo PHP sulla variabile $_REQUEST['inizio']; se la variabile non è un numero si stampa un messaggio; altrimenti viene eseguita la query con il parametro etc. if(!is_numeric($_request['inizio'])){ echo "Non è stato inserito un numero"; } else{ query e costruzione pagina } Basi di dati - prof. Silvio Salza - a.a. 2014-2015 E8-22
Esempio 3 ES3. Sesso, nome, anno di nascita e città, di tutte le persone nate in un certo periodo in una certa città La novità in questo caso è nell acquisizione parametro citta, che viene acquisito tramite una select, cioè un menu a tendina Inoltre si vuole che il menu a tendina, sia calcolato dinamicamente, in base alle città effettivamente presenti nel DB La richiesta iniziale sarà costituita dal file form3.php che genererà dinamicamente la form contenente il menu in questione I valori da includere nel menu sono calcolati con l interrogazione: SELECT distinct Città FROM Persone order by Città Basi di dati - prof. Silvio Salza - a.a. 2014-2015 E8-23
Esempio 4: la form di richiesta ES4. Inserimento di una nuova persona nella tabella Persone specificandone Nome, Città, Sesso e Anno di nascita I dati da inserire vengono acquisiti tramite la form form4.php Nella form vengono eseguiti diversi controlli lato client tramite la funzione checkform: 1. Deve comunque essere inserito il Nome della persona 2. Deve essere selezionato il Sesso dal menu a tendina 3. Se Città non viene inserita si assume il valore NULL 4. Se Anno non viene inserito si assume il valore NULL 5. Se Anno viene inserito si accettano solo valori numerici 6. Nei casi 3 e 4 si controlla che l omissione sia intenzionale Basi di dati - prof. Silvio Salza - a.a. 2014-2015 E8-24
Esempio 4: il file php La action associata alla form è il file pagina4.php Questo file costruisce la pagina dinamica che viene restituita, e che riporta l esito dell operazione di inserimento 1. Vengono finalizzati i valori di Anno e Città: messi a NULL se viene passata una stringa vuota e messi gli apici a Città 2. Viene preparata la stringa della query di inserimento 3. Viene passata la query al DBMS 4. Se non ci sono errori la funzione mysql_query restituisce true e la cosa viene confermata nella pagina restituita 5. Altrimenti, se l errore è il 1062 si segnala la duplicazione della chiave primaria 6. Negli altri casi si restituisce codice e messaggio passati dal DBMS Basi di dati - prof. Silvio Salza - a.a. 2014-2015 E8-25