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

PSO, Enchainer les traitements sur une chaîne de caractères en PHP

A force d'utiliser jQuery, l'envie est grande de travailler de la même manière en PHP. Voici donc une toute petite classe qui permet d’enchaîner les traitements sur une même chaîne de caractères.

Démonstration

$s = PSO::factory("\ttoto");

echo $s, PHP_EOL;
//     toto

echo $s->trim()->md5(), PHP_EOL;
// f71dbe52628a3f83a77ab494817525c6

echo $s->slice(3,2), PHP_EOL;
// db

echo $s->isMatch('/^D.*/i') ? 'true' : 'false', PHP_EOL;
// true

echo $s->isMatch('/^D.*/') ? 'true' : 'false', PHP_EOL;
// false

echo count($s), PHP_EOL;
// 2

Non exhaustif

Le nombre de méthode applicable à cette classe est potentiellement énorme. Actuellement, leur nombre est limité et cette classe s'enrichira au grès de mes besoins ou des contributions.

Une façade à mbstring

L'intérêt de cette classe est aussi de supporter presque nativement des chaines multioctets (du moins autant que cela soit possible avec PHP).


$s = PSO::factory("éè");
echo count($s), PHP_EOL;
// 2 
echo strlen($s->toString()),PHP_EOL;
// 4

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