Laboratorio Di Basi Di Dati 11 P H P Interazione Con I D B M S

1,036 views

Published on

Published in: Technology
  • Be the first to comment

  • Be the first to like this

Laboratorio Di Basi Di Dati 11 P H P Interazione Con I D B M S

  1. 1. Corso di Basi di Dati e Laboratorio PHP DB Alfio Ferrara – Stefano Montanelli 17/01/2006 Basi di Dati e Laboratorio 1 PHP e DBMS – 1 • L’uso dei DBMS con PHP si basa su alcuni semplici elementi fondamentali – Funzioni di connessione ai database e handle di connessione – Funzioni per inviare comandi SQL ai database – Funzioni per scorrere i risultati delle query A.A. 2005/2006 Basi di Dati e Laboratorio 2 PHP e DBMS – 2 • Sono disponibili librerie di astrazione sui DBMS che permettono (entro limiti dipendenti dall’implementazione) di scrivere codice indipendente dal DBMS utilizzato. (vedi Pear) A.A. 2005/2006 Basi di Dati e Laboratorio 3 1
  2. 2. MySQL • Connessioni ad un database MySQL – mysql_connect (semplice) – mysql_pconnect (persistente) – mysql_select_db – mysql_query – mysql_fetch_array – mysql_free_result – mysql_close A.A. 2005/2006 Basi di Dati e Laboratorio 4 MySQL – Connessione – 1 • 2 tipi di connessione – Semplice • Viene chiusa alla terminazione dello script o tramite l’istruzione mysql_close() – Persistente • Utilizza, se presente, una connessione precedentemente stabilita • Non viene chiusa alla terminazione dello script • Non viene chiusa dalla funzione mysql_close() A.A. 2005/2006 Basi di Dati e Laboratorio 5 MySQL – Connessione – 2 • Esempi di connessione • Sintassi resource mysql_connect ([string server [, string username[, string password [, bool new_link[, int client_flags]]]]]) – Es. $db = mysql_connect (‘localhost’, ‘dbuser’, ‘dbpassword’); – L’handle ottenuto ($db) verrà utilizzato per le successive chiamate per indicare la connessione sulla quale si desidera operare. A.A. 2005/2006 Basi di Dati e Laboratorio 6 2
  3. 3. MySQL – Connessione – 3 • Dopo aver stabilito la connessione, occorre selezionare il database su cui si desidera operare bool mysql_select_db (string database_name [, resource link_identifier]) mysql_select_db(‘mydb’, $db) A.A. 2005/2006 Basi di Dati e Laboratorio 7 MySQL – Interazione • Tramite il comando mysql_query() è possibile mandare comandi SQL al database. Questo permette di – Inserire dati – Modificare dati – Cancellare dati resource mysql_query (string query [, resource link_identifier]) A.A. 2005/2006 Basi di Dati e Laboratorio 8 MySQL – Select – 1 • Per selezionare i dati da una tabella si invia al server l’opportuna query SQL • Si riceverà un handle che identifica il risultato ottenuto • Tramite l’handle sarà possibile scorrere i risultati restituiti dal database • Per sapere quante sono le tuple interessate dal comando SQL si utilizzano le funzioni mysql_num_rows() per SELECT e mysql_affected_rows() per INSERT, DELETE e UPDATE A.A. 2005/2006 Basi di Dati e Laboratorio 9 3
  4. 4. MySQL – Select – 2 • Esempio $query = ‘SELECT * FROM mytable’; $res = mysql_query($query, $db); if ($res){ echo ‘Trovati ‘.mysql_num_rows($res).’ record’; } A.A. 2005/2006 Basi di Dati e Laboratorio 10 Gestione dei risultati – 1 • E’ possibile farsi restituire i risultati di una SELECT come un array • Funzione mysql_fetch_array array mysql_fetch_array (resource result [, int result_type]) • result_type è uno a scelta fra – MYSQL_ASSOC – MYSQL_NUM – MYSQL_BOTH (default) A.A. 2005/2006 Basi di Dati e Laboratorio 11 Gestione dei risultati – 2 • Esempio MYTABLE ID TITLE value1 value2 – MYSQL_BOTH $row = array([0] => array( [0] => “value1”, MYSQL_NUM [1] => “value2”, [‘ID’] => “value1”, MYSQL_ASSOC [‘TITLE’] => “value2” )) A.A. 2005/2006 Basi di Dati e Laboratorio 12 4
  5. 5. Gestione dei risultati – 3 • Esempio while ($row = mysql_fetch_array($res, MYSQL_ASSOC)) { printf (quot;ID: %s Title: %squot;, $row[‘id’], $row[‘title’]); } A.A. 2005/2006 Basi di Dati e Laboratorio 13 PostgreSQL • Connessioni ad un database PostgreSQL – pg_connect (semplice) – pg_pconnect (persistente) – pg_query – pg_fetch_array – pg_free_result – pg_close A.A. 2005/2006 Basi di Dati e Laboratorio 14 PostgreSQL – Connessione – 1 • 2 tipi di connessione – Semplice • Viene chiusa alla terminazione dello script o tramite l’istruzione pg_close() – Persistente • Utilizza, se presente, una connessione precedentemente stabilita • Non viene chiusa alla terminazione dello script • Non viene chiusa dalla funzione pg_close() A.A. 2005/2006 Basi di Dati e Laboratorio 15 5
  6. 6. PostgreSQL – Connessione – 2 • Esempi di connessione • Sintassi resource pg_connect (string connection_string [, int connection_type]) – La stringa di connessione può essere una composizione variabile dei seguenti elementi: host=<nomehost> port=<numeroporta> dbname=<nomedb> user=<username> password=<password> – Il parametro connection_type viene usato per forzare esplicitamente una nuova connessione A.A. 2005/2006 Basi di Dati e Laboratorio 16 PostgreSQL – Connessione – 3 ES. $db = pg_connect (“host=localhost user=test password=hackme dbname=testdb”); – I diversi parametri hanno tutti un valore di default. Trovate il valore per ognuno. – L’handle ottenuto ($db) verrà utilizzato per le successive chiamate per indicare la connessione sulla quale si desidera operare A.A. 2005/2006 Basi di Dati e Laboratorio 17 PostgreSQL – Interazione • Tramite il comando pg_query() è possibile mandare comandi SQL al database Questo permette di – Inserire dati – Modificare dati – Cancellare dati resource pg_query (resource connection, string query) A.A. 2005/2006 Basi di Dati e Laboratorio 18 6
  7. 7. PostgreSQL – Select – 1 • Per selezionare i dati da una tabella si invia al server l’opportuna query SQL • Si riceverà un handle che identifica il risultato ottenuto • Tramite l’handle sarà possibile scorrere i risultati restituiti dal database • Per sapere quante sono le tuple interessate dal comando SQL si utilizzano le funzioni pg_num_rows() per SELECT e pg_affected_rows() per INSERT, DELETE e UPDATE A.A. 2005/2006 Basi di Dati e Laboratorio 19 PostgreSQL – Select – 2 • Esempio $query = ‘SELECT * FROM mytable’; $res = pg_query($db, $query); if ($res){ echo ‘Trovati ‘.pg_num_rows($res).’ record’; } A.A. 2005/2006 Basi di Dati e Laboratorio 20 Gestione dei risultati – 1 • E’ possibile farsi restituire i risultati di una SELECT come un array • Funzione pg_fetch_array array pg_fetch_array (resource result [, int result_type]) • result_type è uno a scelta fra – PGSQL_ASSOC – PGSQL_NUM – PGSQL_BOTH (default) A.A. 2005/2006 Basi di Dati e Laboratorio 21 7
  8. 8. Gestione dei risultati – 2 • Esempio MYTABLE ID TITLE value1 value2 – PGSQL_BOTH $row = array([0] => array( [0] => “value1”, PGSQL_NUM [1] => “value2”, [‘ID’] => “value1”, PGSQL_ASSOC [‘TITLE’] => “value2” )) A.A. 2005/2006 Basi di Dati e Laboratorio 22 Gestione dei risultati – 3 • Esempio while ($row = pg_fetch_array($res, PGSQL_ASSOC)) { printf (quot;ID: %s Title: %squot;, $row[‘id’], $row[‘title’]); } A.A. 2005/2006 Basi di Dati e Laboratorio 23 Liberare la memoria • In caso di uno script che esegua un numero elevato di query, ognuna delle quali restituisca un elevato numero di tuple, può essere utile liberare progressivamente la memoria utilizzata dalle query precedenti mysql_free_result($res) || pg_free_result($res) Dove $res è un handle di risultato restituito da una mysql_query() o da una pg_query() • La memoria viene comunque liberata al termine dell’esecuzione dello script. A.A. 2005/2006 Basi di Dati e Laboratorio 24 8
  9. 9. Chiusura della connessione • Non strettamente necessaria. Alla fine dello script le connessioni non persistenti ancora aperte vengono chiuse automaticamente. mysql_close($db) || pg_close($db) Dove $db è un’handle di connessione restituito da una mysql_connect() o da una pg_connect() • Le connessioni persistenti invece non vengono chiuse A.A. 2005/2006 Basi di Dati e Laboratorio 25 PEAR • PHP Extension and Application Repository • Offre un insieme di pacchetti di utilità molto ampio – Posta elettronica – XML – Database –… • Disponibilità di un client pear per installare e configurare automaticamente pacchetti PEAR A.A. 2005/2006 Basi di Dati e Laboratorio 26 Le librerie PEAR • Una volta installato un pacchetto PEAR le sue funzionalità solo disponibili come oggetti PHP e librerie di funzioni • Il riferimento alle funzioni PEAR avviene per mezzo dell’istruzione – require_once • Esempio: – require_once ‘DB.php’ A.A. 2005/2006 Basi di Dati e Laboratorio 27 9
  10. 10. PEAR DB • Pear DB offre un insieme di specifiche di accesso ai database generalizzato, capace di prescindere dalle librerie specifiche di supporto ai vari DBMS • I parametri relativi allo specifico DBMS si configurano attraverso il metodo DSN, che adotta il formati URI per la localizzazione del DBMS A.A. 2005/2006 Basi di Dati e Laboratorio 28 DSN • Sintassi: – dbtype://username:password@protocol+hosts/ database?option=value • Esempio: – $dsn = “pgsql://dblab:bdlab@localhost/lab”; – $db = DB::connect($dsn); – Si connette a un database postgres di nome lab su localhost con credenziali (nomeutente:password) dblab:bdlab A.A. 2005/2006 Basi di Dati e Laboratorio 29 Esecuzione di SQL • Pear DB ha quattro principali metodi per eseguire statement SQL – query() – limitQuery() – prepare()/execute() – simpleQuery() A.A. 2005/2006 Basi di Dati e Laboratorio 30 10
  11. 11. Query • query($query,$par=array()) • Restituisce un valore booleano se non ci sono risultati o un oggetto che contiene i risultati dell’interrogazione A.A. 2005/2006 Basi di Dati e Laboratorio 31 limitQuery • limitQuery($query, $from, $count, $par=Array()) • Lavora come Query() ad eccezione del fatto che i parametri $from e $count stabiliscono da dove e per quante righe considerare i risultati A.A. 2005/2006 Basi di Dati e Laboratorio 32 Prepare e execute • prepare($query) – Pre-analizza la query senza però inviarla e eseguirla effettivamente sulla base di dati • execute($s,$data=array()) – Esegue la query pre-analizzata $s con i dati contenuti in $data A.A. 2005/2006 Basi di Dati e Laboratorio 33 11
  12. 12. simpleQuery • simpleQuery($query) • Usata per statement senza valori di ritorno, come ad esempio gli statement DDL • Esempio: – $db->simpleQuery(“CREATE TABLE …”); A.A. 2005/2006 Basi di Dati e Laboratorio 34 Recupero dei dati • Modalità: – DB_FETCHMODE_ORDERED • Restituisce un array indicizzato numericamente – DB_FETCHMODE_ASSOC • Restituisce un array associativo – DB_FETCHMODE_OBJECT • Restituisce un oggetto A.A. 2005/2006 Basi di Dati e Laboratorio 35 Configurazione • La modalità di recupero può essere configurata • Per tutte le query – $db->setFetchMode(<MODALITA’>) • Per una query specifica – $riga = $result->fetchRow(<MODALITA’>) – $result->fetchInto($riga, <MODALITA’>) A.A. 2005/2006 Basi di Dati e Laboratorio 36 12
  13. 13. Uso di classi personalizzate • Se si usa setFetchMode() è possibile specificare una classe definita dallo script per la memorizzazione dei risultati • L’unico vincolo è che la classe personalizzata abbia un solo array come argomento del costruttore • Per i nomi delle proprietà si fa riferimento ai nomi dei campi del DB A.A. 2005/2006 Basi di Dati e Laboratorio 37 13

×