PEAR::DB è un insieme di classi nato per fornire un meccanismo di astrazione dal database. Perchè è importante? Pensate ad un grosso progetto che usi MySQL come DBMS, e che debba poi migrare ad MSSQL. Nei sorgenti delle pagine PHP si dovrebbero modificare tutte le chiamate alle funzioni mysql_ in mssql_.

La soluzione è rimpiazzare tutte le funzioni per un preciso DBMS con una classe che si occupi di redirigere le chiamate al DBMS giusto, secondo le nostre impostazioni. PEAR::DB svolge esattamente questa funzione.

Per usare PEAR::DB, è necessario includere la libreria DB.php con l’ istruzione PHP require_once:

require_once ‘DB.php’;

CONNESSIONE AL DB:

La connessione al database è una operazione che richiede due passi:

  1. Creare una stringa di connessione al database, detta DSN, fatta nel seguente modo:
    <dbms>://<username>:<password>@<hostname>/<nome database>
  2. Utilizzare il metodo DB::Connect(), passando come parametro la stringa di connessione creata precedentemente

È poi utile usare il metodo DB::isError() per verificare che la connessione sia andata a buon fine.

Per disconnettersi dal DBMS si usa la funzione DB::Disconnect.

require_once ‘DB.php’;
$user = ‘webappXY’;
$pass = ‘password’;
$host = ‘localhost’;
$db_name = ‘webappXY’;
$dsn = “mysql://$user:$pass@$host/$db_name”; $db = DB::Connect($dsn);
if( DB::isError($db) ) {
die($db->getMessage());
}
// operazioni sul db
// ci disconnettiamo
$db->disconnect();

ESEGUIRE UNA QUERY:

Ogni tipo di query (SELECT, INSERT, UPDATE, DELETE…) viene inviata al DBMS tramite il metodo DB_COMMON::query(). Questo metodo richiede, come parametro, la query SQL da inviare al DBMS al quale si è connesso tramite DB::Connect().

// $db è l’oggetto restituito da DB::connect
Eseguo la query
$sql = ‘SELECT * FROM test’;
$rs = $db->query($sql);
//Verifico gli eventuali errori
if( DB::isError($rs) ) {
echo “Attenzione!Si è verificato un errore \”$sql\”.”;
}
die($rs->getMessage()); }

Recuperare il result-set di una SELECT:

Per poter mostrare i risultati di una query di selezione, si usa il metodo DB_RESULT::fetchRow(). Tale metodo accetta, come primo parametro (opzionale), un intero che rappresenta il metodo con cui dovranno essere restituiti i valori. Questo valore può essere uno dei seguenti:

  • DB_FETCHMODE_ORDERED (default): i dati saranno restituiti in un array accessibile tramite i consueti indici numerici
  • DB_FETCHMODE_ASSOC: i dati saranno restituiti in un array associativo, dove si potranno usare i nomi delle colonne come indici
  • DB_FETCHMODE_OBJECT: i dati saranno restituiti in un oggetto, in cui i nomi dei campi rappresenteranno delle proprietà

Il metodo di accesso può anche essere settato tramite il metodo DB_COMMON::setFetchMode(), in modo che tutte le chiamate a DB_RESULT::fetchRow() senza parametri assumeranno il metodo di accesso stabilito nella chiamata a DB_COMMON::setFetchMode().


// $rs è l’oggetto restituito da $db->query();
while( $row = $rs->fetchRow(DB_FETCHMODE_ASSOC) ) {
echo ” ” . $row['id'];
echo ” ” . $row['head'];
echo ” ” . $row['body'];
}

Righe modificate da INSERT, UPDATE, DELETE:

Per verificare quante righe siano state modificate da una query di aggiornamento, si usa il metodo DB_COMMON::affectedRows(). Tale metodo non richiede parametri, e restituisce il numero di righe modificate.


$sql = “INSERT INTO `test` (`id`, `head`, `body`) VALUES (”, ‘prova veloce’, ‘testo non molto lungo’);”;
// Esecuzione query …
$rs = $db->query($sql);
// scopriamo quante righe sono state modificate
$affected_rows = $db->affectedRows();
echo “Riga/Righe modificata/e: ” . $affected_rows . “