PHP – 5 - digididattica.it · PHP funziona con molti database relazionali che includono:...

42
PHP – 5 Accesso a database

Transcript of PHP – 5 - digididattica.it · PHP funziona con molti database relazionali che includono:...

Page 1: PHP – 5 - digididattica.it · PHP funziona con molti database relazionali che includono: –Oracle ... si usa Structured Query Language (SQL), per accedere al database PHP Script

PHP – 5

Accesso a database

Page 2: PHP – 5 - digididattica.it · PHP funziona con molti database relazionali che includono: –Oracle ... si usa Structured Query Language (SQL), per accedere al database PHP Script

Tecnologie di Sviluppo per il WEB 2

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

Page 3: PHP – 5 - digididattica.it · PHP funziona con molti database relazionali che includono: –Oracle ... si usa Structured Query Language (SQL), per accedere al database PHP Script

Tecnologie di Sviluppo per il WEB 3

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

Page 4: PHP – 5 - digididattica.it · PHP funziona con molti database relazionali che includono: –Oracle ... si usa Structured Query Language (SQL), per accedere al database PHP Script

Tecnologie di Sviluppo per il WEB 4

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

PHPScript

MySQLDatabase

SendSQL Query

QueryResults

Page 5: PHP – 5 - digididattica.it · PHP funziona con molti database relazionali che includono: –Oracle ... si usa Structured Query Language (SQL), per accedere al database PHP Script

Tecnologie di Sviluppo per il WEB 5

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...

Page 6: PHP – 5 - digididattica.it · PHP funziona con molti database relazionali che includono: –Oracle ... si usa Structured Query Language (SQL), per accedere al database PHP Script

Tecnologie di Sviluppo per il WEB 6

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@'%'....

Page 7: PHP – 5 - digididattica.it · PHP funziona con molti database relazionali che includono: –Oracle ... si usa Structured Query Language (SQL), per accedere al database PHP Script

Tecnologie di Sviluppo per il WEB 7

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 ';' ;

Page 8: PHP – 5 - digididattica.it · PHP funziona con molti database relazionali che includono: –Oracle ... si usa Structured Query Language (SQL), per accedere al database PHP Script

Tecnologie di Sviluppo per il WEB 8

LABORATORIO leggete come fare nella sezione altro del

sito del corso:– Manuale di configurazione DB

Page 9: PHP – 5 - digididattica.it · PHP funziona con molti database relazionali che includono: –Oracle ... si usa Structured Query Language (SQL), per accedere al database PHP Script

Tecnologie di Sviluppo per il WEB 9

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.

Page 10: PHP – 5 - digididattica.it · PHP funziona con molti database relazionali che includono: –Oracle ... si usa Structured Query Language (SQL), per accedere al database PHP Script

Tecnologie di Sviluppo per il WEB 10

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

Page 11: PHP – 5 - digididattica.it · PHP funziona con molti database relazionali che includono: –Oracle ... si usa Structured Query Language (SQL), per accedere al database PHP Script

Tecnologie di Sviluppo per il WEB 11

Esempio di Select – 1 Supponiamo di avere la seguente

tabella chiamata students

Page 12: PHP – 5 - digididattica.it · PHP funziona con molti database relazionali che includono: –Oracle ... si usa Structured Query Language (SQL), per accedere al database PHP Script

Tecnologie di Sviluppo per il WEB 12

Esempio di Select – 2 La query

SELECT surname,email FROM students

restituisce la seguente tabella

Page 13: PHP – 5 - digididattica.it · PHP funziona con molti database relazionali che includono: –Oracle ... si usa Structured Query Language (SQL), per accedere al database PHP Script

Tecnologie di Sviluppo per il WEB 13

Altri usi di SELECT – 1 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

delimitatore di testo

Page 14: PHP – 5 - digididattica.it · PHP funziona con molti database relazionali che includono: –Oracle ... si usa Structured Query Language (SQL), per accedere al database PHP Script

