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

13
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)

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

Page 1: 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)

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

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.

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

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

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

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

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

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()

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

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)

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

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)

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

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.

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

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’

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

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()

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

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

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

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’>)

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

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