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