Accesso a database

PHP – 5
Accesso a database
PHP ed i database
 PHP
funziona con molti database
relazionali che includono:
– Oracle
– Access
– Postgres
– SQL Server
– MySQL
 Useremo
MySQL poiché è semplice da
usare, gratuito e molto popolare
Tecnologie di Sviluppo per il WEB
2
Database e tabelle
 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
3
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
PHP
Script
Send
SQL Query
Query
Results
Tecnologie di Sviluppo per il WEB
MySQL
Database
4
Creare un’istanza di un 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)
 Usiamo
PhpMyAdmin oppure...
Tecnologie di Sviluppo per il WEB
5
Inserimento di un utente
 mysql
-u root
– 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@'%'....
Tecnologie di Sviluppo per il WEB
6
Creazione di DB
mysql -u utenteTsw -p
 CREATE DATABASE studenti;
– Una sola volta !
 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

FIELDS TERMINATED BY ';' ;

Tecnologie di Sviluppo per il WEB
7
LABORATORIO
 leggete
come fare nella sezione altro del
sito del corso:
– Manuale di configurazione DB
Tecnologie di Sviluppo per il WEB
8
SQL


Possiamo usare PHP per passare dei
comandi ad un database MySQL.
Questi comandi usano SQL (Structured
Query Language) per interrogare il database
– 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.
Tecnologie di Sviluppo per il WEB
9
SQL di base
I
quattro comandi SQL su cui ci
concentreremo sono:
– 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
10
Esempio di Select – 1
 Supponiamo
di avere la seguente
tabella chiamata students
Tecnologie di Sviluppo per il WEB
11
Esempio di Select – 2
 La
query
SELECT surname,email FROM students
restituisce la seguente tabella
Tecnologie di Sviluppo per il WEB
12
Altri usi di SELECT – 1
delimitatore
di testo
 SELECT
surname FROM students
WHERE degree_code='6500'
– Seleziona dalla tabella students tutti i
cognomi che hanno un codice pari a 6500
 SELECT
* FROM students WHERE
degree_code='6500' OR
surname='Faye'
– Seleziona dalla tabella students tutti i
record con un codice pari a 6500 oppure
che hanno cognome Faye
Tecnologie di Sviluppo per il WEB
13
Altri usi di SELECT – 2
 SELECT
* FROM students WHERE
forename LIKE 'sa%'
– Seleziona dalla tabella students tutti i
record che hanno un nome (forename) che
inizia per “sa”
– Usando LIKE '%sa' avremmo selezionato
tutti i record con forename che finiscono
per “sa”
– Usando
LIKE
'%sa%'
avremmo
selezionato tutti i record con forename
contenenti “sa”
Tecnologie di Sviluppo per il WEB
14
DELETE

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
15
INSERT
 Per
inserire record in una tabella
dobbiamo fornire il nome dei campi ed i
valori ad essi associati.
– 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
16
UPDATE

UPDATE students SET forename='Peter'
WHERE reg_number=981234

Cambia in “Peter” il valore del campo
forename del record che ha il campo
reg_number pari 981234
Tecnologie di Sviluppo per il WEB
17
Schema generale di interrogazione
 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
Connessione a mysql

La funzione PHP che useremo per la
connessione a MySQL è:
$connessione =
mysql_connect($host, $user, $password );

I parametri sono:
– $host
• l’indirizzo del server su cui gira MySQL
• in lab.: 192.168.7.40
– Si può usare un client 192.168.7.40/phpmyadmin
– $user
• identificativo dell’utente del DBMS che intendiamo usare
per la connessione
• in lab: reti
– $password
• password associata all’utente
• in lab: reti Tecnologie di Sviluppo per il WEB
19
Selezione del database

mysql_select_db($database);
– Seleziona il database $database usando l’ultima
connessione aperta
– in lab: TSW-Parente
• Si creano tabelle con la convenzione per i nomi:
– USERNAME_NOME_TABELLA

mysql_select_db($database, $connessione);
– Seleziona il database $database
connessione $connessione
Tecnologie di Sviluppo per il WEB
usando
la
20
Invio della query a mysql

$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

