dossier introduction aux bases de...

Download DOSSIER Introduction aux bases de donnéessylvestre.ledru.info/articles/introduction-base-de-donnees.pdf · Le marché du SGBDR est principalement con- ... Microsoft Access, ... Introduction

If you can't read please download the document

Upload: trinhdang

Post on 06-Feb-2018

217 views

Category:

Documents


0 download

TRANSCRIPT

  • DOSSIER

    14 www.linuxdevjournal.com1/2006

    A l'heure actuelle, le modle de base de donnes (BD) qui domine est le modle re-lationnel. Les systmes qui implmentent ce systme s'appellent les systmes de gestion de bases de donnes relationnelles (SGBDR, souvent appels SGBD).

    Malgr des avantages indniables, le mo-dle concurrent, le modle objet n'a toujours pas perc.

    Les diffrents logicielsLe march du SGBDR est principalement con-centr entre 4 logiciels :

    MySQL, logiciel libre propos par la quasi totalit des hbergeurs grands publics. Ra-pide, facile d'accs et efficace, il rattrape son manque criant de fonctionnalits dans ses dernires versions. Il fonctionne effica-cement sous GNU/Linux, quelques Unix et Windows

    PostgreSQL, logiciel libre malheureuse-ment trop mconnu qui propose toutes les fonctionnalits (et mme plus) que l'on attend d'un SGBDR moderne. Les dveloppements actuel sur ce SGBD vi-sent optimiser les calculs et traite-ments

    Oracle, le leader en terme de base de donnes professionnelles

    Microsoft SQL Server, un des rares produits Microsoft de qualit mme si ses failles de scurit assez sensibles ont gratign sa r-putation

    Outre ces quatre logiciels, il existe de nom-breux autres SGBD comme Firebird, Microsoft Access, DB2 qui ont leurs avantages propres et dsavantages (non, on vise peine Access).

    MySQLMySQL possde de nombreuses API (interface de programmation) pour accder une base de donnes MySQL partir de langages ht-roclites comme C, C++, PHP, Python, Ruby... Le formalisme des fonctions est autant que possible le mme d'un langage l'autre. Ces API permet-tent d'interagir avec la base de donnes et ainsi excuter des requtes sur la base de donnes, obtenir le rsultat de l'opration (succs, erreurs, avertissements) ou rcuprer un jeu de rsultats dans les structures de donnes du langage en question.

    Il ne faut pas perdre de vue qu'une base de donnes n'est qu'une manire (certes trs efficace) de stocker des donnes et d'y acc-der. Une application conue au dessus d'une base de donnes pourrait avoir ses donnes

    conserves dans une srie de fichiers plats. Cependant, la plupart des traitements devien-draient rapidement d'une complexit rare avec des performances fortement dgrades. Par exemple, essayez de pondre un algorithme per-mettant de rcuprer dans un fichier plat client et un fichier de commandes tous les utilisateurs de plus de 25 ans ayant effectu plus de trois commandes.

    La disparit de fonctionnalits et, dans une moindre mesure, de syntaxe d'un SGBD l'autre pose de gros problmes de portabilit d'une application. Le choix du systme de gestion de base de donnes doit donc tre un choix mrement rflchi de la part de l'quipe technique, une migration tant une opration trs coteuse, parfois longue et risque.

    Cependant, de nouvelles technologies (en particulier des API de programmation) permettent une abstraction du SGBD en dlguant la gestion des diffrences syntaxiques et fonctionnelles. Hibernate en Java est un bon exemple de technologie russie.

    Introduction aux bases de donnes Qu'est ce qu'une base de donnes ? Pour faire simple, une base de donnes permet de stocker et de rcuprer facilement des informations. Ces informations sont structures de manire reflter la ralit tout en respectant quelques rgles (unicit de l'information, chaque lment doit pouvoir tre identifi de manire unique...).

    JULIEN HERBINJulien Herbin est ingnieur chez Pimentech, une Socit de services en logiciels libres parisienne. Il travaille sur des projets s'appuyant de manire intensive sur des bases de donnes, principalement pour de grandes enseignes de l'immobilier.

    SYLVESTRE LEDRUSylvestre Ledru est ingnieur l'INRIA, responsable des versions GNU/Linux et Unix de logiciel de cal-cul opensource Scilab. Il a travaill sur de nombreux sites internet mlant de nombreuses technologies comme les sites sportsregions.fr et Kikooboo.com.

    Sur lauteur

    Niveau de difficult

    Listing 1. Cration d'une table

    CREATE TABLE (

    [default ] [extra options],

    [...]

    PRIMARY KEY ,

    [ FOREIGN KEY REFERENCES TO () ]

    );

  • Apprendre Mysql via la cration d'un blog

    15www.linuxdevjournal.com 1/2006

    On peut accder la base de donnes via une interface en ligne de commande simple (ou via une application plus volue comme le fameux PHPMyAdmin ou MysqlQuickAdmin). Cette interface permet d'interagir totalement et directement avec les informations conserves par la base de donnes. De cette manire, il est possible de tester ses requtes avant de les in-tgrer dans l'application.

    TableA la manire d'un fichier CSV, une table contient une catgorie d'information dfinie (une table qui sert contenir la liste des messages d'un blog ne pourra et ne devra pas tree utilis pour contenir la liste des utilisateurs par exemple). Une table contient un nombre indfini d'l-ments (de 0 jusqu' X) appel Enregistrements. Un enregistrement est constitu de champs. Un champ est d'un type d'information dfini (entier, caractre, chane, date...).

    Idalement, chaque enregistrement de la table doit pouvoir tre identifi de manire unique l'aide d'un ou de plusieurs champs.

    Dans l'exemple concret prsent en deuxime partie de cet article, les tables sont message et commentaire. Un enregistrement sera un des messages du blog et un champ sera par exemple le titre du message.

    Cls primairesUne cl primaire est un ensemble de champ (mme si, gnralement, un seul champs est uti-lis) qui permet d'identifier de manire unique les enregistrements de la table. Il existe deux manires de grer les cls primaires :

    on dlgue la gnration d'un numro unique au SGBD via une auto-incrmentation (gnralement un bte i++) ou via les squences (numro de facture mlangeant lettre et chiffre par exemple)..

    on utilise un champ ou plusieurs que l'on sait unique (numro de scurit sociale dans une table utilisateur par exemple).

    La premire mthode est prfre car les champs rellement uniques sont relativement rares (un numro de scurit sociale n'est fourni que rarement par un utilisateur et est limit la France, un utilisateur peut ne pas avoir d'adresse email ou une adresse email peut tre partage entre plusieurs personnes, etc). A l'inverse, il arrive souvent que le numro unique gnr par le SGBD devienne

    un numro (ou une partie d'un numro) de rfrence comme un numro de facture...

    Cls trangresLe principe des cls trangres est le fondement de l'aspect relationnel dans les bases de don-nes. Il permet de lier deux tables entre elles et ainsi de souligner un rapport smantique entre ces deux entits. La cl trangre dans une ta-ble doit tre la cl primaire de l'autre table lie. Grce cette cl, une relation va tre cre en-tre les deux tables qui permettra de rcuprer toutes ces donnes lors de l'interrogation de la base.

    Comme exemple, l'application blog dveloppe dans la seconde partie utilise deux tables. La table message qui contient les messages des

    blogs et la table commentaire qui, elle, stocke les commentaires envoys sur un message. La ncessit d'une liaison entre un message et tous ses commentaires coule donc de source. Concrtement, la table commentaire va avoir un champ lui indiquant quel message il se rfre (en l'occurrence id_message).

    Cration d'une tableLes types de donnes utilisables lors de la cration varient dans leur nature d'un SGBD l'autre. Une chane de caractres sous Oracle s'appellera VARCHAR2 et VARCHAR sous MySQL.

    Sous MySQL, les types classiques sont :

    int, entier float, nombre dcimal (avec virgule) char, nombre de caractre fix varchar, chane de caractre text, chane de caractre non limit date, comme son nom l'indique : date timestamp, permet de reprsenter un jour

    et une heure (AAAA-MM-DD HH:MM:SS)

    Des variantes dun SGBD telles que TINYINT existent.

    Tableau 1. Le tableau des cls primaires

    id_message date_ajout date_modif titre texte en_ligne

    2 2006-08-10 23:26:34

    2006-08-10 23:26:34

    titre du message

    mon premier test

    1

    3 2006-08-10 23:28:44

    2006-08-10 23:42:42

    second message

    j'adore vraiment les sgbd

    0

    Listing 2. La syntaxe pour la cration de la table message

    CREATE TABLE message (

    id_message INT AUTO_INCREMENT,

    date_ajout TIMESTAMP,

    date_modif TIMESTAMP NULL,

    titre VARCHAR(200),

    texte TEXT,

    en_ligne TINYINT(1) UNSIGNED,

    PRIMARY KEY (id_message)

    Listing 3. Listing du fichier de cration de la base de donnes structure_bd.sql

    DROP TABLE IF EXISTS message;

    CREATE TABLE message (

    id_message INT AUTO_INCREMENT,

    date_ajout TIMESTAMP,

    date_modif TIMESTAMP NULL,

    titre VARCHAR(200),

    texte TEXT,

    en_ligne TINYINT(1) UNSIGNED,

    PRIMARY KEY (id_message)

    );

    DROP TABLE IF EXISTS commentaire;

    CREATE TABLE commentaire(

    id_commentaire INT AUTO_INCREMENT,

    date_ajout TIMESTAMP,

    pseudo VARCHAR(20),

    email VARCHAR(100),

    url VARCHAR(100),

    commentaire TEXT,

    id_message INT,

    PRIMARY KEY (id_commentaire)

    );

  • DOSSIER

    16 www.linuxdevjournal.com1/2006

    Lors de l'insertion ou de la modification d'enregistrement, sous MySQL avec le com-portement par dfaut, si le champ ne corres-pond pas au type, MySQL va essayer de le caster (c'est--dire le convertir vers un autre type de donnes) vers le format de destina-tion. Par exemple, une chane de 15 caractres insre dans un champ de type varchar de 10 sera tronqu la taille maximale. Ce compor-tement est diffrent selon le SGBD (et ses op-tions), ainsi, PostgreSQL va refuser l'insertion en gnrant une erreur si la taille dpasse la taille maximale (de mme si le type fournit ne correspond pas celui spcifi).

    Comme pour la plupart des oprations SQL, la syntaxe est relativement triviale.

    Le choix des noms des champs est libre. Ce-pendant, il est conseill d'adopter un formalis-me pour les noms en vue de faciliter le dvelop-pement et la maintenance.

    Par exemple, la syntaxe pour crer la table message est presente par le Listing 2.

    ModificationSous MySQL, il est possible de modifier la structure de la table (nom des champs, type

    de donnes, valeur par dfaut...) en ajoutant/modifiant/supprimant des champs.

    Pour rajouter un champ, la syntaxe sera :

    ALTER TABLE

    ADD

    Pour la modification d'un champ, on devra utiliser la syntaxe suivante :

    ALTER TABLE

    CHANGE

  • Apprendre Mysql via la cration d'un blog

    17www.linuxdevjournal.com 1/2006

    Cet exemple nous permet de souligner qu'il est possible de faire appel des fonctions in-ternes MySQL (traitement sur les chanes de caractres, dates...).

    Mise jourLa syntaxe pour mettre jour un enregistrement n'est pas complexe. Elle s'crit de la manire suivante :

    UPDATE

    SET

    =,

    =

    WHERE

    La condition d'excution de la requte est gnralement faite sur la cl primaire mais peut tre plus gnrale. Par exemple, on peut imaginer une requte de mise jour qui ne changerait que les messages publi du blog. Exemple :

    UPDATE message SET

    WHERE en_ligne=1

    Une fois excute, cette requte retourne le nombre d'lments impacts par cette modification pour vrification ou rutilisation.

    SuppressionDe la mme manire que pour la mise jour, une requte de suppression se fait sur une condition. Condition qui n'est pas impos au dveloppeur. Gnralement, tant donn le risque intrinsque de cette requte, elle est effectue sur la cl primaire mais rien n'oblige l'utilisateur le faire.

    DELETE FROM

    WHERE

    Comme pour la mise jour, la suppression retourne le nombre d'lments impacts.

    RequtesToutes les possibilits offertes pour la rcupration des donnes pourraient faire l'objet d'un article ddi. Nous allons aborder les plus utilises et ac-cessibles.

    Requte de baseLes deux requtes les plus courantes lorsque l'on dbute dans les SGBD sont :

    rcuprer tous les enregistrements d'une table

    rcuprer un enregistrement spcifique

    Rcuprer tous les enregistrements est une procdure basique. La syntaxe de base est :

    SELECT * FROM

    Contrairement ce que l'on pourrait imaginer, l'toile (*) ne sert pas rcuprer tous les enregistrements mais elle permet d'obtenir tous les champs des enregistrements.

    Gnralement, la recherche est faite sur la cl primaire.

    SELECT * FROM message

    WHERE id_message=42

    Pour rcuprer un enregistrement spcifi-que, il faut rajouter une condition la requ-te. Pour cel, il faut rajouter une (ou plusieurs) clause(s) :

    SELECT * FROM message

    WHERE titre="Intro aux BDS";

    De cette manire, on va rcuprer tous les messages dont le titre est "Intro aux BDS".

    Pour des questions de performance et de clart dans le code, il est conseill de spcifier tous les champs que l'on veut rcuprer. Par exemple :

    SELECT id_message, titre,

    texte FROM message;

    Astuce : Il est possible de trier les rsultats. L'utilisation du mot cl ORDER BY sur un champs donn. Par exemple, SELECT id _message, titre, texte FROM message ORDER BY titre; triera par ordre alphabtique (a->z) tous les messages en fonction de leur titre.

    Requtes avancesIl est intressant de pouvoir rcuprer un l-ment spcifique mais il serait possible de rali-ser cela d'une manire relativement simple en utilisant un autre moyen de stockage. Un des atouts des SGBDs vient justement du principe de relations dtaill au - dessus.

    Ainsi, une jointure permet de relier deux tables entre elles lors d'une interrogation de la base de donnes. Ceci permet de grouper et filtrer des informations selon des critres multiples et htrognes.

    La jointureLa jointure s'effectue sur la cl primaire d'une table et sur la cl secondaire de l'autre.

    Il existe plusieurs manires de raliser des jointures. Celle prsente ici retourne les enre-gistrements qui existent dans les deux tables et dont les cls correspondent.

    La syntaxe de jointure de deux tables est :

    SELECT * FROM

    ,

    WHERE .

    =

    .

    Par exemple, cas pratique pas si rare dans le monde rel, imaginons que l'on veut rcuprer tous les commentaires des messages en ligne. L'information qui va discriminer les

    Listing 6. Listing du fichier de modle HTML base_page.inc.php

  • DOSSIER

    18 www.linuxdevjournal.com1/2006

    commentaires sur le fait qu'un message soit en ligne ou pas (champs tinyint en_ligne).

    La requte sera :

    SELECT * FROM message,

    commentaire WHERE message.

    id_message=commentaire.id_message

    AND message.en_ligne=1

    Plutt que d'excuter deux requtes et d'effec-tuer en plus une partie du traitement dans un langage au - dessus, cette requte permet de rcuprer d'un coup tous les enregistrements qui correspondent notre besoin.

    Autres fonctionnalitsNous n'avons fait qu'aborder les fonc-tionnalits de base d'un SGBD. De nom-breuses possibilits sont offertes par les SGBDs. Si les bases de donnes vous pas-sionnent (ce dont je ne doute pas), vous dcouvrirez l'intrt des subselects, l'in-dexation des champs, les contraintes d'in-tgrit fonctionnelles, les autres types de jointures, les vues, les triggers, les proc-dures stocks, l'hritage de tables, le map-ping objet/relationnel, la rplication...

    criture d'un Blog en PHPMaintenant que vous connaissez les concepts fondamentaux des bases de donnes, passons la pratique en crivant une application s'ap-puyant sur une base de donnes pour assurer le stockage des donnes persistantes. En cri-vant une version basique d'un systme de blog, nous allons apprendre manipuler une base de donnes avec un langage de programma-tion.

    La comprhension de cette petite application, crite en PHP, ne ncessite pas la matrise de

    ce langage, mais il est important d'avoir tout de mme quelques notions de programmation (constantes, variables, fonctions). PHP est en langage de script objet open source dont la syntaxe est assez proche du C, trs rpandu et principalement employ pour dvelopper des si-tes Internet. Il est dot de librairies trs riches et d'une communaut d'utilisateurs trs vaste et dynamique.

    A ce niveau, nous supposerons que vous dis-posez d'un environnement de dveloppement PHP/MySQL, c'est dire d'un serveur Web accompagn du module PHP (avec le support MySQL) et d'un serveur MySQL. Bien entendu, le serveur de base de donnes ne doit pas n-cessairement tourner sur la mme machine que le serveur Web. Vous aurez aussi besoin d'un client MySQL sur votre machine ou sur une ma-chine sur laquelle vous disposez d'un compte pour effectuer quelques manipulations sur la base de donnes.

    Cration de la base de donnesLa premire tape de notre travail consiste crer la base de donnes. Connectez vous avec

    le compte root au serveur MySQL et tapez la commande suivante :

    mysql>

    CREATE DATABASE monblog

    Puis crez un utilisateur ddi pour l'application de Blog et attribuez lui les droits lui permettant d'effectuer un certain nombre d'oprations l'aide de la commande GRANT de MySQL :

    mysql> GRANT ALL PRIVILEGES

    ON monblog.* TO 'moi'@'localhost'

    IDENTIFIED BY 'mon_pass'

    WITH GRANT OPTION;

    Cette commande permet aussi de dfinir les machines depuis lesquelles notre utilisateur aura l'autorisation de se connecter, ainsi qu'un mot de passe lui permettant de s'authentifier.

    l'issue de l'excution de ces deux instructions, nous disposons d'une base de donnes monblog vide et d'un utisateur moi ayant tous les droits sur cette base. Il n'est plus ncessaire de travailler sous la session root, vous pouvez donc la quitter et tenter de vous connecter la base monblog en utilisant le compte nouvellement cr :

    $ mysql -u moi monblog -p

    Aprs avoir saisi votre mot de passe, si l'authentification est russie, vous obtiendrez un prompt MySQL (mysql>) vous permettant d'excuter des instructions SQL sur la base monblog.

    Modle des donnesL'application que nous allons crire n'tant pas trs complexe, le modle des donnes associ est trs simple : il comporte seule-ment deux tables. La premire va nous servir stocker les messages posts sur le blog, la seconde enregistrer les commentaires des internautes.

    Crons un fichier structure_bd.sql contenant les instructions SQL permettant de crer ces deux tables presentes par le Listing 3.

    Listing 8. Listing de la page d'accueil du blog index.php

    Figure 1. Capture d'cran de la page d'accueil

  • Apprendre Mysql via la cration d'un blog

    19www.linuxdevjournal.com 1/2006

    Les lignes dbutant par DROP TABLE IF EXISTS suivies du nom d'une table permet-tent de supprimer une table si elle existe dj dans la base de donnes. En effet, la cration d'une table portant le mme nom qu'une ta-

    ble dj existante est impossible (et n'aurait pas de sens). Ce genre d'instruction permet de rejouer plusieurs fois le fichier SQL (dans le cas d'un changement de modle) sans gnrer d'erreur. Attention tout de me m-

    me, supprimer une table aura pour effet de supprimer l'intgralit des enregistrements qu'elle contient.

    La table message contient six champs :

    id_message : un nombre entier, identi-fiant unique attribu automatiquement chaque nouvel enregistrement insr dans la table message. Ce champ est la cl primaire de notre table, il est fonda-mental, car il identifie chaque enregistre-ment.

    date_ajout : un champ de type TIMES-TAMP correspondant la date prcise de l'ajout de notre message.

    date_modif : un second champ de type TIMESTAMP qui va nous servir stocker la date de modification du message. Notons que le mot cl NULL autorise ne pas renseigner ce champ, qui n'a pas de sens tant qu'un message n'a pas t modifi.

    titre : un champ de type VARCHAR conte-nant le titre de notre message, avec une li-mite 200 caractres.

    texte : le champ qui va contenir le corps du message. Comme il est de type TEXT, il peut contenir un nombre illimit de carac-tres.

    en_ligne : dernier champ de notre table, de type TINYINT(1), il dterminera si le message doit tre affich sur le Blog ou non.

    Notre seconde table, commentaire est aussi constitue de six champs :

    id_commentaire : l'image du champ id_message de la table message, ce champ sera l'identifiant entier unique attribu automatiquement de la table commentaire. Il constitue la cl primaire de cette table.

    date_ajout : champ de type TIMESTAMP contenant la date d'ajout du commentaire

    pseudo : chane de caractre de longueur 20 au maximum contenant le pseudonyme de l'internaute qui a crit le commentaire

    email : chane de caractre de longueur 100 au maximum contenant l'adresse e-mail de l'internaute

    url : autre chane de caractre de longueur 100 au maximum contenant cette fois l'adresse du site web de l'internaute

    id_message : nous retrouvons ici un champ portant le mme nom que la cl primaire de la table message, et c'est justement parce qu'il y fait rfrence. En effet, ce champ contiendra l'identifiant du message auquel se rfre le commentaire. C'est une cl trangre de la table commentaire.

    Listing 9. Listing de la page de dtail d'un message detail.php

  • DOSSIER

    20 www.linuxdevjournal.com1/2006

    Afin d'alimenter notre Blog, nous allons ajou-ter un premier message la fin du fichier, l'aide d'une requte INSERT :

    INSERT INTO message (date_ajout, titre,

    texte, en_ligne) VALUES (now(),

    'Mon premier message', "Alors, facile

    le SQL ? C'est le premier message sur mon

    blog !", 1)

    Le fichier d'instructions SQL complet, vous disposez de deux solutions pour jouer son contenu sous MySQL :

    copier / coller le code SQL dans une console o vous tes connect MySQL (ou dans un front-end Mysql, comme phpMyAdmin)

    jouer directement le fichier en ligne de commande :

    mysql -u nom_utilisateur -p

    nom_de_la_base < structure_bd.sql

    La base de donnes est maintenant oprationnelle !

    Fichier de configuration de l'applicationUne bonne habitude prendre en programma-tion est de crer un ou plusieurs fichiers de con-figuration pour donner un peu plus de souplesse l'application. Ne drogeons pas cette rgle et crivons un fichier config.inc.php qui va nous servir dfinir diffrentes constantes, comme les paramtres de connexion la base de donnes, utilises diffrentes reprises par notre applica-tion. En PHP, ON dfinie une constante l'aide de la fonction define, qui prend en paramtre le nom de la constante et sa valeur(voir le Lis-ting 4).

    Connexion la base de donnesCrons maintenant un fichier connexion_bd.inc.php qui va se charger d'initialiser une connexion la base de donnes. La fonction

    require_once nous permet d'inclure le code du fichier config.inc.php au dbut du fichier de con-nexion la base. Une fois cette ligne excute, les constantes dfinies dans le fichier de confi-guration deviennent accessibles. Cette situation est presente par le Listing 5.

    La connexion la base de donnes se fait en deux tapes : d'abord on s'authentifie auprs du serveur MySQL, puis on slectionne la base de donnes sur laquelle on dsire travailler. Si une de ces deux tapes se traduit par un chec, l'excution du script est stoppe et un message d'erreur est affich. Il est possible de configurer plusieurs connexion MySQL en parallle ; dans ce cas, il faut travailler avec des rfrences vers les connexions pour indiquer aux fonctions PHP sur quelle connexion jouer les requtes.

    Il n'est pas ncessaire de fermer une connexion MySQL en PHP car, dans le cas d'une connexion non persistante, celle-ci est automatiquement fer-me la fin de l'excution du script. Mais il reste possible de fermer explicitement une connexion en invoquant de fonction mysql_close.

    Squelette HTML et librairie blogUne des difficults avec PHP est que le code peut trs rapidement se retrouver noy dans du code HTML, ce qui nuit considrablement la lisibilit et la reprise du code. Gnralement, afin de sparer le calcul (PHP) de la prsentation (HTML + CSS), on s'oriente vers un moteur de templates (comme Smarty pour PHP). Nous nous contente-rons ici d'crire un petit systme trs simple per-mettant de factoriser le code HTML commun toutes nos pages. Nous n'aurons ainsi qu' gn-rer le code HTML spcifique une page donne dans le fichier PHP qui effectue le calcul.

    Le fichier base_page.inc.php met en place le squelette d'une page HTML et s'attend ce que deux constantes soient dfinies avant d'tre inclus la fin d'un script PHP :

    TITRE_PAGE : le titre de la page, affich dans la barre de titre de la fentre du na-vigateur et en haut de notre page HTML. Si cette constante n'est pas dfinie, le titre du site, dfini comme constante (TITRE_SI-TE) dans le fichier de configuration s'affiche-ra la place.

    CORPS_HTML : la partie de code HTML spcifique une page. Si la constante n'est pas dfinie, un message d'erreur s'affichera.

    Vous aurez probablement remarqu l'inclusion du fichier lib_blog.inc.php au dbut du fichier, ainsi que l'utilisation de la fonction const_ou_defaut invoque trois reprises dans le fichier base_page.inc.php. Cette fonction n'est pas fournie par PHP, mais elle dfinie par nos soins dans un fichier de librairie lib_blog.inc.php dans lequel nous placerons les fonctions spcifi-ques notre application. La fonction const_ou_defaut prend en paramtre le nom d'une constante, dont le contenu sera affich si cette

    Figure 2. Capture d'cran du dtail avec commentaires

  • www.linuxdevjournal.com 1/2006

    constante est dfinie, et une valeur par dfaut qui sera affiche dans le cas contraire.

    Page d'accueil du BlogAprs tout ce travail de prparation, nous allons enfin crire la premire page visible du site, et c'est logiquement l'criture de la page d'accueil que nous allons nous atteler. On trouvera sur cet-te page un rsum de chaque message publi sur notre Blog, accompagn d'un lien pour accder au message dans son intgralit et aux commen-taires des internautes. Il va donc falloir se connec-ter la base de donnes, excuter une requte de type SELECT nous renvoyant la liste des messages et traiter le rsultat pour l'affichage.

    Le simple fait d'inclure le code du fichier con-nexion_bd.inc.php nous assure que la connexion la base de donnes est effective. Comme nous l'avons vu plus haut, dans le cas contraire, le script n'ira pas plus loin et affichera un message d'erreur.

    Deux appels de fonctions sont particulire-ment importants dans ce script. D'abord, l'appel mysql_query qui prend en paramtre une re-qute SQL sous la forme d'une chane de carac-tres et renvoie une ressource contenant le jeu de rsultat de la requte. La requte que nous jouons ici retourne tous les messages en ligne par ordre inverse de cration. Notez que les champs de type TIMESTAMP sont transforms en timestamps au format Unix l'aide de la fonc-tion MySQL UNIX_TIMESTAMP car la fonction de formatage de timestamp date de PHP fonc-tionne avec ce type de paramtre.

    Le second appel de fonction qu'il faut bien comprendre est l'appel mysql_fetch_array qui prend une ressource MySQL correspondant au rsultat d'une requte en paramtre et renvoie le prochain enregistrement du rsultat sous forme de tableau index par le nom des champs, ou le boolen false si le dernier enregistrement est atteint. Ainsi, il devient trivial, l'aide de l'instruc-tion while de PHP, d'itrer sur les enregistrements renvoys par une requte. Les instructions situes dans la boucle while effectuent simplement une concatnation des donnes prsentes dans l'en-registrement en cours la chane de caractre $out_html, prcdemment initialise.

    la fin du script, le contenu de la variable $out_html est plac dans la constante CORPS_HTML et l'inclusion de notre squelette HTML provoque l'affichage de notre page d'accueil.

    Remarquez l'identifiant id_message pass la page detail.php au niveau du lien Lire la suite. Cet identifiant va nous permettre de connatre le message pour lequel on dsire afficher le dtail et les commentaires li ce message.

    Page de dtail d'un message et des commentairesLa dernire tape de notre travail sera d'crire une page qui affiche le dtail d'un message post sur notre blog, suivi des commentaires envoys par les internautes et d'un formulaire leur permettant de les saisir. Mme si le code

    de cette page est plus long, la technique reste identique : on se connecte la base en premier lieu, on effectue une srie de requtes, puis on ralise un traitement sur le jeu de rsultat.

    La premire instruction sert vrifier que l'on a bien reu l'identifiant en paramtre HTTP GET du message pour lequel on souhaite obtenir le dtail. Cet identifiant tant la cl primaire de la table message, un seul message peut lui correspondre.

    Suite cette premire vrification, la connexion la base de donnes est initialise, puis une pre-mire requte est ventuellement joue, si un commentaire vient d'tre post. Cette requte insre un enregistrement dans la table commen-taire partir des informations saisies dans le for-mulaire, en prenant bien soin de positionner la cl trangre id_message afin de connatre le mes-sage auquel correspond le commentaire. Notons que l'on emploie aussi la fonction PHP mysql_query pour jouer une requte de type INSERT.

    La partie concernant l'affichage du message original sur cette page est trs similaire celle de la page d'accueil, la diffrence que la requte de slection applique un filtre sur la cl primaire pour ne recevoir que l'enregistrement correspondant au message dsir. D'autre part, le message n'est cette fois pas tronqu s'il est trop long, comme c'est le cas sur la page index.php (cf : appel la fonction PHP substr).

    Une dernire requte est finalement ex-cute pour slectionner l'ensemble des com-mentaires se rapportant au message, qui sont prsents d'une manire trs similaire celle du message. Au cas o la requte ne renvoie pas de rsultat, ce que l'on vrifie en invoquant la fonction PHP mysql_numrows (qui donne le nombre d'enregistrements prsents dans le jeu de rsultat de la requte), le message Aucun commentaire est affich la place de la liste des commentaires.

    Pour finir, un formulaire HTML permettant de saisir un commentaire est affich la fin de la page.

    vous de jouer...Pour raliser le gain de temps et le confort que nous apporte la base de donnes, mme dans le cadre d'un projet trs simple comme celui-ci, il suffit d'imaginer le temps et le code supplmentaire ncessaire pour arriver au mme rsultat en utilisant des fichiers plats. Mme si cet exemple est trs pratique, il reflte un schma classique d'interaction entre un langage de programmation et une base de donnes Connexion > Requte > Itration sur les rsultats > Prsentation du rsultat , valable quelque soit le serveur de base de donnes ou le langage retenu.

    Vous devriez maintenant pouvoir laisser libre court votre imagination et dmarrer votre propre projet en PHP / MySQL ou pourquoi pas toffer ce blog en y rajoutant des fonctionnali-ts (pages d'administration, navigation par pa-ges, flux RSS...).