Share |

sabato 4 settembre 2010

PHP: Introduzione a PDO e Database

In questo articolo PHP presenterò ed introdurrò l'utilizzo dei PDO, o PHP Data Objects.

PDO sostanzialmente rappresenta un persistent layer di elevata astrazione grazie al quale è possibile interfacciare ed utilizzare allo stesso modo qualunque database, rendendo di fatto portabili il codice sorgente e le applicazioni che ne fanno uso.

I PDO permettono di eseguire qualunque tipologia di operazione (estrazioni, creazioni di oggetti, modifiche, inserimenti ecc...) su qualunque base dati di cui sono forniti specifici drivers. Ad oggi è possibile il loro utilizzo sulle piattaforme di storage relazionale ORACLE, IBM DB2, MS SQL Server, MySQL, SQLite, PostgreSQL ed altre minori.

Questa grande novità è stata introdotta come estensione in PHP 5.0 e dalla versione successiva è stata distribuita all'interno del pacchetto di installazione come feature standard.

Nota:
A partire dalla release 6 di PHP, l'utilizzo di PDO sarà necessario e obbligatorio per interfacciarsi e lavorare con DB quali MySQL, PostgreSQL e ORACLE.

Perché utilizzare PDO ?

La portabilità è garantita utilizzando drivers che, implementando le PDO Interfaces, espongo metodi comuni che incapsulano caratteristiche specifiche e proprietarie di ogni DB utilizzabile.

Ad esempio, utilizzando PDO per eseguire transazioni sarà possibile riutilizzare il medesimo codice sorgente qualora cambiasse la base dati su cui lo script in questione opera, e questo perchè l'astrazione dell'interfaccia è tale da non richiedere più l'utilizzo di funzioni specifiche come, per esempio, le mysql_* e sqlite_* functions.

PDO rappresenta per PHP ciò che JDBC rappresenta nel mondo Java: un set di interfacce e classi per interfacciarsi a tutti i databases con approccio OOP.

Oltre ai benefici derivanti dalla programmazione ad oggetti (pulizia del codice sorgente, fasi di manutenzione dell'applicazione più snelle ecc..), PDO offre agli sviluppatori comodi metodi per mettere al riparo i dati da casi di SQL injections e per la gestione delle eccezioni, a tal proposito PDO è fornito con la propria classe d'eccezione: PDOException.

Inoltre, è sempre bene ricordare che è solo una questione di tempo dopo la quale non sarà più garantita la retro-compatibilità del codice scritto senza il supporto dei PDO, obbligando di fatto ad un intervento massiccio per rimettere in funzione le vecchie applicazioni.

Connessioni tramite DSN

Ciò che permette a PHP di scegliere correttamente il driver specifico in fase di connessione al database prescelto è rappresentato dal DSN, o Data Source Name, utilizzato per stabilire la connessione.

Di seguito un esempio di connessione ad un database SQLite:

<?php
  $dsn = 'sqlite2:"C:\sqlite\miodb.db"';

  try{
    $dbh = new PDO($dsn);
    echo 'Connessione al DB stabilita. :)';
  }
  catch (PDOException $e){
    echo 'Impossibile stabilire una connessione al DB: ' 
        . $e->getMessage();
  }
?>

Di seguito un esempio di connessione ad un database PostgreSQL:

<?php
  $dsn = 'pgsql:host=localhost port=5432 dbname=world'
        .' user=utente password=pwd';

  try{
    $dbh = new PDO($dsn);
    echo 'Connessione al DB stabilita. :)';
  }
  catch (PDOException $e){
    echo 'Impossibile stabilire una connessione al DB: ' 
        . $e->getMessage();
  }
?>

Come è possibile notare, indipendentemente dal database da utilizzare, si procede sempre nel creare l'istanza di PDO allo stesso modo: quel che cambia ogni volta è solo il DSN utilizzato!

Il DSN è anch'esso uno standard ed è composto da tre specifiche parti:
il driver da utilizzare, il carattere ':' e la stringa di connessione, specifica per ogni DB.

ES:

'mysql' + ':' + 'host=localhost;dbname=miodb;'

Per conoscere le caratteristiche e le specifiche di ogni singolo DSN è possibile consultare il manuale ufficiale a questo indirizzo.

Nei prossimi giorni approfondirò l'argomento con altri articoli, meno introduttivi e più operativi.

Alla prossima,
MA.

0 commenti:

Posta un commento

Non ti è chiaro qualcosa?
No problem, posta il tuo dubbio ;)

..... e ricordati di firmarlo!