Esercitazioni del corso di Tecnologie per la Comunicazione Aziendale PHP e Structured Query Language Marco Loregian loregian@disco.unimib.it www.siti.disco.unimib.it/didattica/tca2008 Interrogazioni (ripasso) Scarpe blu HTTP HTTP Il client (browser) manda tramite HTTP una richiesta al server (con una serie di parametri): tramite il modulo è specificata una pagina che contiene le istruzioni su come elaborare la richiesta Il server esegue lo script contenuto nella pagina richiesta dal client, elabora la richiesta, a seconda dei parametri, eventualmente consultando un suo archivio (base di dati) Il server impacchetta la nuova pagina, generata dalle istruzioni dello script, e la invia al client Il browser visualizza la pagina dei risultati
Obiettivo L obiettivo di questa esercitazione è realizzare, usando php ed un database mysql, un meccanismo per memorizzare ed estrarre informazioni relative a dei libri Schema Browser PHP SQL HTTP Web Server Database SQL
Database Strumenti per la memorizzazione persistente di informazioni (dati) I Database sono formati da delle Tabelle, ognuna con un proprio nome, che contengono i Records formati da righe e colonne Nelle righe sono presenti una informazione (record) e le colonne sono i singoli dati (parti di una informazione) Persone (nome, cognome, data_nascita, sesso, stato_civile) Tabelle e relazioni I db non sono composti da una sola tabella, ma di tabelle che contengono informazioni di tipo diverso, fra loro collegate da relazioni
SQL SQL Premessa Introduciamo gli elementi di base di SQL per poter lavorare con un database da pagine PHP prima vediamo come lavorare con un database indipendentemente da PHP poi inseriamo i concetti in pagine PHP Non è necessaria una conoscenza approfondita del linguaggio (molto potente!) per i nostri scopi
Operazioni Creazione di un database Creazione di tabelle Non lo faremo dalle nostre pagine php Operazioni con/sui dati inserimento di nuovi record in qualche tabella estrazione (selezione) dei record, eventualmente corrispondenti a qualche criterio aggiornamento dei record, ovvero modifica dei dati memorizzati cancellazione di record dalle tabelle Le useremo nelle nostre pagine php Creazione di un DB CREATE DATABASE nome_database I database è il contenitore delle tabelle, che a loro volta contengono i dati veri e propri (record) in lab lo faremo con una interfaccia grafica
Creazione di tabelle CREATE table nome_tabella ( nome_colonna tipo_colonna [ clausola_default ] [ vincoli_di_colonna ] [, nome_colonna tipo_colonna [ clausola_default ] [ vincoli_di_colonna ]... ] [, [ vincolo_di tabella]... ] ) Le parentesi quadre indicano una parte opzionale in lab lo faremo con una interfaccia grafica Tabella per esempio CREATE TABLE 'libri ' ( 'titolo' VARCHAR( 256 ), 'autore' VARCHAR( 128 ), 'pagine' INT ) in lab lo faremo con una interfaccia grafica Useremo questa tabella libri per i prossimi esempi
Inserimento Sintassi Esempio Attenzione INSERT INTO nome_tabella[ ( elenco_campi ) ] VALUES ( elenco_valori ) INSERT INTO `libri` ( `titolo`, `autore`, `pagine`) VALUES ('I promessi sposi', 'Alessandro Manzoni', '386'); - il tipo di dato inserito deve essere consistente con la definizione della colonna (testo, numeri, ) Popolo la tabella con i dati (per l esempio) Selezione (consultazione dei dati) Sintassi Esempio Attenzione SELECT [ ALL DISTINCT ] quali_elementi FROM tabella [ WHERE espressione_condizionale ] [ GROUP BY lista_colonne ] [ HAVING espressione_condizionale ] [ ORDER BY lista_colonne ] [ LIMIT intervallo ] SELECT * FROM `libri` []! opzionale * vuol dire che estraggo tutte le colonne - la clausola di selezione deve essere coerente con il tipo di dati
Esempi di select SELECT * FROM `libri` ORDER BY `autore` SELECT * FROM `libri` ORDER BY `pagine` DESC SELECT * FROM `libri` HAVING `pagine` < 200 Aggionamento Sintassi Esempio Attenzione INSERT INTO nome_tabella[ ( elenco_campi ) ] VALUES ( elenco_valori ) UPDATE `libri` SET `titolo` = 'La coscienza di Zeno' WHERE `titolo` = 'La coscienza di Zero'; - come per l inserimento, il tipo di dato inserito deve essere consistente con la definizione della colonna (testo, numeri, ) Bisogna stare attenti che la clausola WHERE identifichi esattamente il record che vogliamo aggiornare Di solito, si usa il concetto di chiave: un campo che identifica un record in maniera univoca (non può essere nullo o duplicato) numero di matricola, codice fiscale, La clausola WHERE è basata su espressioni booleane (posso anche usare AND)
PHP+SQL Cancellazione Sintassi Esempio Attenzione DELETE FROM nome_tabella [ WHERE espressione_condizionale ] DELETE FROM `libri` WHERE `autore` = 'Galileo Galilei' - potrebbero esserci riferimenti incrociati fra i dati - esistono vari modi di gestire la cancellazione (in cascata, ) - i dati non sono recuperabili dopo la cancellazione Valgono le raccomandazioni fatte per l aggiornamento PHP+SQL
Usare un database Devo conoscere i parametri per accedere al database (URL, username, password, nomi di tabelle e campi, ) ragionevole, dato che devo usare il database! Come prima cosa, in php devo stabilire una connessione con il database La connessione è lo strumento con cui eseguire le query (interrogazioni) sul database Se una query restituisce dei risultati (select) devo manipolarli (visualizzarli, ) Alla fine devo chiudere la connessione Vd. link seguente, ed esempio annesso http://php.html.it/guide/lezione/2286/lo-schema-utilizzato/ php per select (1/2) <?php $username = "root"; $password = "root"; $hostname = "localhost:8889"; $dbname = "tcablog"; $tablename = "libri"; Parametri del database $connessione = mysql_connect($hostname, $username, $password)! or die("unable to connect to MySQL"); $selected = mysql_select_db($dbname,$connessione)! or die("could not select $dbname"); print "<h1>contenuto di $hostname : $dbname. $tablename</h1>"; $query = "SELECT * FROM `$tablename`"; $risultati = mysql_query($query,$connessione);?> Connessione Esecuzione query
php per select (2/2) <table border="1"> <tr>! <th>autore</th>! <th>titolo</th>! <th>pagine</th> </tr> <?php while($riga = mysql_fetch_array($risultati))! { echo "<tr><td>". $riga['autore']. "</td>". "<td>". $riga['titolo']. "</td>". "<td>". $riga['pagine']. "</td></tr>";! } Scansione risultati mysql_close($connessione);?> </table> Chiusura connessione Risultato
Inserimento di dati html php + sql HTTP: get / post Pagina con modulo (form) dati Inserimento dati nel db (e feedback) Insert (html) <html> <head> <title>inserimento nuovo libro</title> </head> <body> <h1>inserisci un nuovo libro nel database</h1> <form action="insert.php" method="post"> Autore: <input type="text" name="autore"><br> Titolo: <input type="text" name="titolo"><br> Pagine: <input type="text" name="pagine"><br> <input type="submit" value="inserisci"> </form> </body> </html> insert.html
Insert (php 1/2) <html><head><title>inserimento libro</title></head><body> <?php $username = "root"; $password = "root"; $hostname = "localhost:8889"; $dbname = "tcablog"; $tablename = "libri"; insert.php $autore = $_REQUEST['autore']; $titolo = $_REQUEST['titolo']; $pagine = $_REQUEST['pagine']; Leggo dati passati via POST $connessione = mysql_connect($hostname, $username, $password)! or die("unable to connect to MySQL"); $selected = mysql_select_db($dbname,$connessione)! or die("could not select $dbname");! $query = "INSERT INTO libri (titolo, autore, pagine) VALUES ('$titolo','$autore',$pagine)";!! if (mysql_query($query, $connessione)) echo "Libro inserito correttamente"; else echo "Errore durante l'inserimento"; Eseguo la query $pagine senza apici perché è un numero Se nell if else o in un ciclo c è una sola istruzione posso omettere le graffe Insert (php 2/2) print "<h1>contenuto di $hostname : $dbname. $tablename</h1>"; $query = "SELECT * FROM `$tablename`"; $result = mysql_query($query,$connessione);?> <table border="1"> <tr>! <th>autore</th>! <th>titolo</th>! <th>pagine</th> </tr> Eseguo un altra query sulla connessione (idem come esempio select) insert.php <?php while($row = mysql_fetch_array($result))! { echo "<tr><td>". $row['autore']. "</td>". "<td>". $row['titolo']. "</td>". "<td>". $row['pagine']. "</td></tr>";! } mysql_close($connessione);?> </table> <p><a href="insert.html">inserisci un altro libro.</a></p> </body></html> Link a pagina per inserire ancora dati
Risultato inserimento insert.html insert.php GET vs. POST Due metodi forniti da HTTP per trasmettere dati da client a server GET passaggio valori tramite URL (lunghezza limitata) da usare per interrogazioni (select) nessun avviso dal browser $_GET[ nome ] POST passaggio valori non visibile (ok per password) da usare per inviare/ modificare dati avviso in caso di re-submit $_REQUEST[ nome ] Altre differenze, vedere: http://www.cs.tut.fi/~jkorpela/forms/methods.html
Cookies I Cookie sono il metodo più comune per la memorizzazione dello stato nel web Il cookie è un piccola file che contiene alcune informazioni e viene memorizzato nella memoria del browser o sul disco Per inviare cookie devono essere attivati dal browser del client Quando si invia un cookie lo possiamo leggere solo quanto l'utente torna sul sito I cookie devono essere emessi prima di qualsiasi codice php o html Non devono superare le dimensioni di 4 Kb Possono contenere: Nome, Valore, Scadenza, Percorso, Dominio, Sicurezza http://www.sci.unich.it/~bista/didattica/reti-sicurezza/seminari2004-05/cookies/ file%20per%20cookie/guida%20php%20%20cookie.htm Cookies in PHP (esempio) <?php setcookie ("test_cookie","niente di particolare",time()+43200,"/"); echo "<HTML>"; echo "<BODY>"; if (isset($test_cookie)){ echo "Ciao cookie, i tuoi contenuti sono: $test_cookie"; } else { echo "Non ho trovato alcun cookie con il nome test_cookie"; } echo "</BODY>"; echo "</HTML>";?> Scrivo un cookie e ne recupero il valore (ma se non è stato possibile scriverlo...)
Riferimenti http://www.webmasterpoint.org/asp/sql/home.asp http://database.html.it/guide/leggi/40/guida-linguaggio-sql/ http://it.wikipedia.org/wiki/sql http://php.html.it/guide/leggi/77/guida-phpmysql-pratica/