Un database è una struttura logica con la quale noi organizziamo i dati facenti parte del "mondo " che vogliamo descrivere. Per fare un esempio, se vogliamo descrivere il mondo degli utenti di una data compagnia telefonica, questi saranno organizzati in un database che comunemente chiamiamo "elenco telefonico" il cui supporto è solitamente cartaceo, che presenta tra le tabelle che lo costituiscono quella caratterizzata dagli attributi Nome,Cognome,Indirizzo, numero telefonico.
Noi siamo o dovremmo essere degli informatici e quindi useremo come supporto un computer e utilizzeremo per memorizzare i dati un DBMS cioè un "database management system".
esistono diversi DBMS commerciali ed open source in commercio e si differenziano principalmente per il modello dei dati su cui si basano:
- Gerarchico;
- Reticolare;
- Relazionale.
La recente storia dello sviluppo tecnologico ha visto il prevalere del modello relazionale sugli altri modelli ed il fiorire di proposte di DBMS con caratteristiche sempre più avanzate e complete.
Per descrivere in maniera molto semplicistica il modello relazionale possiamo affermare che questo ci consente di rappresentare la realtà che vogliamo descrivere attraverso l'utilizzo di tabelle in relazione tra di loro.
Le tabelle saranno ovviamente costituite da colonne e da righe.
Le colonne rappresentano le caratteristiche dell'elemento che vogliamo memorizzare, i così detti attributi, (per rifarci all'esempio visto in precedenza gli attributi dell'elemento utente telefonico sono nome, cognome, indirizzo, numero telefonico).
Le righe rappresentano gli elementi dell'insieme che rappresentiamo con la tabella (nel nostro caso gli utenti telefonici, un utente una riga)
Nome |
Cognome |
Indirizzo |
Numero telefono |
Mario |
Rossi |
Via dei platani, 5 |
06 5611892 |
Paolo |
Bianchi |
Via delle rose, 4 |
06 7834567 |
Carlo |
Neri |
Via dei ciclamini, 23 |
06 3456780 |
Un database può contenere più di una tabella con strutture differenti. Queste tabelle possono però avere informazioni incrociate e correlate da un certo legame concettuale. Questi legami li possiamo definire attraverso relazioni (da cui il nome database relazionale).
Una delle caratteristiche più apprezzate del PHP, è l'estrema semplicità e il grande numero di funzioni con cui è possibile interfacciarsi con la più gran varieta di motori per database.
Indipendentemente dal motore di database utilizzato, accedere ad un database da un'applicazione, fondamentalmente consiste di tre passi:
Connessione
Viene stabilito il collegamento tra il database e l'applicazione. Il server database può risiedere nella stessa macchina in cui risiede l'applicazione ed è in esecuzione il PHP o su una differente alla quale accederemo tramite rete. La fase di connessione comprende anche la fase di autenticazione, nella quale forniamo al DBMS (database management system) il nostro nome e password.
Interazione
E' la parte in cui noi operiamo sul database secondo le specifiche della nostra applicazione oppure per gestire il database stesso con i tools messi a disposizione da questo.
Possiamo operare sia a livello di schema del database ( per esempio creando, modificando o cancellando tabelle), sia a livello di veri e propri dati (per esempio cancellando, inserendo, modificando righe di tabelle ). per comunicare con il DBMS utilizziamo (di solito) il linguaggio SQL (Structured Query Language) sia per mezzo dei tools forniti dal DBMS sia attraverso le funzioni di accesso incluse nel PHP.
Chiusura della connessione
In quest'ultima fase non facciamo altro che terminare la sessione di lavoro, interrompendo la connessione con il server database. Da questo momento in poi non sarà possibile effettuare altre operazioni sul database a meno di non ripristinare la connessione.
Nel nostro corso utilizzeremo il DBMS MySql vediamone brevemente le caratteristiche principali.
MySQL è un database relazionale server enterprise
Senza scendere in tecnicismi che a volte straripano nel tecno-filosofico, la caratteristica principale di un applicazione enterprise è quella di essere accessibile da moltissimi utenti contemporaneamente e gestire grossi carichi di lavoro. Altri sistemi che forse già conoscerete (quantomeno di fama), considerati enterprise sono Microsoft SQL Server, PostgreSQL, Oracle, Sybase ,IBM DB2.
Cosa non ha MySQL
A MySQL si rinfaccia di non possedere quella serie di elementi professionali e avanzati che altri sistemi enterprise invece hanno. Ad esempio, elementi assenti in MySQL e presenti in altri RDBMS
Nota.
Al momento attuale, tuttavia, MySql tramite le tabelle di tipo INNODB è in grado di fornire supporto alle transazioni.
Se qualcuno si stesse preoccupando di queste mancanze, non tema. Molte novità sono già in fase di sviluppo: MySQL è famoso anche per essere continuamente in fase di evoluzione!
Da questo punto di vista MySQL è considerato probabilmente il più povero tra i suoi parigrado. Tuttavia, dall altro lato della medaglia, è il motivo che fa di MySQL un sistema snello, ordinato, robusto e veloce.
Ora analizzeremo in dettaglio l'implementazione delle fasi di connessione, interazione e chiusura che abbiamo illustrato in precedenza utilizzando come RDBMS di riferimento il già citato MySQL.
Possiamo tranquillamente affermare che tale procedimento è analogo per ciascun motore di database supportato dal PHP.
Per prima cosa è necessario verificare di avere le seguenti informazioni:
una volta essere venuti a conoscenza di queste informazioni, memorizziamole in appositi variabili
// parametri per la connessione al database MySQL
$my_db_host = “localhost” ;
$my_db_name = “dbprova”; # il nome del database a cui vogliamo accedere
$my_db_user = “pippo”;
$my_db_password = “passworddipippo”;
A questo punto possiamo iniziare la nostra sessione di lavoro con MySQL. Le funzioni di MySQL che utilizzeremo per implementare le fasi sopra viste saranno:
Gli argomenti di mysql_connect() sono tre hostname, username e password e sono tutti e tre facoltativi; i valori predefiniti sono localhost per hostname e la stringa vuota per user e password.
In caso di successo della connessione la funzione mysql_connect(), restituisce un intero positivo che ha il significato di identificativo della connessione e che viene usato dalla funzione mysql_query() e da mysql_close() per referenziare il database da accedere.
La restituzione di un valore nullo (che come sappiamo in PHP è equivalente a FALSE) indica il fallimento della connessione.
Esempio:
// provo a connettermi al database
$conn = mysql_connect($my_db_host,$my_db_user, $my_db_password) or die (“non mi posso connettere al server mysql $my_db_name);
Il passo successivo è la selezione del database su cui andremo ad operare. La funzione PHP mysql_select_db() assolve questo compito, essa prevede due parametri il nome del database che si vuole aprire e l'identificativo di connessione risultato della funzione mysql_connect().
Il secondo argomento è facoltativo: se non viene specificato è utilizzato l'identificativo dell'ultima connessione aperta; se anche questo non è disponibile viene chiamata mysql_connect() utilizzando i valori di default (che ricordiamo essere localhost, “”,””, per cui difficilmente, se noi abbiamo pensato alla sicurezza , questi valori ci daranno modo di accedere ad alcunché).
Il risultato restituito dalla funzione è vero in caso di successo, falso altrimenti.
Esempio
// selezione del database
$conn = mysql_select_db($my_db_name,$conn)
or die(Impossibile selezionare il database $my_db_name);
Dopo aver stabilito la connessione con il server MySQL e selezionato il database su cui lavorare, possiamo finalmente interagire con il DBMS utilizzando il linguaggio SQL,vedremo in seguito come.
Terminata la nostra sessione di lavoro con MySQL dobbiamo chiudere la connessione con il server.
Usiamo la funzione mysql_close().
Esempio:
// chiusura della connessione con il server MySQL
mysql_close($conn);
L'unico argomento della funzione mysql_close() è l'identificativo della connessione ottenuto con la chiamata precedente della funzione mysql_connect().
Al termine dell'esecuzione dello script, PHP provvederà a chiudere tutte le connessioni eventualmente rimaste aperte, per cui non è strettamente necessario chiuderle esplicitamente.
I passi presentati fino a questo punto forniscono un ossatura generale: ogni script PHP che dovrà utilizzare un database inizierà con le fasi di connessione e selezione del database e terminerà con la chiusura della sessione.
Interagire con il database con MySQL
La funzione PHP che ci consente di inviare comandi SQL al database è mysql_query();
mysql_query() prevede due parametri :
Il risultato di mysql_query() è, al solito, un numero intero, se è maggiore di zero indica che il comando SQL è stato eseguito con successo, un valore nullo indica il fallimento dell'operazione.
Esempio:
// eseguo dei comandi SQL utilizzando mysql_query()
$sql = “SELECT Nome, Cognome, Indirizzo From Rubrica”;
$result = mysql_query($sql,$conn) or die (“non posso eseguire il comando SQL);
Se il comando SQL eseguito è un interrogazione ( o query), cioè un comando SELECT, il valore restituito dalla funzione mysql_query() assume anche il significato di identificativo del risultato; questo identificativo viene utilizzato da altre funzioni, tra cui mysql_fetch_row() e mysql_fetch_array(), per accedere all'insieme di record che costituiscono il risultato dell'interrogazione.
La funzione mysql_fetch_row() prevede come unico parametro l'identificativo del risultato restituito da mysql_query(); la funzione restituisce un array contenente un elemento per ogni campo previsto dalla SELECT del record prelevato dal risultato, oppure il valore FALSE se non ci sono altri record da prelevare.
Esempio:
// mostro il risultato dell'interrogazione SQL usando mysql_fetch_row()
while (riga = mysql_fetch_row($result))
{ echo “<p>Nome : “.$riga[0].”<br>”;
echo “<p>Cognome : “.$riga[1].”<br>”;
echo “<p>Indirizzo : “.$riga[2].”<p>”;
}
La funzione mysql_fetch_array(), estende mysql_fetch_row(); essa restituisce il record corrente sotto forma di array associativo, in cui i nomi dei campi del record vengono usati come chiavi. Questo consente di accedere ai valori desiderati in base al loro nome piuttosto che in base alla posizione.
// mostro il risultato dell'interrogazione SQL usando mysql_fetch_array()
while (riga = mysql_fetch_array($result))
{ echo “<p>Nome : “.$riga[“Nome”].”<br>”;
echo “<p>Cognome : “.$riga[“Cognome”].”<br>”;
echo “<p>Indirizzo : “.$riga[“Indirizzo”].”<p>”;
}