PHP ed i database PHP funziona con molti database relazionale che includono: PHP – 5 – Oracle – Access – Postgres – SQL Server – MySQL Accesso a database Useremo MySQL poiché è semplice da usare, gratuito e molto popolare Tecnologie di Sviluppo per il WEB Database e tabelle Struttura di un DB relazionale Un data base relazionale si articola in tabelle Ciascuna tabella è costituita da un insieme di record (righe) Un record è costituito da un insieme di campi, che corrispondono alle colonne delle righe Tecnologie di Sviluppo per il WEB 2 3 Una tabella può possedere una chiave primaria, cioè un campo che ha un valore diverso per ogni record La chiave primaria permette di identificare univocamente i record della tabella La presenza della stessa chiave in due diverse tabelle permette di stabilire una relazione tra di esse Tecnologie di Sviluppo per il WEB 4 Creare un’istanza di un database Usare un linguaggio di interrogazione Quando si usa un database si usa un differente linguaggio di interrogazione per lavorare con il database stesso Con MySQL, si usa Structured Query Language (SQL), per accedere al database Una volta che si ha accesso ad un server con MySQL installato è necessario che qualcuno crei un’istanza di un database In genere l’istanza è creata dall’amministratore del database (DBA) Send SQL Query – L’amministratore crea un database a cui associa un identificativo utente (userid) e una password PHP Script Query Results MySQL Database Tecnologie di Sviluppo per il WEB Usiamo PhpMyAdmin oppure... 5 Inserimento di un utente Tecnologie di Sviluppo per il WEB Creazione di DB mysql -u root mysql -u utenteTsw -p CREATE DATABASE studenti; – Una sola volta ! – Non chiede la pswd (almeno la I volta) GRANT ALL PRIVILEGES ON *.* TO utenteTsw@localhost IDENTIFIED by ' pswd' WITH GRANT OPTION; Ripetere identico GRANT...TO utenteTsw@' %' .... USE studenti; – Ogni volta che vi loggate show tables; CREATE TABLE dati (cognome VARCHAR (30), nome VARCHAR(30), matricola CHAR(10), PRIMARY KEY (matricola) ); LOAD DATA INFILE ' pathToFile'INTO TABLE dati Tecnologie di Sviluppo per il WEB 6 7 FIELDS TERMINATED BY ' ;'; Tecnologie di Sviluppo per il WEB 8 LABORATORIO SQL ssh intrepido.diaedu.unisa.it mysql -u studente -p use studb – SQL è un linguaggio standard – Possiamo usare SQL per cercare, aggiornare e cancellare record da un database. – SQL è molto potente. A volte i comandi SQL possono diventare molto lunghi per query complesse. CREATE TABLE vostraLogin (cognome VARCHAR (30), nome VARCHAR(30), matricola CHAR(10) PRIMARY KEY ); INSERT INTO vostraLogin(' valoreCampo1' , valoreCampo2' ,...); Tecnologie di Sviluppo per il WEB Possiamo usare PHP per passare dei comandi ad un database MySQL. Questi comandi usano SQL (Structured Query Language) per interrogare il database 9 SQL di base Tecnologie di Sviluppo per il WEB 10 Esempio di Select – 1 I quattro comandi SQL su cui ci concentreremo sono: Supponiamo di avere la seguente tabella chiamata students – SELECT • Seleziona un insieme di record – INSERT • Inserisce un nuovo record – UPDATE • Aggiorna un record – DELETE • Cancella un record Tecnologie di Sviluppo per il WEB 11 Tecnologie di Sviluppo per il WEB 12 Esempio di Select – 2 Altri usi di SELECT – 1 La query delimitatore di testo SELECT surname FROM students WHERE degree_code=' 6500' SELECT surname,email FROM students – Seleziona dalla tabella students tutti i cognomi che hanno un codice pari a 6500 restituisce la seguente tabella SELECT * FROM students WHERE degree_code=' 6500'OR surname=' Faye' – Seleziona dalla tabella students tutti i record che un codice pari a 6500 oppure che hanno cognome Faye Tecnologie di Sviluppo per il WEB 13 Altri usi di SELECT – 2 Tecnologie di Sviluppo per il WEB DELETE SELECT * FROM students WHERE forename LIKE ' sa%' – Seleziona dalla tabella students tutti i record che hanno un nome (forename) che inizia per “sa” %sa'avremmo selezionato – Usando LIKE ' tutti i record con forename che finiscono per “sa” LIKE ' %sa%' avremmo – Usando selezionato tutti i record con forename contenenti “sa” Tecnologie di Sviluppo per il WEB 14 15 DELETE FROM students WHERE degree_code=' 2550' – Cancella dalla tabella studenti tutti i record che hanno codice “2550” – Tenete presente che, nella formulazione della query l’apice ('– delimitatore di testo ) è fondamentale. Tecnologie di Sviluppo per il WEB 16 INSERT UPDATE UPDATE students SET forename=' Peter' WHERE reg_number=981234 Per inserire record in una tabella dobbiamo fornire il nome dei campi ed i valori ad essi associati. Cambia in “Peter” il valore del campo forename del record che ha il campo reg_number pari 981234 – INSERT INTO students (reg_number,surname,forename,degree_code) VALUES (979924,' Blair' ,' Tony' ,' 6500' ) Notate che i dati testuali sono racchiusi tra apici singoli e che manca il campo email Tecnologie di Sviluppo per il WEB 17 Tecnologie di Sviluppo per il WEB Connessione a mysql Schema generale di interrogazione La funzione PHP che useremo per la connessione a MySQL è: Vediamo quali saranno, in generale, i passi di una interazione tipica: – connessione con il DBMS (server DB), – Selezione del database – invio di una query SQL con ricezione del risultato, – stampa (di una elaborazione) del risultato – chiusura della connessione con il DBMS Tecnologie di Sviluppo per il WEB 18 19 $connessione = mysql_connect($host, $user, $password ); I parametri sono: – $host • l’indirizzo del server su cui gira MySQL – $user • identificativo dell’utente del DBMS che intendiamo usare per la connessione – $password • password associata all’utente Tecnologie di Sviluppo per il WEB 20 Invio della query a mysql Selezione del database $risultato = mysql_query($query); – Invia la query $query al database attivo usando l’ultima connessione attiva – La risposta è memorizzata in $risultato sotto forma di matrice (ogni riga è un record che soddisfa $query mysql_select_db($database); – Seleziona il database $database usando l’ultima connessione aperta mysql_select_db($database, $connessione); – Seleziona il database $database connessione $connessione usando Tecnologie di Sviluppo per il WEB la $ris= mysql_query($query, $connessione); – Invia la query $query al database usando la connessione $connessione 21 Database: tsw Tecnologie di Sviluppo per il WEB 22 Esempio – 1 struttura <?php /* Connessione al database */ $connessione = mysql_connect("localhost", “utenteTsw", "corsotsw") or die("Connessione non riuscita"); echo "<h2>Connessione Riuscita</h2>"; tabella: studenti /* Selezione del database */ mysql_select_db("studenti") or die("Selezione del database non riuscita"); echo "<h2>Database Selezionato</h2>"; Tecnologie di Sviluppo per il WEB 23 Tecnologie di Sviluppo per il WEB 24 Esempio – 2 Esempio con errore …. /* Esecuzione di una query SQL */ $query = "SELECT * FROM studenti"; $risultato = mysql_query($query) or die("<h2 style=\"color:red\"> Query fallita</h2>"); echo "<h2>Query Riuscita</h2>"; ?> /* Esecuzione di una query SQL */ $query = "SELECT * FROM dati"; $risultato = mysql_query($query) or die("Query fallita"); echo "<h2>Query Riuscita</h2>"; ?> Tecnologie di Sviluppo per il WEB 25 Con Si usano mysql_free_result($risultato); 26 Accedere ai risultati di una query Liberare risorse e chiudere la connessione Tecnologie di Sviluppo per il WEB liberiamo le risorse del sistema occupate dal risultato della nostra query Mentre con mysql_close($connessione); chiudiamo la connessione al database; $connessione è opzionale: se manca, verrà terminata l' ultima connessione aperta Tecnologie di Sviluppo per il WEB 27 – – – – mysql_fetch_row($risultato) restituiscono mysql_fetch_array($risultato) righe mysql_fetch_object($risultato) mysql_result($risultato, $indice/$nome) • restituisce un singolo campo – mysql_data_seek($risultato, $numRiga) • sposta il puntatore alla riga indicata Tecnologie di Sviluppo per il WEB 28 mysql_fetch_row mysql_fetch_array Restituisce una riga di dati dal risultato specificato come parametro Prende due parametri – il primo è il risultato dell’invocazione di mysql_query ($query) – il secondo è una costante e specifica la “forma” dell’array – Restituisce NULL se non ci sono più righe nella tabella ($risultato) La riga è restituita come un array • Possiamo non specificarlo indice 0 – L’array parte dall' Il primo elemento dell’array contiene il primo campo Tecnologie di Sviluppo per il WEB 29 Costanti di mysql_fetch_array – Le colonne risultanti dalla query sono restituite in un array avente un indice numerico per i campi. Questo indice inizia da 0 (il primo campo del risultato) MYSQL_ASSOC – Le colonne risultanti dalla query sono restituite in un array avente il nome del campo come indice dell' array MYSQL_BOTH – Le colonne risultanti dalla query sono restituite in un array avente sia un indice numerico sia un indice costituito dal nome del campo Tecnologie di Sviluppo per il WEB Tecnologie di Sviluppo per il WEB 30 Esempio – 1 MYSQL_NUM (valore di default) La funzione restituisce NULL se non ci sono più righe nella tabella – In genere, la funzione viene inserita come condizione di un ciclo while 31 echo "<table>"; while($riga=mysql_fetch_row($risultato)){ echo "<tr><td>".$riga[0]."</td><td>"; echo $riga[1]."</td><td>".$riga[2]."</td></tr>"; } echo("</table>"); Tecnologie di Sviluppo per il WEB ESEMPIO 32 Pattern comune per accesso a DB Esempio – 2 echo "<h2>Risultato</h2>"; echo("<table>"); while($riga = mysql_fetch_array($risultato, MYSQL_BOTH)) { echo "<tr><td>".$riga[0]."</td><td>"; echo $riga[Nome]."</td><td>".$riga[2]; echo "</td></tr>"; } echo("</table>"); Tecnologie di Sviluppo per il WEB $cn = mysql_connect($host, $user, $password ); mysql_select_db($database); $query = " …. "; $risultato = mysql_query($query); while ($riga = mysql_fetch_array($risultato)) { // Elaborazione risultato foreach($riga as $campo => $valore) // Fare qualcosa con $campo e $valore } mysql_free_result($risultato); mysql_close($cn); 33 Altro modo per accedere ai dati Tecnologie di Sviluppo per il WEB 34 Quoting automatico di parametri for($i=0; $i<mysql_num_rows($risultato); $i++) { mysql_data_seek($risultato, $i) //Elaborazione della riga corrente $riga=mysql_fetch_row($risultato); //Utilizzo dei dati estrapolati foreach($riga as $campo => $valore) La configurazione di default di PHP chiama automaticamente la funzione addslashes sui cookie e sui parametri ricevuti con GET o POST Questa funzione automaticamente aggiunge un backslash (\) prima delle virgolette semplici, virgolette doppie e slash (/) Ciò è dovuto al fatto che in questo modo è più facile usare parametri di un modulo in una query ad un database , " e / creano problemi nelle query – I caratteri ' } Tecnologie di Sviluppo per il WEB 35 Tecnologie di Sviluppo per il WEB 36 Esempio Rimuovere il backslash (\) Se il parametro $editore di un modulo vale O' Reilly, allora esso viene convertito automaticamente in O\' Reilly Così possiamo usarlo direttamente nella seguente query $query = "(SELECT * FROM LIBRI WHERE EDITORE =' $editore' ) "; che diventerà (SELECT * FROM LIBRI WHERE EDITORE =' O\' Reilly' ) Tecnologie di Sviluppo per il WEB Dopo aver letto i parametri di un modulo è conveniente rimuovere i backslash se i valori dei parametri non devono essere inseriti in un database. Usiamo la funzione stripslashes Se il nostro script lavora con molti parametri di tipo stringa è meglio scrivere una funzione ad hoc come la funzione seguente – Assumiamo che METHOD=GET 37 Tecnologie di Sviluppo per il WEB Esempi di funzioni MySQL – 1 function parametro_grezzo($nome) { return ini_get(' magic_quotes_gpc' ) ? stripslashes($_GET[$nome]) : $_GET[$nome]; } Utilizzo: mysql_affected_rows – Ottiene il numero di righe coinvolte nelle precedenti operazioni MySQL mysql_change_user utente della connessione attiva – Cambia l' mysql_close – Chiude una connessione MySQL mysql_connect $cognome = parametro_grezzo(' cog' ); L’opzione magic_quotes_gpc abilitata in php.ini istruisce PHP ad invocare automaticamente addslashes 38 – Apre una connessione ad un server MySQL mysql_create_db – Crea un database MySQL mysql_data_seek – Muove il puntatore interno del risultato Tecnologie di Sviluppo per il WEB 39 Tecnologie di Sviluppo per il WEB 40 Esempi di funzioni MySQL – 2 Esempi di funzioni MySQL – 3 mysql_query mysql_fetch_assoc – Carica una riga del risultato come array associativo mysql_fetch_field – Ottiene informazioni sulla colonna da un risultato e le restituisce come oggetto mysql_list_dbs – Elenca i database disponibili sul server MySQL mysql_list_tables – Invia una query MySQL mysql_drop_db – Elimina (cancella) un database MySQL mysql_errno – Restituisce il valore numerico del messaggio di errore della precedente operazione MySQL mysql_error – Restituisce il testo del messagio di errore della precedente operazione MySQL mysql_fetch_array – Elenca le tabelle presenti in un database MySQL – Carica una riga del risultato come un array associativo, un array numerico o entrambe. Tecnologie di Sviluppo per il WEB 41 mysql_field_name – Restituisce il nome del campo Tecnologie di Sviluppo per il WEB 42