Laboratorio Di Basi Di Dati 11 P H P Interazione Con I D B M S
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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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. 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