Clearbricks
Parcourir la série : suivant - dernier
Clearbricks : découverte de dbLayer et de sa fonction select()
Introduction à Clearbricks
Dotclear utilise son propre framework qui n'est pas un framework : Clearbricks, il est composé d'une ensemble de classes et de fonctions, on y trouve par exemple une classe destinée à traiter les chaînes HTML ou une classe servant à formater les dates. Nous allons nous intéresser à la classe dbLayer
.
La base de données
Comme son nom l'indique, c'est une base ... de données. Concrètement, ça stocke des informations sous forme de tables (qui sont des tableaux) dans lesquelles on peut sélectionner des informations, les trier ou ajouter une information, etc. Pour cela on utilise des requêtes écrites en langage SQL. Ce langage est un standard et permet de faire des requêtes à différents types de base de données[1]. Clearbricks peut se connecter à trois types de bases de données : MySQL, PostgreSQL (noté aussi PGSQL) et SQLite (très peu utilisé).
La classe dbLayer
dbLayer est le diminutif de database layer, ou couche de la base de données
en français. C'est une couche d'abstraction, ce qui signifie qu'on fait appel à dbLayer pour réaliser des actions (ici des requêtes SQL) sans se soucier de ce qu'il y a en-dessous. Au lieu d'utiliser les fonctions de PHP telles que mysql_query()
et pg_query()
on utilisera les fonctions de dbLayer en faisant abstraction du type de la base de données.
On peut schématiser ainsi le cheminement d'une requête SQL :
Grâce à Clearbricks et dbLayer, on a un code qui gère indifféremment les 2 types de base de données.
La table lecteurs
Imaginons qu'on ait créé une table lecteurs
:
id | nom | rôle |
---|---|---|
1 | Pierre | clown |
2 | Paul | développeur |
3 | Jacques | soutien moral |
4 | Olivier | chef |
5 | Kozlika | fée |
Cette table est un tableau composé de 3 champs (les colonnes) : id
(l'identifiant de la ligne) correspondant à l'ordre dans lequel les lecteurs se sont enregistrés, nom
(le nom des utilisateurs) et role
qui est le rôle de l'utilisateur. Cette table compte 5 enregistrements (les lignes). Elle servira d'exemple dans ce billet.
Admettons que la connexion a la base de données a été effectuée, c'est l'objet $con
. Dans Dotclear c'est l'objet $core->con
. Nous allons voir comment utiliser la fonction select()
.
Première requête sur un enregistrement et un champ
Comment faire pour afficher le nom du premier lecteur ?
Voici la requête en pseudo-code : "sélectionner nom dans la table lecteurs où id = 1" et en SQL :
$query = 'SELECT nom FROM lecteurs WHERE id = 1;';
Effectuons la requête :
$rs = $con->select($query);
$rs
est un recordset, c'est un groupe d'enregistrements (ici un seul) qui contient les champs (ici le champ nom). On accède au champ nom grâce à la fonction field()
ou sa version raccourcie f()
, on l'affiche ainsi :
echo($rs->f('nom'));
Ceci affichera "Pierre". Notez qu'il existe une syntaxe simplifiée pour afficher le même résultat :
echo($rs->nom);
On peut aussi effectuer la même opération en une ligne :
echo($con->select($query)->nom);
Une requête sur un champ avec plusieurs enregistrements
Comment afficher les noms des derniers lecteurs ?
Voici la requête en pseudo-code : "sélectionner nom dans la table lecteurs en rangeant par id décroissant en se limitant à 2 enregistrements" et en SQL :
$query = 'SELECT nom FROM lecteurs ORDER BY id DESC LIMIT 2;';
Effectuons la requête :
$rs = $con->select($query);
Le recordset $rs
contient 2 enregistrements, on ne peut plus accéder directement au champ nom des 2 enregistrements avec f('nom')
. On va parcourir les enregistrements avec une boucle grâce à la fonction fetch()
:
while ($rs->fetch()) {echo($rs->f('nom').' ');}
Ceci va afficher "Kozlika Olivier".
Une requête sur plusieurs champs de plusieurs enregistrements
Comment afficher les noms et les rôles des 3 premiers lecteurs ?
Voici la requête en pseudo-code : "sélectionner nom et rôle dans la table lecteurs par id croissant en se limitant à 3 enregistrements" et en SQL :
$query = 'SELECT nom,role FROM lecteurs ORDER BY id ASC LIMIT 3;';
Effectuons la requête :
$rs = $con->select($query);
Le recordset $rs
contient 3 enregistrements et 2 champs, on va devoir parcourir les enregistrements comme précédemment :
while ($rs->fetch()) {echo($rs->f('nom').' : '.$rs->f('role').' ');}
Ceci va afficher "Pierre : clown Paul : développeur Jacques : soutien moral".
Conclusion
Désormais vous savez utiliser les fonctions de dbLayer pour effectuer des requêtes SQL de type SELECT.
Si les commentaires sont fermés, vous pouvez commenter ce billet sur mon blog en attendant la réouverture des commentaires sur ce blog.
Merci à Kozlika, Franck Paul et Biou pour leurs conseils et le temps qu'ils m'ont accordé.
Notes
[1] le langage peut différer d'un type à l'autre
Commentaires
OK, ça c'est génial car on aura pas à se poser la question de la base de données qui est derrière, et qu'on peut renvoyer la tartine par objet.
Néanmoins, il y a une question qui me chiffonne : comment protège-t-on les données insérées dans les requêtes sans coup malicieux genre injection SQL ? on continue à utiliser mysqli_real_escape_string ?
Da Scritch > Tu disposes d'une méthode escape() via le dbLayer.
De la même façon que tu utiliserais un
mysql_real_escape_string($var)
en temps normal, tu feras un$con->escape($var)
en passant par le dbLayer.En plus de cette série d'articles, tu peux également consulter : http://dev.dotclear.org/code/2/clas...
@Da Scritch : je ne m'étais jamais posé la question ...
@Pep : est-ce que Dotclear fait le ménage dans les requêtes POST ? Je regarde comment se fait l'insertion d'un commentaire et je ne vois pas d'utilisation de escape(). Il faut utiliser escape() pour chaque insertion ou mise à jour dans la base de données ?
Moe > Si tu passes par un
cursor
du dbLayer, toutes les valeurs membres sont systématiquement échappées au moment de l'invocation decursor::insert()
oucursor::update()
. Dans ce cas là, tu n'as qu'à te préoccuper d'échapper le complément optionnel de clause WHERE accepté comme argument parcursor::update()
.Par contre, si tu construis toi-même des requêtes d'insertion/mise à jour, il faudra que tu veilles toi-même à bien passer toutes les valeurs par
dbLayer::escape()
.J'ai oublié de répondre à la toute première question : non, il n'y a pas de nettoyage par défaut des variables POST. :-)
Merci beaucoup Pep !
bonjour,
pourquoi vous avez créé une class pour connection BD puisque PHP depuis la version 5.1 il integre PHP Data Object (PDO) cela permet "PDO fournit une interface d'abstraction à l'accès de données, ce qui signifie que vous utilisez les mêmes fonctions pour exécuter des requêtes ou récupérer les données quelque soit la base de données utilisée" ce qui va vous évitez plein de class et alléger votre code ;)
@psycho : peut-être que PDO n'existait pas lors du développement de Dotclear 2 ou que PDO n'est pas disponible chez tous les hébergeurs ? il faudrait poser la question au développeur de Dotclear et de Clearbricks.
@psycho
PDO a été intégré à PHP à partir de la version 5.1, et il me semble Dotclear se veut compatible avec PHP 5.0. En plus, UDBMS offre de nombreuses fonctionnalités qui ne sont pas inclues à PDO, comme les outils permettant de créer ou mettre à jour très facilement le schéma de la base de données.