Tecnologie di Sviluppo per il WEB 14

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”

Page 15: PHP – 5 - digididattica.it · PHP funziona con molti database relazionali che includono: –Oracle ... si usa Structured Query Language (SQL), per accedere al database PHP Script

Tecnologie di Sviluppo per il WEB 15

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.

Page 16: PHP – 5 - digididattica.it · PHP funziona con molti database relazionali che includono: –Oracle ... si usa Structured Query Language (SQL), per accedere al database PHP Script

Tecnologie di Sviluppo per il WEB 16

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

Page 17: PHP – 5 - digididattica.it · PHP funziona con molti database relazionali che includono: –Oracle ... si usa Structured Query Language (SQL), per accedere al database PHP Script

Tecnologie di Sviluppo per il WEB 17

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

Page 18: PHP – 5 - digididattica.it · PHP funziona con molti database relazionali che includono: –Oracle ... si usa Structured Query Language (SQL), per accedere al database PHP Script

Tecnologie di Sviluppo per il WEB 18

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

Page 19: PHP – 5 - digididattica.it · PHP funziona con molti database relazionali che includono: –Oracle ... si usa Structured Query Language (SQL), per accedere al database PHP Script

Tecnologie di Sviluppo per il WEB 19

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

Page 20: PHP – 5 - digididattica.it · PHP funziona con molti database relazionali che includono: –Oracle ... si usa Structured Query Language (SQL), per accedere al database PHP Script

Tecnologie di Sviluppo per il WEB 20

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 usando la

connessione $connessione

Page 21: PHP – 5 - digididattica.it · PHP funziona con molti database relazionali che includono: –Oracle ... si usa Structured Query Language (SQL), per accedere al database PHP Script

Tecnologie di Sviluppo per il WEB 21

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

Page 22: PHP – 5 - digididattica.it · PHP funziona con molti database relazionali che includono: –Oracle ... si usa Structured Query Language (SQL), per accedere al database PHP Script

Tecnologie di Sviluppo per il WEB 22

Database: tswstruttura

tabella: studenti

Page 23: PHP – 5 - digididattica.it · PHP funziona con molti database relazionali che includono: –Oracle ... si usa Structured Query Language (SQL), per accedere al database PHP Script

Tecnologie di Sviluppo per il WEB 23

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>";

Page 24: PHP – 5 - digididattica.it · PHP funziona con molti database relazionali che includono: –Oracle ... si usa Structured Query Language (SQL), per accedere al database PHP Script

Tecnologie di Sviluppo per il WEB 24

Esempio – 2/* Esecuzione di una query SQL */ $query = "SELECT * FROM dati"; $risultato = mysql_query($query) or

die("Query fallita");echo "<h2>Query Riuscita</h2>";?>

Page 25: PHP – 5 - digididattica.it · PHP funziona con molti database relazionali che includono: –Oracle ... si usa Structured Query Language (SQL), per accedere al database PHP Script

Tecnologie di Sviluppo per il WEB 25

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>";?>

Page 26: PHP – 5 - digididattica.it · PHP funziona con molti database relazionali che includono: –Oracle ... si usa Structured Query Language (SQL), per accedere al database PHP Script

Tecnologie di Sviluppo per il WEB 26

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

Page 27: PHP – 5 - digididattica.it · PHP funziona con molti database relazionali che includono: –Oracle ... si usa Structured Query Language (SQL), per accedere al database PHP Script

Tecnologie di Sviluppo per il WEB 27

Accedere ai risultati di una query

Si usano– mysql_fetch_row($risultato) – mysql_fetch_array($risultato) – mysql_fetch_object($risultato)– mysql_result($risultato, $indice/$nome)

• restituisce un singolo campo

– mysql_data_seek($risultato, $numRiga)• sposta il puntatore alla riga indicata

restituiscono righe