$ris= mysql_query($query, $connessione);
– Invia la query $query al database usando la
connessione $connessione
Tecnologie di Sviluppo per il WEB
21
Database: tsw
struttura
tabella: studenti
Tecnologie di Sviluppo per il WEB
22
Esempio – 1
<?php
/* Connessione al database */
$connessione =
mysql_connect("localhost", “corsoTsw", "tsw") or
die("Connessione non riuscita");
echo "<h2>Connessione Riuscita</h2>";
/* 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
Esempio – 2
/* 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
24
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>";
?>
Tecnologie di Sviluppo per il WEB
25
Liberare risorse e chiudere la connessione

Con
mysql_free_result($risultato);

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
26
Accedere ai risultati di una query
 Si
–
–
–
–
usano
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
27
mysql_fetch_row
 Restituisce
una riga di dati dal risultato
specificato come parametro
– Restituisce NULL se non ci sono più righe nella
tabella ($risultato)
 La
riga è restituita come un array
– L’array parte dall'indice 0
 Il
primo elemento dell’array contiene il
primo campo
Tecnologie di Sviluppo per il WEB
28
mysql_fetch_array
 Prende
due parametri
– il primo è il risultato dell’invocazione di
mysql_query ($query)
– il secondo è una costante e specifica la
“forma” dell’array (sl. successiva)
• Possiamo non specificarlo

La funzione restituisce NULL se non ci sono
più righe nella tabella
– In genere, la funzione viene inserita come
condizione di un ciclo while
Tecnologie di Sviluppo per il WEB
29
Costanti di mysql_fetch_array

MYSQL_NUM (valore di default)
– 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
30
Esempio – 1
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
31
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
32
Pattern comune per accesso a DB
$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);
Tecnologie di Sviluppo per il WEB
33
Altro modo per accedere ai dati
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)
}
Tecnologie di Sviluppo per il WEB
34
Quoting automatico di parametri




La configurazione di default di PHP chiama
automaticamente la funzione addslashes sui
cookie e sui parametri ricevuti con GET o
POST
– Detta: magic quotes
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
– I caratteri ', " e / creano problemi nelle query
Al momento è deprecata e sarà rimossa in PHP6 (si
dovrebbero usare meccanismi di escape fatti ad-hoc)
Tecnologie di Sviluppo per il WEB
35
Esempio
 Se
la variabile $editore proveniente da
un parametro di 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
36
Rimuovere il backslash (\)
 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
Tecnologie di Sviluppo per il WEB
37
function parametro_grezzo($nome) {
return ini_get('magic_quotes_gpc')
? stripslashes($_GET[$nome])
: $_GET[$nome];
}
 ini_get restituisce il valore di una
opzione come una stringa.
 Utilizzo:
$cognome = parametro_grezzo('cog');
L’opzione magic_quotes_gpc abilitata in
php.ini istruisce PHP ad invocare
automaticamente addslashes
Tecnologie di Sviluppo per il WEB
38
Esempio
<?php
echo get_magic_quotes_gpc();
echo $_POST['lastname'];
// 1
// O\'reilly
echo addslashes($_POST['lastname']); // O\\\'reilly
if (!get_magic_quotes_gpc()) {
$lastname = addslashes($_POST['lastname']);
} else {
$lastname = $_POST['lastname'];
}
echo $lastname; // O\'reilly
$sql = "INSERT INTO lastnames VALUES ('$lastname')";
?>
Tecnologie di Sviluppo per il WEB
39
Esempi di funzioni MySQL – 1

mysql_affected_rows
– Ottiene il numero di righe coinvolte nelle precedenti
operazioni MySQL

mysql_change_user
– Cambia l'utente della connessione attiva

mysql_close
– Chiude una connessione MySQL

mysql_connect
– 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
40
Esempi di funzioni MySQL – 2

mysql_query
– 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
– Carica una riga del risultato come un array associativo, un
array numerico o entrambe.
Tecnologie di Sviluppo per il WEB
41
Esempi di funzioni MySQL – 3

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
– Elenca le tabelle presenti in un database MySQL

mysql_field_name
– Restituisce il nome del campo
Tecnologie di Sviluppo per il WEB
42