Laboratorio Di Basi Di Dati 11 P H P Interazione Con I D B M S
-
Upload
guestbe916c -
Category
Technology
-
view
829 -
download
3
Transcript of Laboratorio Di Basi Di Dati 11 P H P Interazione Con I D B M S
1
17/01/2006 Basi di Dati e Laboratorio 1
Corso di Basi di Dati e Laboratorio
PHP DB Alfio Ferrara – Stefano Montanelli
A.A. 2005/2006 Basi di Dati e Laboratorio 2
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 3
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)
2
A.A. 2005/2006 Basi di Dati e Laboratorio 4
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 5
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 6
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.
3
A.A. 2005/2006 Basi di Dati e Laboratorio 7
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 8
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 9
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
4
A.A. 2005/2006 Basi di Dati e Laboratorio 10
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 11
Gestione dei risultati – 1
• E’ possibile farsi restituire i risultati di una SELECT come un array
• Funzione mysql_fetch_arrayarray 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 12
Gestione dei risultati – 2
• Esempio
– MYSQL_BOTH$row = array([0] => array(
[0] => “value1”,[1] => “value2”,[‘ID’] => “value1”,[‘TITLE’] => “value2”
))
MYTABLE
value2value1TITLEID
MYSQL_NUM
MYSQL_ASSOC
5
A.A. 2005/2006 Basi di Dati e Laboratorio 13
Gestione dei risultati – 3
• Esempiowhile ($row = mysql_fetch_array($res, MYSQL_ASSOC)) {
printf ("ID: %s Title: %s", $row[‘id’],$row[‘title’]);
}
A.A. 2005/2006 Basi di Dati e Laboratorio 14
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 15
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()
6
A.A. 2005/2006 Basi di Dati e Laboratorio 16
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 17
PostgreSQL – Connessione – 3
ES.$db = pg_connect (“host=localhostuser=test password=hackmedbname=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 18
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, stringquery)
7
A.A. 2005/2006 Basi di Dati e Laboratorio 19
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 20
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 21
Gestione dei risultati – 1
• E’ possibile farsi restituire i risultati di una SELECT come un array
• Funzione pg_fetch_arrayarray pg_fetch_array (resource result
[, int result_type])
• result_type è uno a scelta fra – PGSQL_ASSOC– PGSQL_NUM– PGSQL_BOTH (default)
8
A.A. 2005/2006 Basi di Dati e Laboratorio 22
Gestione dei risultati – 2
• Esempio
– PGSQL_BOTH$row = array([0] => array(
[0] => “value1”,[1] => “value2”,[‘ID’] => “value1”,[‘TITLE’] => “value2”
))
MYTABLE
value2value1TITLEID
PGSQL_NUM
PGSQL_ASSOC
A.A. 2005/2006 Basi di Dati e Laboratorio 23
Gestione dei risultati – 3
• Esempiowhile ($row = pg_fetch_array($res, PGSQL_ASSOC)) {
printf ("ID: %s Title: %s", $row[‘id’],$row[‘title’]);
}
A.A. 2005/2006 Basi di Dati e Laboratorio 24
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 precedentimysql_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 terminedell’esecuzione dello script.
9
A.A. 2005/2006 Basi di Dati e Laboratorio 25
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 26
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 installaree configurare automaticamente pacchettiPEAR
A.A. 2005/2006 Basi di Dati e Laboratorio 27
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’
10
A.A. 2005/2006 Basi di Dati e Laboratorio 28
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 29
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 30
Esecuzione di SQL
• Pear DB ha quattro principali metodi per eseguire statement SQL– query()– limitQuery()– prepare()/execute()– simpleQuery()
11
A.A. 2005/2006 Basi di Dati e Laboratorio 31
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 32
limitQuery
• limitQuery($query, $from, $count, $par=Array())
• Lavora come Query() ad eccezione del fatto che i parametri $from e $countstabiliscono da dove e per quante righe considerare i risultati
A.A. 2005/2006 Basi di Dati e Laboratorio 33
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
12
A.A. 2005/2006 Basi di Dati e Laboratorio 34
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 35
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 36
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’>)
13
A.A. 2005/2006 Basi di Dati e Laboratorio 37
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