Page 28: PHP – 5 - digididattica.it · PHP funziona con molti database relazionali che includono: –Oracle ... si usa Structured Query Language (SQL), per accedere al database PHP Script

Tecnologie di Sviluppo per il WEB 28

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

Page 29: PHP – 5 - digididattica.it · PHP funziona con molti database relazionali che includono: –Oracle ... si usa Structured Query Language (SQL), per accedere al database PHP Script

Tecnologie di Sviluppo per il WEB 29

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

Page 30: PHP – 5 - digididattica.it · PHP funziona con molti database relazionali che includono: –Oracle ... si usa Structured Query Language (SQL), per accedere al database PHP Script

Tecnologie di Sviluppo per il WEB 30

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

Page 31: PHP – 5 - digididattica.it · PHP funziona con molti database relazionali che includono: –Oracle ... si usa Structured Query Language (SQL), per accedere al database PHP Script

Tecnologie di Sviluppo per il WEB 31

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>");

ESEMPIO

Page 32: PHP – 5 - digididattica.it · PHP funziona con molti database relazionali che includono: –Oracle ... si usa Structured Query Language (SQL), per accedere al database PHP Script

Tecnologie di Sviluppo per il WEB 32

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>");

Page 33: PHP – 5 - digididattica.it · PHP funziona con molti database relazionali che includono: –Oracle ... si usa Structured Query Language (SQL), per accedere al database PHP Script

Tecnologie di Sviluppo per il WEB 33

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 risultatoforeach($riga as $campo => $valore)

// Fare qualcosa con $campo e $valore}mysql_free_result($risultato);mysql_close($cn);

Page 34: PHP – 5 - digididattica.it · PHP funziona con molti database relazionali che includono: –Oracle ... si usa Structured Query Language (SQL), per accedere al database PHP Script

Tecnologie di Sviluppo per il WEB 34

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 estrapolatiforeach($riga as $campo => $valore)

}

Page 35: PHP – 5 - digididattica.it · PHP funziona con molti database relazionali che includono: –Oracle ... si usa Structured Query Language (SQL), per accedere al database PHP Script

Tecnologie di Sviluppo per il WEB 35

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)

Page 36: PHP – 5 - digididattica.it · PHP funziona con molti database relazionali che includono: –Oracle ... si usa Structured Query Language (SQL), per accedere al database PHP Script

Tecnologie di Sviluppo per il WEB 36

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

Page 37: PHP – 5 - digididattica.it · PHP funziona con molti database relazionali che includono: –Oracle ... si usa Structured Query Language (SQL), per accedere al database PHP Script

Tecnologie di Sviluppo per il WEB 37

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

Page 38: PHP – 5 - digididattica.it · PHP funziona con molti database relazionali che includono: –Oracle ... si usa Structured Query Language (SQL), per accedere al database PHP Script

Tecnologie di Sviluppo per il WEB 38

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

Page 39: PHP – 5 - digididattica.it · PHP funziona con molti database relazionali che includono: –Oracle ... si usa Structured Query Language (SQL), per accedere al database PHP Script

Tecnologie di Sviluppo per il WEB 39

Esempio<?php

echo get_magic_quotes_gpc(); // 1

echo $_POST['lastname']; // 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')";

?>

Page 40: PHP – 5 - digididattica.it · PHP funziona con molti database relazionali che includono: –Oracle ... si usa Structured Query Language (SQL), per accedere al database PHP Script

Tecnologie di Sviluppo per il WEB 40

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

Page 41: PHP – 5 - digididattica.it · PHP funziona con molti database relazionali che includono: –Oracle ... si usa Structured Query Language (SQL), per accedere al database PHP Script

Tecnologie di Sviluppo per il WEB 41

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.

Page 42: PHP – 5 - digididattica.it · PHP funziona con molti database relazionali che includono: –Oracle ... si usa Structured Query Language (SQL), per accedere al database PHP Script

Tecnologie di Sviluppo per il WEB 42

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