14:4615112007
Clearbricks : la fonction select() de dbLayer
Par Moe - Site / Dév
Note : ce billet développe les mêmes fonctions que mon précédent billet Les requêtes SQL select avec Dotclear 2 de façon plus accessible et ne nécessite pas de connaître Dotclear 2.
Merci de laisser un commentaire si vous avez une remarque à faire au niveau d'un point qui manquerait de clarté ou d'une erreur dans le texte.
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 | role |
|---|---|---|
| 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. 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 vous voulez aller plus loin, vous pouvez regarder les autres billets portant le tag "documentation".
Modifications apportées :
- 20-11-2007
- suppression de références à Dotclear (ex :
$core->con) - amélioration de
La base de données
- ajout de
rs->noméquivalent àrs->f('nom')
- suppression de références à Dotclear (ex :
- 22-11-2007
- modification du graphique : suppression de
traitement
etaffichage
qui n'avaient pas de sens - multiples modifications : suppression des imprécisions, etc.
- modification du graphique : suppression de
Notes
[1] le langage peut différer d'un type à l'autre
Commentaires
Et hop ! Lu et adopté. Merci.
Merci d'avoir accepté de publier cette contribution sur dcTips() ! Comme je te l'ai dit par mail, j'ai tout compris en plus (enfin j'ose l'espérer :-P)
Très bonne idée ce didacticiel. Bravo.
Mais vu que je suis un pinailleur, je vais faire une remarque. ;-) Il est indiqué "La connexion a la base de données a été effectuée, c'est l'objet $con.", ce qui est un raccourci (à mon avis) trop abrupt. Pour quelqu'un qui découvre Dotclear, il ne saura pas que c'est Dotclear qui se charge de cette étape et le lecteur va probablement se dire "Mais comment effectuer cette connexion ? Aurais-je raté un autre didacticiel qui l'explique ?"
Bon, OK, maintenant que j'ai lu le début du texte disant que cet article fait suite à un autre, je constate que ma remarque tombe à l'eau. À ma décharge, il faut dire que j'ai lu l'article sur les dcTips() où il manque ce complément. ;-)
Tu as raison zeiram, ce n'était pas très clair, j'ai reformulé la partie que tu cites. Ce billet ne fait pas vraiment suite aux autres billets, ce sont les mêmes notions mais avec des explications plus détaillés et (je l'espère) plus claires. Il devrait normalement être suivi d'autres billets moins théoriques. Il me fallait une base avant d'attaquer la mise en pratique, c'est chose faite.