17 avril 2011

PQO une facade pour PDO

Si, comme moi, vous faites partie des cancres qui n'utilisent pas une couche de persistance pour accéder à votre base de données alors ce billet a une chance de vous intéresser. La solution exposée ici, a comme unique but de me permettre de lancer des requêtes SQL encore plus simplement qu'en utilisant l'objet PHP standard PDOStatement.

Dans la lignée de mes précédents billets, mon objectif est de pouvoir chainer les commandes afin d'avoir à écrire le moins de code possible tout en restant lisible.

Démonstration


$pdo = PDO($dsn);

// Récupérer l'unique valeur d'un champ : 
$sql = 'SELECT count(*) counter FROM clients;'

echo PQO::factory($pdo, $sql)
     ->fire()
     ->fetch()
     ->counter;


// Récupérer une ligne de résultat : 
$sql = 'SELECT nom, adresse FROM clients WHERE id=? AND flag=?;'

$row = PQO::factory($pdo, $sql)
     ->bind(1, $id, PDO::PARAM_INT)
     ->bind(2, $fg, PDO::PARAM_INT)
     ->fire()
     ->fetch();
if ($row) 
     echo 'Nom : ',$row->nom,' Adresse : ', $row->adresse;

// Relancer plusieurs fois une même requête : 

$sql = 'INSERT INTO registre (id, value) VALUES (?,?);'

$qry = PQO::factory($pdo, $sql)
     ->with(1, PDO::PARAM_INT, 10)
     ->with(2, PDO::PARAM_STR, 25);

$qry->set(1, 10)->set(2, 'dix')->fire();
$qry->set(1, 100)->set(2, 'cent')->fire();
$qry->set(1, 1000)->set(2, 'mille')->fire();

// Parcourir un jeu de résultat : 
$sql = 'SELECT nom, adresse FROM clients WHERE flag=?;'

$qry = PQO::factory($pdo, $sql)
     ->bind(1, $fg, PDO::PARAM_INT)
     ->fire();
while ($row = $qry->fetch()) {
     echo 'Nom : ',$row->nom,' Adresse : ', $row->adresse, PHP_EOL;
}

// Récupérer un jeu de résultat : 
$sql = 'SELECT nom, adresse FROM clients WHERE flag=?;'

$rows = PQO::factory($pdo, $sql)
     ->bind(1, $fg, PDO::PARAM_INT)
     ->fire()
     ->fetchAll();

foreach($rows as $row) {
     echo 'Nom : ',$row->nom,' Adresse : ', $row->adresse, PHP_EOL;
}

PSO

Afin d'être au maximum "chainable", la valeur retournée est d'un objet particulier du type PSO. On peut donc automatiquement transformer ou tester la valeur retournée :


echo PQO::factory($pdo, $sql)
     ->fire()
     ->fetch()->adresse->trim()->slice(0, 3)->toInteger();

La classe possède également un singleton ce qui permet, au besoin, de réutiliser plusieurs fois la même requête sans avoir à la "repréparer":


echo PQO::singleton($pdo, $sql)
     ->fire()
     ->fetch()->name;

Téléchargement et code source

Le code source est disponible sur GitHub : http://github.com/touv/plor

Ou, on peut directement l'installer avec PEAR en s'abonnant au Channel Respear :


% pear channel-discover pear.respear.net
% pear install respear/plor

1 commentaire: