15 septembre 2006

DB_QueryTool, une classe PEAR permettant de construire et exécuter du SQL

DB_QueryTool est un package moins connu que DB_DataObject.

DB_QueryTool propose une solution simple pour éviter de coder directement des requêtes SQL. Il permet de produire et d'exécuter du SQL à l'aide d'une classe unique.

La documentation officielle présente le package de telle manière que l'on a du mal à comprendre la différence avec DB_DataObject. Si on peut créer une classe pour chaque table de données, DB_QueryTool n'est sûrement pas le meilleur dans ce domaine. Il s'agit plus d'un QueryBuilder ou d'un SQLBuilder. Tentative de démonstration.

Couplage avec DB

DB_QueryTool peut gérer la connexion à la base de données, pour cela il utilise le package PEAR DB. Cependant on peut externaliser la gestion de la connexion :


require_once 'DB/QueryTool.php';
$dsn = 'sqlite:///home/thouveni/devel/testsets/france.sdb';

$options = array(
    'debug'       => 2,
    'portability' => DB_PORTABILITY_ALL
);

$db =& DB::connect($dsn, $options);
if (PEAR::isError($db)) 
    die($db->getMessage());

$dqt = new DB_QueryTool;
$dqt->setDbInstance(&$db);

Choix d'une table

On peut comme cela est décrit dans la docuentation officielle créer une clase par table. Cependant, on peut très bien utiliser la classe générique ...


$dqt->setTable('departements');

Générer et exécuter des requêtes SQL de type SELECT

Voici une série d'exemple extrait des sources du package.

ATTENTION : avant de rejouer une requête sur la même table il faut appler la méthode reset()


$dqt->reset();

// SELECT * FROM departement WHERE id=54
$res = $dqt->get(54);

// SELECT * FROM user
$res = $dqt->getAll();

// SELECT * FROM departement LIMIT 0,10
$res = $dqt->getAll(0,10);

// SELECT * FROM region WHERE id>3
$dqt->setWhere('id>3');
$res = $user->getAll();

// SELECT * FROM region WHERE id_zone IS NOT NULL GROUP BY id_zone ORDER BY id_zone
$user->setSelect('name');
$user->setWhere('name IS NOT NULL');
$user->setOrder('name');
$user->setGroup('name');
$res = $user->getAll();