13.07.2015 Views

Réalisation d'un framework en PHP

Réalisation d'un framework en PHP

Réalisation d'un framework en PHP

SHOW MORE
SHOW LESS

Create successful ePaper yourself

Turn your PDF publications into a flip-book with our unique Google optimized e-Paper software.

<strong>Réalisation</strong> <strong>d'un</strong> <strong>framework</strong> <strong>en</strong> <strong>PHP</strong> par Bruno Da SilvaI - Avant proposI-A - Effectuer des recherches sur InternetI-B - Normes de codageI-C - Analyse préalableI-D - InstallationsII - Base de donnéesII-A - Analyse de l'att<strong>en</strong>duII-B - Connexion à la baseII-C - Lancer une requêteII-D - Lancer une requête à l'aide <strong>d'un</strong> fichier SQLII-E - Automatiser les requêtesII-F - ConclusionIII - Gestion du debugIII-A - Initialisation de la variable de debugIII-B - Stockage dans la variableIII-C - Affichage des donnéesIII-D - ConclusionIV - Modèle MVCIV-A - Requêtes HTTPIV-B - Script de récupération des requêtesIV-C - Partie contrôleurIV-D - ConclusionV - Moteur de templatesV-A - IntroductionV-B - Chargem<strong>en</strong>t du fichierV-C - Fonction afficheV-D - ConclusionVI - Mode d'emploiVII - Conclusion Générale- 2 -Les sources prés<strong>en</strong>tés sur cette pages sont libres de droits, et vous pouvez les utiliser à votre conv<strong>en</strong>ance. Par contre la page de prés<strong>en</strong>tation deces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - Bruno Da Silva. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'<strong>en</strong>semble de son cont<strong>en</strong>u : textes, docum<strong>en</strong>ts, images, etc sans l'autorisation expresse de l'auteur.Sinon vous <strong>en</strong>courez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.http://g-rossolini.developpez.com/tutoriels/php/<strong>framework</strong>-debutant/


<strong>Réalisation</strong> <strong>d'un</strong> <strong>framework</strong> <strong>en</strong> <strong>PHP</strong> par Bruno Da SilvaI - Avant proposLe but de ce modeste docum<strong>en</strong>t n'est pas de vous permettre de créer un <strong>framework</strong> abouti. Sa seule ambition estde vous appr<strong>en</strong>dre les rudim<strong>en</strong>ts <strong>d'un</strong>e programmation saine <strong>en</strong> <strong>PHP</strong>.Comme vous l'avez sûrem<strong>en</strong>t deviné, ce docum<strong>en</strong>t ne s'adresse pas à des utilisateurs chevronnés mais à despersonnes plus ou moins débutantes.I-A - Effectuer des recherches sur InternetEn effet, il faut savoir que bi<strong>en</strong> que le forum de dvp.com, que vous ne manquez pas de connaître, vous offre unegrande satisfaction, la plupart du temps, une simple recherche Google peut résoudre votre problème. Cep<strong>en</strong>dant,Internet ne se limite pas à Google. Récapitulons les outils à disposition :php.netmanuel <strong>en</strong> ligneRessourceComm<strong>en</strong>taireLe site php.net est LE réflexe à avoir : vousdésirez effectuer un traitem<strong>en</strong>t, vous vousdoutez qu'une fonction existe ?Et bi<strong>en</strong>, allez sur ce site, tapez dans la case"search for" un mot anglais étant proche durésultat désiré et vous verrez qu'au bout dequelques t<strong>en</strong>tatives, vous trouverez votrebonheur.googleSi vous bloquez sur un problème particulier,Google vous permettra très souv<strong>en</strong>t detrouver des ressources pouvant vous aiderla FAQ <strong>PHP</strong> De nombreux thèmes y sont abordés :avant de vous lancer dans la création <strong>d'un</strong>programme, faites-<strong>en</strong> une lecture rapide,vous verrez que vous éviterez bi<strong>en</strong> deserreurs.le forum de dvp.comSi, malgré toutes ces étapes, vousr<strong>en</strong>contrez toujours des problèmes, n'hésitezpas à vous tourner vers le forum, où d<strong>en</strong>ombreuses personnes sont prêtes à vousaider.Bi<strong>en</strong> <strong>en</strong>t<strong>en</strong>du, p<strong>en</strong>sez à mettre des titresprécis, des extraits de code pas trop longset surtout à être clair dans l'exposé de votreproblème.Maint<strong>en</strong>ant que nous savons que faire <strong>en</strong> cas de bug, essayons de définir une façon uniforme de coder.I-B - Normes de codageCela peut sembler absurde de s'embêter avec de telles broutilles alors qu'il y a tant à appr<strong>en</strong>dre. Cep<strong>en</strong>dant, je vousrecommande de suivre cette norme.- 3 -Les sources prés<strong>en</strong>tés sur cette pages sont libres de droits, et vous pouvez les utiliser à votre conv<strong>en</strong>ance. Par contre la page de prés<strong>en</strong>tation deces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - Bruno Da Silva. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'<strong>en</strong>semble de son cont<strong>en</strong>u : textes, docum<strong>en</strong>ts, images, etc sans l'autorisation expresse de l'auteur.Sinon vous <strong>en</strong>courez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.http://g-rossolini.developpez.com/tutoriels/php/<strong>framework</strong>-debutant/


<strong>Réalisation</strong> <strong>d'un</strong> <strong>framework</strong> <strong>en</strong> <strong>PHP</strong> par Bruno Da SilvaUtiliser une conv<strong>en</strong>tion de codage prés<strong>en</strong>te divers avantages :• Vous vous relisez plus facilem<strong>en</strong>t, tout votre code étant prés<strong>en</strong>té de manière uniforme ;• Lorsque vous postez un message d'aide sur dvp.com, vous vous r<strong>en</strong>dez compte que les réponses sont plusrapides et plus précises.Non seulem<strong>en</strong>t vous vous relisez plus facilem<strong>en</strong>t, tout votre code étant prés<strong>en</strong>té de manière uniforme, mais, <strong>en</strong> plus,le jour où vous posterez un message d'aide sur dvp.com, vous vous r<strong>en</strong>dez compte que les réponses sont plusrapides et plus précises.Sachez que prés<strong>en</strong>ter un code clair est une forme de respect <strong>en</strong>vers les autres. Imaginez que quelqu'un doiverepr<strong>en</strong>dre votre code, laissez-le au moins un tantinet lisible...Voici un exemple de normes de codage :Guide de style pour bi<strong>en</strong> coder, par Adri<strong>en</strong> Pellegrini.Après ce court mais néanmoins utile paragraphe, passons à l'analyse du projet que nous allons créer.I-C - Analyse préalableRappelons-nous que notre but est de créer un <strong>framework</strong> <strong>en</strong> <strong>PHP</strong>.Att<strong>en</strong>tion, l'objectif n'est pas de créer un <strong>framework</strong> utilisable mais simplem<strong>en</strong>t de voircomm<strong>en</strong>t fonctionn<strong>en</strong>t les <strong>framework</strong>s.Si nous retournons à la définition que nous avons lu plus haut, un <strong>framework</strong> est <strong>en</strong> fait un <strong>en</strong>semble de briqueslogicielles permettant de ne pas devoir programmer à chaque fois les étapes les plus génériques <strong>d'un</strong> développem<strong>en</strong>t.Justem<strong>en</strong>t... Quelles sont ces différ<strong>en</strong>tes étapes ?Réfléchissons un peu... Nous voulons faire un site dynamique <strong>en</strong> <strong>PHP</strong>... Qui dit dynamique, dit données à gérer...Nous allons donc avoir besoin <strong>d'un</strong> gestionnaire de base de données... Pourquoi pas MySQL ?Nous avons donc trouvé une de ces fameuses briques : créer des fonctions d'accès aux bases de données.Cep<strong>en</strong>dant, il doit bi<strong>en</strong> <strong>en</strong> exister d'autres... Par exemple, si vous r<strong>en</strong>contrez un bug... Qu'allez vous faire ? Passer undébuggeur externe (par exempleDGB), quelle horreur ! En <strong>PHP</strong>, débugger peut être bi<strong>en</strong> plus simple : la plupartdes programmeurs font de simples echo ou, mieux, des var_dump.Cette technique, très utile lors de problèmes ponctuels, peut vite dev<strong>en</strong>ir un casse-tête. C'est décidé ! Nous allonsimplém<strong>en</strong>ter des fonctions facilitant tout cela.En avons nous terminé ?Et qu'<strong>en</strong> est-il de ces définitions pompeuses de modèle MVC ? Voilà ! On se l'est pétée, maint<strong>en</strong>ant, on doit assumer! Allez zou ! On va aussi implém<strong>en</strong>ter ce motif de conception. Pour ce faire, nous allons coder le contrôleur qui,comme son nom l'indique, contrôlera la navigation de l'utilisateur. Il fera appel à des modèles constitués de simplesfichiers texte qui seront r<strong>en</strong>dus "dynamiques" par un moteur de templates, celui-là même qui permet de séparer lecode <strong>PHP</strong> des balises HTML ! Allons bon ! Nous allons donc devoir coder cette chose étrange...Bon, eh bi<strong>en</strong>, ça suffira ! Voilà donc ce que nous allons faire dans les pages suivantes.- 4 -Les sources prés<strong>en</strong>tés sur cette pages sont libres de droits, et vous pouvez les utiliser à votre conv<strong>en</strong>ance. Par contre la page de prés<strong>en</strong>tation deces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - Bruno Da Silva. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'<strong>en</strong>semble de son cont<strong>en</strong>u : textes, docum<strong>en</strong>ts, images, etc sans l'autorisation expresse de l'auteur.Sinon vous <strong>en</strong>courez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.http://g-rossolini.developpez.com/tutoriels/php/<strong>framework</strong>-debutant/


<strong>Réalisation</strong> <strong>d'un</strong> <strong>framework</strong> <strong>en</strong> <strong>PHP</strong> par Bruno Da SilvaII - Base de donnéesCe chapitre <strong>en</strong>tier s'adresse aux débutants les moins aguerris : seules quelques notions<strong>en</strong> SQL sont recommandées. Si vous possédez une quelconque expéri<strong>en</strong>ce <strong>en</strong> <strong>PHP</strong>, vouspouvez sauter directem<strong>en</strong>t au chapitre suivant !C'est parti !Nous allons <strong>en</strong>fin mettre la main dans du code... Après avoir analysé ce que nous voulons faire...II-A - Analyse de l'att<strong>en</strong>duNous devons créer des fonctions dédiées à gérer l'interfaçage (la connexion) avec une base MySQL.Quelles "briques" (fonctions) créer ? Essayons de décomposer les différ<strong>en</strong>tes possibilités :1 Se connecter à la base ;2 Lancer une requête.Ces deux fonctions sont les plus évid<strong>en</strong>tes mais que pouvons-nous faire d'autre?1 Lancer une requête à partir <strong>d'un</strong> fichier texte ;2 Automatiser les requêtes.Autant le premier élém<strong>en</strong>t de cette liste se compr<strong>en</strong>d de lui-même, autant le second mérite une explication :Le langage SQL me barbe ! Pourquoi toujours saisir les mots SELECT, WHERE, FROM, etc. Eh bi<strong>en</strong>, <strong>en</strong> effet,pourquoi ? Il suffit de créer des fonctions qui les ajout<strong>en</strong>t pour nous et le tour est joué. En passant, on peut <strong>en</strong> profiterpour lancer des contrôles sur l'utilité de certaines requêtes (ne vous inquiétez pas si ce n'est pas très clair, on yrevi<strong>en</strong>dra).Tout au long de ce chapitre, vous verrez apparaître une fonction nommée "dbgStore()" :ce n'est pas une fonction interne à <strong>PHP</strong>. En réalité, elle sera implém<strong>en</strong>tée dans le troisièmechapitre, consacré au debug. Pour le mom<strong>en</strong>t, nous allons la considérer comme un simpleecho et, à cette fin, allons créer une fonction temporaire à intégrer au code :define("TOUS", 0);define("INDEFINI", 1);define("FASTBDD", 4);define("REQUETE", 5);define("CONTROLEUR", 6);define("TRAITEMENT", 7);define("TEMPLATE", 8);define("TEMPLATEDYN", 9);function dbgStore($message, $type) {echo $message;}II-B - Connexion à la base- 6 -Les sources prés<strong>en</strong>tés sur cette pages sont libres de droits, et vous pouvez les utiliser à votre conv<strong>en</strong>ance. Par contre la page de prés<strong>en</strong>tation deces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - Bruno Da Silva. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'<strong>en</strong>semble de son cont<strong>en</strong>u : textes, docum<strong>en</strong>ts, images, etc sans l'autorisation expresse de l'auteur.Sinon vous <strong>en</strong>courez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.http://g-rossolini.developpez.com/tutoriels/php/<strong>framework</strong>-debutant/


<strong>Réalisation</strong> <strong>d'un</strong> <strong>framework</strong> <strong>en</strong> <strong>PHP</strong> par Bruno Da SilvaComm<strong>en</strong>t faire pour se connecter à la base ?Si vous avez lu le chapitre I-B, vous devriez <strong>en</strong> avoir déjà une petite idée... Vous voulez utiliser une fonction de <strong>PHP</strong>,mais vous ne connaissez pas son nom ?R<strong>en</strong>dez vous sur php.net, tapez "mysql" dans la case "search for" et... Vous arrivez iciPas la peine de tout lire, survolez la docum<strong>en</strong>tation jusqu'à arriver a la partie "Table des matières", là, conc<strong>en</strong>trez-vouspeu.<strong>PHP</strong> propose toujours des noms de fonctions très compréh<strong>en</strong>sibles. Vous voulez vous connecter à la base...Regardez ceci :mysql_connect -- Ouvre une connexion à un serveur MySQLDifficile de faire plus clair. Cliquons sur le li<strong>en</strong> : que voyons-nous dorénavant ? Eh bi<strong>en</strong>, nous avons sous les yeuxtout ce qu'il faut pour utiliser cette fonction : la liste des paramètres, leur rôle et leurs différ<strong>en</strong>tes valeurs possible.Dans la suite de cet article, nous considérerons que les paramètres suivants permett<strong>en</strong>t de se connecter à la base :$hote = "localhost";$user = 'root';$pwd = '';$base = "tuto";Les trois premiers paramètres sont "génériques" : toute base nouvellem<strong>en</strong>t installée acceptera ces paramètres etpermettra la connexion.Le 4ème paramètre, quant à lui, est spécifique à chaque base : ici, nous informons MySQL que nous voulons travaillersur la base 'tuto' (bi<strong>en</strong> qu'elle n'existe pas <strong>en</strong>core, ne provoquera pas d'erreur).Si vous vous s<strong>en</strong>tez perdus, peut être devriez vous intéresser à un docum<strong>en</strong>t tel que celui-ci. Bi<strong>en</strong> que ce ne soitpas obligatoire, il vous permettra de mieux compr<strong>en</strong>dre le rôle des fonctions que nous allons écrire ici. De plus, savoirutiliser un SGBD (une base de données) est indisp<strong>en</strong>sable <strong>en</strong> <strong>PHP</strong>.Enfin, sachez que tout mot comm<strong>en</strong>çant par un $ (dollar) est considéré par <strong>PHP</strong> comme unevariable.Maint<strong>en</strong>ant que nous avons compris la signification de ces paramètres, <strong>en</strong>core faut-il les utiliser :function connectDB() {$hote = "localhost";$user = 'root';$pwd = '';$base = "tuto";$connexion = mysql_connect($hote , $user , $pwd )or die("Impossible de se connecter à la base");mysql_select_db($base)or die("Impossible de sélectionner la base");return $connexion;}- 7 -Les sources prés<strong>en</strong>tés sur cette pages sont libres de droits, et vous pouvez les utiliser à votre conv<strong>en</strong>ance. Par contre la page de prés<strong>en</strong>tation deces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - Bruno Da Silva. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'<strong>en</strong>semble de son cont<strong>en</strong>u : textes, docum<strong>en</strong>ts, images, etc sans l'autorisation expresse de l'auteur.Sinon vous <strong>en</strong>courez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.http://g-rossolini.developpez.com/tutoriels/php/<strong>framework</strong>-debutant/


<strong>Réalisation</strong> <strong>d'un</strong> <strong>framework</strong> <strong>en</strong> <strong>PHP</strong> par Bruno Da SilvaIci, plusieurs nouvelles notions <strong>en</strong>tr<strong>en</strong>t <strong>en</strong> ligne : énumérons-les.Terme Signification Manuel <strong>PHP</strong>functionUne fonction est une série li<strong>en</strong>d'actions. Elle peut êtreappelée depuis n'importequel <strong>en</strong>droit du codeet permet de définir untraitem<strong>en</strong>t "générique"pouvant être effectuéplusieurs fois.$hoteComme nous l'avons vu, li<strong>en</strong>c'est une variable."localhost" Les guillemets simples ( ' ) li<strong>en</strong>ou doubles ( " ) permett<strong>en</strong>tde définir des chaînes decaractères.$connexionIci aussi, nous avons affaireà une variable. Cep<strong>en</strong>dant,elle ne conti<strong>en</strong>t pas dechaîne de caractère : nous yrevi<strong>en</strong>drons plus loin.or die("Impossible de se L'instruction "or die()" permet li<strong>en</strong>connecter à la base") d'interrompre le programme<strong>en</strong> cas d'erreur : par défaut,si <strong>PHP</strong> n'arrive pas à seconnecter, il continueraquand même à s'exécuter, cequi, dans notre cas, ne sert àri<strong>en</strong>.return $connexionL'instruction return permetà la fois d'interromprela fonction et de lui fairer<strong>en</strong>voyer une valeur.li<strong>en</strong>Nous y revi<strong>en</strong>drons plus <strong>en</strong>détail.; Le point virgule est un li<strong>en</strong>élém<strong>en</strong>t indisp<strong>en</strong>sable !Pr<strong>en</strong>ez garde à ne pas <strong>en</strong>oublier ! Sa significationest la suivante : "instructionterminée". Ainsi, vous pouvezcoder une seule instructionsur plusieurs lignes, <strong>PHP</strong> nes'<strong>en</strong> soucie pas, ce qui peutse révéler bi<strong>en</strong> pratique étantdonné que, pour lui, seul le";" est significatif.Une dernière chose est à signaler : les fonctions possèd<strong>en</strong>t leurs propres variables. Qésako ?- 8 -Les sources prés<strong>en</strong>tés sur cette pages sont libres de droits, et vous pouvez les utiliser à votre conv<strong>en</strong>ance. Par contre la page de prés<strong>en</strong>tation deces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - Bruno Da Silva. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'<strong>en</strong>semble de son cont<strong>en</strong>u : textes, docum<strong>en</strong>ts, images, etc sans l'autorisation expresse de l'auteur.Sinon vous <strong>en</strong>courez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.http://g-rossolini.developpez.com/tutoriels/php/<strong>framework</strong>-debutant/


<strong>Réalisation</strong> <strong>d'un</strong> <strong>framework</strong> <strong>en</strong> <strong>PHP</strong> par Bruno Da SilvaUne variable déclarée dans une fonction n'est pas accessible depuis une autre fonction. Pire même, lorsque lafonction se termine, la variable est détruite ! Vous vous doutez bi<strong>en</strong> qu'il existe des variables dites "globales" (al'inverse des variables "locales" aux fonctions). Cep<strong>en</strong>dant, bi<strong>en</strong> que celles-ci se révèl<strong>en</strong>t fort pratiques, elles sontà utiliser avec parcimonie : elles sont sources d'erreurs, car on a vite fait d'oublier que tel nom de variable est déjàutilisé ou d'effacer leur cont<strong>en</strong>u par mégarde... Pour plus d'infos, voyez ici, ici, ou bi<strong>en</strong> <strong>en</strong>core là.II-C - Lancer une requêteVous vous doutez bi<strong>en</strong> que nous n'avons pas parlé de variable globale pour ri<strong>en</strong>... Nous allons les utiliser dans laprochaine fonction :function query($query) {if (! isset ($GLOBALS['connection']) ) {$GLOBALS['connection'] = connectDB();}$result = mysql_query($query, $GLOBALS['connection']);switch ($result ) {case (false) :dbgStore("La requete a echoué, message de la BDD : '". mysql_error($GLOBALS['connection']) . "', erreure numero : ". mysql_errno($GLOBALS['connection']), REQUETE);break;default :dbgStore("Résultat de la requete : '{$result}'", REQUETE);}return $result;}Allez, plutôt que de tout dire, nous allons faire un petit exercice :Quelle est la variable globale ?Oui... La réponse est facile, c'est $GLOBALS['connection'] Cep<strong>en</strong>dant, là n'était point ma question, je reformule :Que conti<strong>en</strong>t la variable globale ? Afin de répondre, nous devons regarder la valeur de retour de la fonctionconnectDB()...Comme par miracle, c'est celle que nous v<strong>en</strong>ons d'écrire juste au dessus... Allez, je vous laisse travailler, la marcheà suivre est la suivante :Regardez la variable passée <strong>en</strong> valeur de retour (mot clef return), puis regardez à quel <strong>en</strong>droit, dans le code plushaut, la variable est modifiée. Quelle valeur pr<strong>en</strong>d-elle ?Eh oui ! $GLOBALS['connection'] sert a stocker l'id<strong>en</strong>tifiant de connection. Pourquoi le stocker, me direz-vous ? Ehbi<strong>en</strong>, car on <strong>en</strong> a besoin. Regardez dans le manuel <strong>PHP</strong>, la fonctionBi<strong>en</strong> <strong>en</strong>t<strong>en</strong>du, nous aurions pu faire :mysql_query <strong>en</strong> a besoin <strong>en</strong> argum<strong>en</strong>t.mysql_query($query, connectDB() );ou bi<strong>en</strong> <strong>en</strong>core- 9 -Les sources prés<strong>en</strong>tés sur cette pages sont libres de droits, et vous pouvez les utiliser à votre conv<strong>en</strong>ance. Par contre la page de prés<strong>en</strong>tation deces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - Bruno Da Silva. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'<strong>en</strong>semble de son cont<strong>en</strong>u : textes, docum<strong>en</strong>ts, images, etc sans l'autorisation expresse de l'auteur.Sinon vous <strong>en</strong>courez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.http://g-rossolini.developpez.com/tutoriels/php/<strong>framework</strong>-debutant/


<strong>Réalisation</strong> <strong>d'un</strong> <strong>framework</strong> <strong>en</strong> <strong>PHP</strong> par Bruno Da Silva$idConnectionBase = connectDB();mysql_query($query, $idConnectionBase );Mais il y a une raison à cela : nous pouvons lancer plus <strong>d'un</strong>e requête par page <strong>PHP</strong>. Ainsi, nous devons conserverl'id<strong>en</strong>tifiant de connexion afin de ne pas avoir à nous reconnecter a chaque fois! D'où la première ligne de code :if (! isset ($GLOBALS['connection']) )A savoir que, à l'instar des fonctions, une instruction if peut s'ét<strong>en</strong>dre sur plusieurs block, d'où les crochets { et }qui délimit<strong>en</strong>t sa portée.Reste une dernière énigme... Mais que veut bi<strong>en</strong> dire ce bloc :switch ($result ) {case (false) :dbgStore("La requete a echoué, message de la BDD : '". mysql_error($GLOBALS['connection']) . "', erreure numero : ". mysql_errno($GLOBALS['connection']), REQUETE);break;default :dbgStore("Résultat de la requete : '{$result}'", REQUETE);}Il suffit de demander, <strong>en</strong>core une fois, à notre bon vieux php.net afin d'avoir une réponse rapide, claire et précise.Si vous voulez une réponse <strong>en</strong>core plus rapide : switch se traduit par "selon" <strong>en</strong> français, c'est à dire que selon lavaleur de la variable qui suit, on va faire tel, tel ou tel traitem<strong>en</strong>t...Le "tel" que je vi<strong>en</strong>s de formuler se note case <strong>en</strong> <strong>PHP</strong>, donc :switch ($result ) {case (false) :echo "faux";break;case (true) :echo "vrai";break;default :echo "ce n'est pas un boolé<strong>en</strong>";}signifie : "Si la variable result a pour valeur :• false, alors afficher "faux" ;• true, alors afficher "vrai" ;• Sinon, afficher "ce n'est pas un boolé<strong>en</strong>".Pour plus d'infos, comme toujours, n'hésitez pas à vous r<strong>en</strong>seigner sur le site de <strong>PHP</strong> <strong>en</strong> <strong>en</strong>trant dans la zone derecherche le mot clef "switch" ou bi<strong>en</strong> le mot clef "break". D'ailleurs, essayez d'aller y jeter un coup d'oeil, si vous neconnaissez pas sa signification, elle est fort intéressante !- 10 -Les sources prés<strong>en</strong>tés sur cette pages sont libres de droits, et vous pouvez les utiliser à votre conv<strong>en</strong>ance. Par contre la page de prés<strong>en</strong>tation deces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - Bruno Da Silva. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'<strong>en</strong>semble de son cont<strong>en</strong>u : textes, docum<strong>en</strong>ts, images, etc sans l'autorisation expresse de l'auteur.Sinon vous <strong>en</strong>courez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.http://g-rossolini.developpez.com/tutoriels/php/<strong>framework</strong>-debutant/


<strong>Réalisation</strong> <strong>d'un</strong> <strong>framework</strong> <strong>en</strong> <strong>PHP</strong> par Bruno Da SilvaVoilà, cette fonction n'a plus aucun secret pour vous ! Heu... att<strong>en</strong>dez une seconde ! Vous croyez avoir tout compris? Alors expliquez moi : quelle est la requête qui est lancée ? P<strong>en</strong>chons-nous sur le sujet... Comm<strong>en</strong>t la fonction quieffectue toujours le même traitem<strong>en</strong>t peut-elle lancer telle ou telle requête, suivant le besoin ?Examinons cette portion de code :Vous vous souv<strong>en</strong>ez, nous avions parlé de paramètres. Eh bi<strong>en</strong> <strong>en</strong> voilà un : la fonction query pr<strong>en</strong>d un paramètre$query et, si on examine le code, ce paramètre est utilisé à ce niveau :$result = mysql_query($query, $GLOBALS['connection']);Si vous voulez savoir ce que fait exactem<strong>en</strong>t la fonction mysql_query, regardez dans la docum<strong>en</strong>tation <strong>PHP</strong>. Sachezjuste que la variable $query conti<strong>en</strong>t une instruction SQL, par exemple :exemple de code SQLSELECT * FROM totoVoilà, nous <strong>en</strong> avons fini avec ces deux fonctions de base. Celles que nous allons étudier dorénavant ne sont pasaussi indisp<strong>en</strong>sables mais vous permettront de vous familiariser <strong>en</strong>core un peu avec le langage <strong>PHP</strong>. De plus, ellespeuv<strong>en</strong>t se révéler fort utiles <strong>en</strong> comparaison à ces deux fonctions que nous v<strong>en</strong>ons de créer qui ne font pas grandchose, au final...II-D - Lancer une requête à l'aide <strong>d'un</strong> fichier SQLLe but de cette partie est de lancer une requête à partir <strong>d'un</strong> fichier SQL.<strong>PHP</strong> possède de nombreuses fonctions de lecture de fichier, parmi lesquelles :• file()• fgets()• fread()• readfile()• file_put_cont<strong>en</strong>ts()• stream_get_cont<strong>en</strong>ts()• file_get_cont<strong>en</strong>ts()Toutes ces fonctions dispos<strong>en</strong>t de telle ou telle particularité qu'il est possible de retrouver, comme toujours, sur le sitewww.php.net. La plus appropriée a nos besoins serait une fonction qui, à partir <strong>d'un</strong> nom de fichier, nous retourneson cont<strong>en</strong>u dans une chaîne de caractères étant donné que c'est un fichier complet qui sera <strong>en</strong>voyé.Ainsi, file_get_cont<strong>en</strong>ts() semble tout à fait adaptée à nos besoins. Voici le code permettant de l'utiliser :- 11 -Les sources prés<strong>en</strong>tés sur cette pages sont libres de droits, et vous pouvez les utiliser à votre conv<strong>en</strong>ance. Par contre la page de prés<strong>en</strong>tation deces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - Bruno Da Silva. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'<strong>en</strong>semble de son cont<strong>en</strong>u : textes, docum<strong>en</strong>ts, images, etc sans l'autorisation expresse de l'auteur.Sinon vous <strong>en</strong>courez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.http://g-rossolini.developpez.com/tutoriels/php/<strong>framework</strong>-debutant/


<strong>Réalisation</strong> <strong>d'un</strong> <strong>framework</strong> <strong>en</strong> <strong>PHP</strong> par Bruno Da Silvafunction QueryFichier($nomFichier) {if (! $file = @file_get_cont<strong>en</strong>ts($nomFichier)) {echo "erreur";return false;}return query($file);}Ainsi, la fonction QueryFichier() pr<strong>en</strong>dra <strong>en</strong> paramètre le nom du fichier et lancera toute seule la requête SQL.Le résultat peut sembler satisfaisant ; cep<strong>en</strong>dant, deux problèmes se profil<strong>en</strong>t.Selon le manuel <strong>PHP</strong>, une requête soumise à la base ne doit pas comporter de point virgule, alors qu'un fichier SQLclôturera généralem<strong>en</strong>t toutes ses requêtes de cette façon (cf. ici, dans la section "Liste de paramètres").Un autre problème est que de nombreux fichiers SQL risqu<strong>en</strong>t de comporter plusieurs instructions, justem<strong>en</strong>tséparées par un point virgule. Ainsi, il faut adapter le code :function QueryFichier($nomFichier) {dbgStore("On va lancer un fichier SQL : " . $nomFichier);if (! $file = @file_get_cont<strong>en</strong>ts($nomFichier)) {dbgStore("Erreur, le fichier n'a pas put etre ouvert", REQUETE);}// On ne peut lancer plusieure requêtes <strong>en</strong> meme temps, de plus, on pas droit// au ";", on les sépare donc <strong>en</strong> plusieurs à l'aide d'explode :$requetes = explode(";", $file) ;foreach ($requetes as $query) {if (strl<strong>en</strong>($query) > 0 ) {return query($query);}}return false;}La partie ajoutée au code précédant permet donc de séparer le fichier SQL <strong>en</strong> autant de requêtes qu'il y a de ";".Pr<strong>en</strong>ons un exemple :fichier SQLINSERT INTO toto (description) VALUES ("0+0");INSERT INTO toto (description) VALUES ("idiot");Le code suivant va être tout d'abord lu par file_get_cont<strong>en</strong>ts() comme une et une seule chaîne de caractère. Ensuite,la fonction explode va remplir la variable $requêtes <strong>d'un</strong> tableau dont chaque élém<strong>en</strong>t est une requête. Ensuite,chacune de ces requêtes va être <strong>en</strong>voyée à la fonction query().Afin de vérifier cette affirmation, exécutons le code suivant :demonstration$var = 'INSERT INTO toto (description) VALUES ("0+0");INSERT INTO toto (description) VALUES ("idiot");';$tab = explode(";", $var);foreach ($tab as $row) {echo $row;- 12 -Les sources prés<strong>en</strong>tés sur cette pages sont libres de droits, et vous pouvez les utiliser à votre conv<strong>en</strong>ance. Par contre la page de prés<strong>en</strong>tation deces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - Bruno Da Silva. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'<strong>en</strong>semble de son cont<strong>en</strong>u : textes, docum<strong>en</strong>ts, images, etc sans l'autorisation expresse de l'auteur.Sinon vous <strong>en</strong>courez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.http://g-rossolini.developpez.com/tutoriels/php/<strong>framework</strong>-debutant/


<strong>Réalisation</strong> <strong>d'un</strong> <strong>framework</strong> <strong>en</strong> <strong>PHP</strong> par Bruno Da Silvademonstrationecho "";}var_dump($tab);Une fois ce code saisi, il suffit de le faire exécuter par le serveur Web, pour voir apparaître la page suivante :page affichéeINSERT INTO toto (description) VALUES ("0+0")INSERT INTO toto (description) VALUES ("idiot")array(3) { [0]=> string(45) "INSERT INTO toto (description) VALUES ("0+0")" [1]=> string(47)"INSERT INTO toto (description) VALUES ("idiot")" [2]=> string(0) "" }Essayez donc d'afficher le code source (m<strong>en</strong>u : "Affichage->source" de votre navigateur), vous verrez que la fonctionvar_dump pr<strong>en</strong>d toute sa valeur ainsi :source de la pageINSERT INTO toto (description) VALUES ("0+0")INSERT INTO toto (description) VALUES ("idiot")array(3) {[0]=>string(45) "INSERT INTO toto (description) VALUES ("0+0")"[1]=>string(47) "INSERT INTO toto (description) VALUES ("idiot")"[2]=>string(0) ""}Le dernier élém<strong>en</strong>t du tableau (d'indice 2) nous permet <strong>en</strong> outre de compr<strong>en</strong>dre cette ligne de code :eviter les strings videsif (strl<strong>en</strong>($query) > 0 ) {La fonction strl<strong>en</strong> (pour string l<strong>en</strong>gth) retourne la longueur de la chaîne passée <strong>en</strong> paramètre. Dans notre cas, ellepermet de vérifier que la chaîne n'est pas vide. En effet, <strong>en</strong>voyer une telle requête à la base de données ne serviraità ri<strong>en</strong>.II-E - Automatiser les requêtesVous v<strong>en</strong>ez d'appr<strong>en</strong>dre à utiliser des fichiers externes. C'est une méthode de développem<strong>en</strong>t saine, car elle permetde regrouper toutes les requête ailleurs que dans le code, ainsi, le jour où une modification de la structure de la base(par exemple), est à pr<strong>en</strong>dre <strong>en</strong> compte, il sera plus facile de ne pas oublier de requête.Cep<strong>en</strong>dant, nous créons un <strong>framework</strong>, ainsi, nous devons laisser le choix a l'utilisateur, et lui permettre d'intégrerses requêtes au sein même de ses fichiers <strong>PHP</strong>. De plus, pourquoi ne pas lui faciliter la tâche? Examinons le codesuivant :requete assistéefunction dbInsert ($table, $champ, $value) {dbgStore("On est dans dbInsert", FASTBDD);- 13 -Les sources prés<strong>en</strong>tés sur cette pages sont libres de droits, et vous pouvez les utiliser à votre conv<strong>en</strong>ance. Par contre la page de prés<strong>en</strong>tation deces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - Bruno Da Silva. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'<strong>en</strong>semble de son cont<strong>en</strong>u : textes, docum<strong>en</strong>ts, images, etc sans l'autorisation expresse de l'auteur.Sinon vous <strong>en</strong>courez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.http://g-rossolini.developpez.com/tutoriels/php/<strong>framework</strong>-debutant/


<strong>Réalisation</strong> <strong>d'un</strong> <strong>framework</strong> <strong>en</strong> <strong>PHP</strong> par Bruno Da Silvarequete assistée//on echape les trois parametres :mysql_escape_string($table);mysql_escape_string($champ);mysql_escape_string($value);$result = query("INSERT INTO $table ($champ) VALUES ($value)");dbgStore("On a lancé la requete d'insertion, le resultat r<strong>en</strong>voyé est : $result", FASTBDD);}return $result;Cette fonction pr<strong>en</strong>d donc trois paramètres, ils pr<strong>en</strong>n<strong>en</strong>t tout leur s<strong>en</strong>s a la ligne suivante :$result = query("INSERT INTO $table ($champ) VALUES ($value)");Ainsi, ils permett<strong>en</strong>t de lancer une requête sans avoir à saisir les mots clefs SQL, ni de se soucier de la syntaxe.En outre, mysql_escape_string permet de s'assurer que les chaînes passées <strong>en</strong> paramètre ont été correctem<strong>en</strong>téchappées.Nous v<strong>en</strong>ons de créer une fonction d'insertion assistée, faisons de même pour les DELETE et les UPDATE :function dbDelete($table, $where) {}dbgStore("On est dans dbDelete", FASTBDD);//on echape les deux parametres :mysql_escape_string($table);mysql_escape_string($where);$result = query("DELETE FROM $table WHERE $where", FASTBDD);dbgStore("On a lancé la requete de delete, le resultat r<strong>en</strong>voyé est : $result", FASTBDD);return $result;function dbUpdate ( $table, $set, $where) {dbgStore("On est dans dbUpdate", FASTBDD);//on echape les trois parametres :mysql_escape_string($table);mysql_escape_string($set);mysql_escape_string($where);$result = query("UPDATE $table SET $set WHERE $where");dbgStore("On a lancé la requete d'update, le resultat r<strong>en</strong>voyé est : $result", FASTBDD);}return $result;- 14 -Les sources prés<strong>en</strong>tés sur cette pages sont libres de droits, et vous pouvez les utiliser à votre conv<strong>en</strong>ance. Par contre la page de prés<strong>en</strong>tation deces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - Bruno Da Silva. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'<strong>en</strong>semble de son cont<strong>en</strong>u : textes, docum<strong>en</strong>ts, images, etc sans l'autorisation expresse de l'auteur.Sinon vous <strong>en</strong>courez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.http://g-rossolini.developpez.com/tutoriels/php/<strong>framework</strong>-debutant/


<strong>Réalisation</strong> <strong>d'un</strong> <strong>framework</strong> <strong>en</strong> <strong>PHP</strong> par Bruno Da SilvaCes fonctions suiv<strong>en</strong>t la même méthodologie, seule le nombre d'argum<strong>en</strong>ts est différ<strong>en</strong>t.II-F - ConclusionAinsi se termine ce chapitre consacré aux bases de données. Le ton était volontairem<strong>en</strong>t (trop ?) Didactique, afinde permettre à tous de profiter de ces bases. N'<strong>en</strong> soyez pas rebutés pour autant : les prochains chapitres serontplus complexes (et plus intéressants ?).Avant d'<strong>en</strong> finir, vous trouverez ci-dessous le code <strong>PHP</strong> complet de la partie base de données. Il comporte quelquesfioritures <strong>en</strong> plus qui n'ont pas été évoquées ici car il peut être préférable <strong>en</strong> termes de performances de s'<strong>en</strong> t<strong>en</strong>iraux fonctions qui ont été fournies précédemm<strong>en</strong>t.Code complet/*** Fonction de connection à la base*/function connectDB() {$hote = "localhost";$user = 'root';$pwd = '';$base = "dtg";}$connexion = mysql_connect($hote , $user , $pwd )or die("Impossible de se connecter à la base");mysql_select_db($base);or die("Impossible de sélectionner base");return $connexion;/*** Fonction query :* Se connecte à la base si nécessaire,* exécute une requête et r<strong>en</strong>voie la ressource résultante*/function query($query) {if (! isset ($GLOBALS['connection']) ) {$GLOBALS['connection'] = connectDB();}dbgStore("On va lancer la requete : {$query}", REQUETE);$result = mysql_query($query, $GLOBALS['connection']);switch ($result ) {case (false) :dbgStore("La requete a echoué, message de la BDD : '". mysql_error($GLOBALS['connection']) . "', erreure numero : ". mysql_errno($GLOBALS['connection']), REQUETE);break;default :dbgStore("Résultat de la requete : '{$result}'", REQUETE);}return $result;}/*** Appelé par la fonction dbInsert (juste <strong>en</strong> dessous)* Vérifie si une insertion est faisable* @param $table : la table cible* @param $champ : les champs qui vont être remplis* @param $value : les valeurs cont<strong>en</strong>antes* @see dbInsert* @see verifUpdate- 15 -Les sources prés<strong>en</strong>tés sur cette pages sont libres de droits, et vous pouvez les utiliser à votre conv<strong>en</strong>ance. Par contre la page de prés<strong>en</strong>tation deces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - Bruno Da Silva. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'<strong>en</strong>semble de son cont<strong>en</strong>u : textes, docum<strong>en</strong>ts, images, etc sans l'autorisation expresse de l'auteur.Sinon vous <strong>en</strong>courez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.http://g-rossolini.developpez.com/tutoriels/php/<strong>framework</strong>-debutant/


<strong>Réalisation</strong> <strong>d'un</strong> <strong>framework</strong> <strong>en</strong> <strong>PHP</strong> par Bruno Da SilvaCode complet* @see verifDelete*/function verifInsert($table, $champ, $value) {$query = "SELECT * FROM $table WHERE ";$champs = explode(",", $champ);$values = explode(",", $value);for ($i = 0; $i < count($champs) ; $i ++) {$query .= $champs[$i] . " = " . $values[$i] ;if ($i != (count($champ) - 1) )$query .= " AND ";}$result = query($query);$nbRow = mysql_num_rows($result);dbgStore("si nbRow == 0, alors on peut insérer : NbRow = $nbRow.", FASTBDD);if ($nbRow == 0 ) {return true;} else {return false;}}/*** Fonction lançant un insertion dans la base* Elle accepte 3 paramètres :* @param $table : la table cible* @param $champ : les champs qui vont être remplis* @param $value : les valeurs cont<strong>en</strong>antes*/function dbInsert ($table, $champ, $value) {dbgStore("On est dans dbInsert", FASTBDD);//on echape les trois parametres :mysql_escape_string($table);mysql_escape_string($champ);mysql_escape_string($value);if ( verifInsert($table, $champ, $value) ) {$result = query("INSERT INTO $table ($champ) VALUES ($value)");dbgStore("On a lancé la requête d'insertion, le résultat r<strong>en</strong>voyé est : $result",FASTBDD);return $result;} else {dbgStore("On n'a pas lancé la requête d'insertion, vérifInsert a déterminé qu'elle étaitinutile",FASTBDD);return false;}}/*** Fonction ne faisant aucun traitem<strong>en</strong>t visible :* elle se cont<strong>en</strong>te de vérifier si un update est adapté,* c'est-à-dire s'il va modifier des données* @param $table : la ou les tables à appeler* @param $set : le cont<strong>en</strong>u de la commande sql SET* @param $where : le cont<strong>en</strong>u de la commande sql WHERE* @return bool* @see dbUpdate* @see verifInsert* @see verifDelete*/function verifUpdate($table, $set, $where) {// On va vérifier si le(s) champ(s) cible(s) existe(nt)dbgStore("Première vérification : le(s) champ(s) cible(s) existe(nt)-t-il(s) ?",FASTBDD);$result = query("SELECT * FROM $table WHERE $where");$nbRow = mysql_num_rows($result);dbgStore("Si nbRow >= 1, alors on peut lancer le second test : NbRow = $nbRow. (Va-t-on écraserquelque chose ?)",- 16 -Les sources prés<strong>en</strong>tés sur cette pages sont libres de droits, et vous pouvez les utiliser à votre conv<strong>en</strong>ance. Par contre la page de prés<strong>en</strong>tation deces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - Bruno Da Silva. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'<strong>en</strong>semble de son cont<strong>en</strong>u : textes, docum<strong>en</strong>ts, images, etc sans l'autorisation expresse de l'auteur.Sinon vous <strong>en</strong>courez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.http://g-rossolini.developpez.com/tutoriels/php/<strong>framework</strong>-debutant/


<strong>Réalisation</strong> <strong>d'un</strong> <strong>framework</strong> <strong>en</strong> <strong>PHP</strong> par Bruno Da SilvaCode completFASTBDD);if ($nbRow >= 1 ) {// Sedonde vérif : va-t-on modifier qque chose ?$where2 = str_replace(",", " AND ", $set);$result = query("SELECT * FROM $table WHERE $where2");$nbRow = mysql_num_rows($result);dbgStore("Si nbRow == 0, alors on peut lancer la requête d'update : NbRow = $nbRow.",FASTBDD);if ($nbRow == 0 ) {return true;}}// Dans les autres cas, on r<strong>en</strong>voie falsereturn false;}/*** Cette fonction lance un update sur la table.* Avant de ce faire elle lance @see verifUpdate qui lui r<strong>en</strong>voie un bool.* En cas de succès, l'update est lancé* @param $table : la ou les tables à appeler* @param $set : le cont<strong>en</strong>u de la commande sql SET* @param $where : le cont<strong>en</strong>u de la commande sql WHERE* @return bool**/function dbUpdate ( $table, $set, $where) {dbgStore("On est dans dbUpdate", FASTBDD);// On échape les trois parameètres :$table = mysql_escape_string($table);$set = mysql_escape_string($set);$where = mysql_escape_string($where);if ( verifUpdate($table, $set, $where) ) {$result = query("UPDATE $table SET $set WHERE $where");dbgStore("On a lancé la requête d'update, le résultat r<strong>en</strong>voyé est : $result",FASTBDD);return $result;} else {dbgStore("On n'a pas lancé la requête d'update, verifInsert a déterminé qu'elle étaitinutile",FASTBDD);return false;}}/*** De même que pour verifUpdate, aucun inpact sur les données, se cont<strong>en</strong>te de r<strong>en</strong>voyer un boolé<strong>en</strong>* @param $table : la / les table(s) à appeler* @param $where : la comamnde where* @see dbDelete* @see verifInsert* @see verifUpdate* @return bool*/function verifDelete($table, $where) {$query = "SELECT * FROM $table WHERE $where";$result = query($query);$nbRow = mysql_num_rows($result);dbgStore("si nbRow > 0, alors on peut delete : NbRow = $nbRow.", FASTBDD);if ($nbRow > 0 ) {return true;} else {return false;}}/**- 17 -Les sources prés<strong>en</strong>tés sur cette pages sont libres de droits, et vous pouvez les utiliser à votre conv<strong>en</strong>ance. Par contre la page de prés<strong>en</strong>tation deces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - Bruno Da Silva. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'<strong>en</strong>semble de son cont<strong>en</strong>u : textes, docum<strong>en</strong>ts, images, etc sans l'autorisation expresse de l'auteur.Sinon vous <strong>en</strong>courez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.http://g-rossolini.developpez.com/tutoriels/php/<strong>framework</strong>-debutant/


<strong>Réalisation</strong> <strong>d'un</strong> <strong>framework</strong> <strong>en</strong> <strong>PHP</strong> par Bruno Da SilvaCode complet* Lance un delete,* @see dbUpdate* @see dbInsert* @see verifDelete* @param $table : la / les table(s) à appeler* @param $where : la comamnde where* @return bool*/function dbDelete($table, $where) {dbgStore("On est dans dbDelete", FASTBDD);// On échape les deux paramètres :$table = mysql_escape_string($table);$where = mysql_escape_string($where);if (verifDelete($table, $where) ) {$result = query("DELETE FROM $table WHERE $where", FASTBDD);dbgStore("On a lancé la requête de delete, le résultat r<strong>en</strong>voyé est : $result",FASTBDD);return $result;} else {dbgStore("On n'a pas lancé la requête de delete, verifDelete a déterminé qu'elle étaitinutile",FASTBDD);return false;}}/*** Fonction permettant de créer une vue* non fonctionel pour MySQL4.x* @return bool : r<strong>en</strong>voie vrai si la vue a été créée, false sinon.*/function dbVue ($nomVue, $select, $from, $where) {if (query("DROP VIEW " . $nomVue) ) {if (query("CREATE VIEW " . $nomVue . " AS SELECT " . $select . " FROM ". $from . " WHERE " . $where) ) {dbgStore("On a lancé la requête de création de vue, le résultat r<strong>en</strong>voyé est : $result",FASTBDD);return true;}dbgStore("On n'a pas lancé la requête de création de vue, car le résultat r<strong>en</strong>voyé par le dropView est : $result",FASTBDD);}return false;}/*** Cette fonction se charge de lire le cont<strong>en</strong>u <strong>d'un</strong> fichier passé <strong>en</strong> paramètre* et de lancer la requête qu'il conti<strong>en</strong>t.* @param $nomFichier : string cont<strong>en</strong>ant le nom du fichier* @return la requête lancée*/function QueryFichierSELECT($nomFichier) {dbgStore("On va lancer un fichier SQL : " . $nomFichier);if (! $file = @file_get_cont<strong>en</strong>ts($nomFichier)) {dbgStore("Erreur, le fichier n'a pas pu être ouvert", REQUETE);}// On ne peut lancer plusieurs requêtes <strong>en</strong> même temps, de plus, on n'a pas droit// au ";", on les sépare donc <strong>en</strong> plusieurs à l'aide d'explode :$requetes = explode(";", $file) ;foreach ($requetes as $query) {if (strl<strong>en</strong>($query) > 0 ) {query($query);}}return nl2br($file);- 18 -Les sources prés<strong>en</strong>tés sur cette pages sont libres de droits, et vous pouvez les utiliser à votre conv<strong>en</strong>ance. Par contre la page de prés<strong>en</strong>tation deces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - Bruno Da Silva. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'<strong>en</strong>semble de son cont<strong>en</strong>u : textes, docum<strong>en</strong>ts, images, etc sans l'autorisation expresse de l'auteur.Sinon vous <strong>en</strong>courez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.http://g-rossolini.developpez.com/tutoriels/php/<strong>framework</strong>-debutant/


<strong>Réalisation</strong> <strong>d'un</strong> <strong>framework</strong> <strong>en</strong> <strong>PHP</strong> par Bruno Da SilvaCode complet}/*** Cette fonction se charge de lire le cont<strong>en</strong>u <strong>d'un</strong> fichier passé <strong>en</strong> paramètre,* de lancer la requête qu'il conti<strong>en</strong>t et de r<strong>en</strong>voyer la ressource.* Si plusieures requêtes sont dans le fichier, seule la première sera lancée* @param $nomFichier : string cont<strong>en</strong>ant le nom du fichier* @return résultat de la requête ou false.*/function QueryFichier($nomFichier) {dbgStore("On va lancer un fichier SQL : " . $nomFichier);if (! $file = @file_get_cont<strong>en</strong>ts($nomFichier)) {dbgStore("Erreure, le fichier n'a pas pu être ouvert", REQUETE);}// On ne peut lancer plusieurs requêtes <strong>en</strong> même temps, de plus, on n'a pas droit// au ";", on les sépare donc <strong>en</strong> plusieurs à l'aide d'explode :$requetes = explode(";", $file) ;foreach ($requetes as $query) {if (strl<strong>en</strong>($query) > 0 ) {return query($query);}}return false;}- 19 -Les sources prés<strong>en</strong>tés sur cette pages sont libres de droits, et vous pouvez les utiliser à votre conv<strong>en</strong>ance. Par contre la page de prés<strong>en</strong>tation deces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - Bruno Da Silva. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'<strong>en</strong>semble de son cont<strong>en</strong>u : textes, docum<strong>en</strong>ts, images, etc sans l'autorisation expresse de l'auteur.Sinon vous <strong>en</strong>courez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.http://g-rossolini.developpez.com/tutoriels/php/<strong>framework</strong>-debutant/


<strong>Réalisation</strong> <strong>d'un</strong> <strong>framework</strong> <strong>en</strong> <strong>PHP</strong> par Bruno Da SilvaIII - Gestion du debugSouv<strong>en</strong>ez-vous, tout au long de la première partie, nous avons utilisé la fonction dbgStore. Et bi<strong>en</strong>, c'est ici qu<strong>en</strong>ous allons découvrir ce qui se cache derrière celle ci. Le code n'étant pas aussi volumineux que dans la premièrepartie, nous allons essayer de l'étudier <strong>en</strong> une seule fois.Si vous avez copiés la fonction dbgStore() fournie dans la première partie, veuillez lasupprimer avant de continuer (tout <strong>en</strong> conservant les "define").III-A - Initialisation de la variable de debugPour le mom<strong>en</strong>t, nous allons ignorer les define placés au début.Comm<strong>en</strong>çons donc par le plus simple :initialisationfunction dbgInit($display = false) {if ($display) {$GLOBALS['dbg'] = array(0=>array('msg'=>'Initialisation du debugging','Niveau'=>'1'));}Cette fonction, qui seras à placer <strong>en</strong> début du programme, définit une variable globale nommée $dbg, si, et seulem<strong>en</strong>tsi le paramètre $display vaut "true". Cela permet de modifier facilem<strong>en</strong>t l'affichage ou non des information desinformations que les fonctions suivantes vont générer. En outre, la fonction dbgStore() ne stockera les info. quilui sont transmises uniquem<strong>en</strong>t si $dbg a été définit (et donc si cette fonction dbgInit() a été appelée. Enfin, nouspouvons noter que $dbg est un tableau.III-B - Stockage dans la variablePassons à la fonction suivante :fonction de stockage des infosfunction dbgStore($msg, $niveau = INDEFINI) {if ( isset( $GLOBALS['dbg']) ) {global $dbg;$dbg[] = array('msg'=>$msg, 'Niveau'=>$niveau);}}Cette fonction, elle aussi, est très simple : elle stocke dans le tableau $dbg définit par la fonction précéd<strong>en</strong>te, untableau cont<strong>en</strong>ant :• Le message de debug passé <strong>en</strong> premier paramètre ;• Le type de ce message, passé <strong>en</strong> second paramètre.Les différ<strong>en</strong>ts types sont définis par les define que nous avons vu précédemm<strong>en</strong>t :- 20 -Les sources prés<strong>en</strong>tés sur cette pages sont libres de droits, et vous pouvez les utiliser à votre conv<strong>en</strong>ance. Par contre la page de prés<strong>en</strong>tation deces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - Bruno Da Silva. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'<strong>en</strong>semble de son cont<strong>en</strong>u : textes, docum<strong>en</strong>ts, images, etc sans l'autorisation expresse de l'auteur.Sinon vous <strong>en</strong>courez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.http://g-rossolini.developpez.com/tutoriels/php/<strong>framework</strong>-debutant/


<strong>Réalisation</strong> <strong>d'un</strong> <strong>framework</strong> <strong>en</strong> <strong>PHP</strong> par Bruno Da SilvaLes definesdefine("TOUS", 0);define("INDEFINI", 1);define("FASTBDD", 4);define( "REQUETE", 5);define( "CONTROLEUR", 6);define( "TRAITEMENT", 7);define( "TEMPLATE", 8);define( "TEMPLATEDYN", 9);III-C - Affichage des donnéesLe tableau $dbg, une fois r<strong>en</strong>seigné de tous les messages sera traité par la fonction dbgAffiche(), placée <strong>en</strong> fin decode, que nous allons voir de suite :Fonction d'affichage des infosfunction dbgAffiche() {//on recupere le nb d'argum<strong>en</strong>ts :$niveauxVoulus = func_get_args();$afficherTous = false;//la boucle ci-dessous est equival<strong>en</strong>te a if (in_array(TOUS)) {$afficherTous = true;}for ($i = 0; $i < count ($niveauxVoulus); $i++ ) {if ($niveauxVoulus[$i] == TOUS) {$afficherTous = true;break;}}//on affiche ceux voulusif ( isset( $GLOBALS['dbg']) ) {global $dbg;echo "";foreach ($dbg as $ligne) {//si ligne[nivea] est dans le tableau des parametre passé//(qui definiss<strong>en</strong>t les niveaux voulus), on affiche)if (in_array ($ligne['Niveau'] ,$niveauxVoulus) || $afficherTous ) {echo "" . $ligne['msg'] . " -- Niveau : " . $ligne['Niveau']. " ";}}echo "";}}Même si cette fonction est la plus complexe de toutes, elle est facilem<strong>en</strong>t assimilable. Étudions la pas à pas :Nombre variable d'argum<strong>en</strong>ts//on recupere le nb d'argum<strong>en</strong>ts :$niveauxVoulus = func_get_args();La fonction func_get_args() est formidable : elle permet de recevoir un nombre quelconque d'argum<strong>en</strong>ts!Ici, elle et utilisée afin de savoir quel type de message afficher. Ces types sont justem<strong>en</strong>t ceux passés <strong>en</strong> secondargum<strong>en</strong>t de dbgStore(). Ainsi, il est possible de filtrer facilem<strong>en</strong>t les messages à afficher.Passons à la suite :- 21 -Les sources prés<strong>en</strong>tés sur cette pages sont libres de droits, et vous pouvez les utiliser à votre conv<strong>en</strong>ance. Par contre la page de prés<strong>en</strong>tation deces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - Bruno Da Silva. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'<strong>en</strong>semble de son cont<strong>en</strong>u : textes, docum<strong>en</strong>ts, images, etc sans l'autorisation expresse de l'auteur.Sinon vous <strong>en</strong>courez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.http://g-rossolini.developpez.com/tutoriels/php/<strong>framework</strong>-debutant/


<strong>Réalisation</strong> <strong>d'un</strong> <strong>framework</strong> <strong>en</strong> <strong>PHP</strong> par Bruno Da SilvaGestion de la constante 'TOUS'$afficherTous = false;//la boucle ci-dessous est equival<strong>en</strong>te a if (in_array(TOUS)) {$afficherTous = true;}for ($i = 0; $i < count ($niveauxVoulus); $i++ ) {if ($niveauxVoulus[$i] == TOUS) {$afficherTous = true;break;}}Afin de faciliter ce filtrage, il est utile de définir une constante signifiant "afficher tous les messages". C'est ce qui aété fait. Encore faut-il gérer l'apparition de cette constante. C'est ce que fait ce code :- Il définit un boolé<strong>en</strong> a false.- Il parcourt tous les paramètres- Si la constante est trouvée, le boolé<strong>en</strong> devi<strong>en</strong>t true- FinUne fois ceci fait, il ne reste plus qu'à afficher les informations désirées :Affichageif ( isset( $GLOBALS['dbg']) ) {global $dbg;echo "";foreach ($dbg as $ligne) {//si ligne['Niveau'] est dans le tableau des parametre passé//(qui definiss<strong>en</strong>t les niveaux voulus), on affiche)if (in_array ($ligne['Niveau'] ,$niveauxVoulus) || $afficherTous ) {echo "" . $ligne['msg'] . " -- Niveau : " . $ligne['Niveau']. " ";}}echo "";}Comme toujours, le script n'affichera les infos que si la variable globale $dbg a été définie.une fois cette vérification, effectuée, le programme comm<strong>en</strong>ce à construire une liste HTML (<strong>en</strong> HTML une liste estconstituée <strong>d'un</strong> tag "ul" (unordered list) <strong>en</strong>globant la liste et <strong>d'un</strong> tag "li" (list item) pour chaque élém<strong>en</strong>t de cette liste).Enfin, le tableau $dbg est parcouru ligne par ligne. Pour chaque ligne, si le type du message correspond à un deceux passés <strong>en</strong> paramètres ou s'il faut les afficher tous alors, on l'affiche, <strong>en</strong>cadré des balises "li".III-D - ConclusionCes trois fonctions vont vous permettre de parsemer votre application de messages de debug perman<strong>en</strong>ts, <strong>en</strong> effet,l'objectif n'est pas d'obt<strong>en</strong>ir la puissance <strong>d'un</strong> var_dump() mais de parsemer vos pages et fonctions personnelles demessages. Ainsi, lors <strong>d'un</strong> bug difficile à résoudre, vous aurez sous les yeux, l'historique des traitem<strong>en</strong>ts effectués.- 22 -Les sources prés<strong>en</strong>tés sur cette pages sont libres de droits, et vous pouvez les utiliser à votre conv<strong>en</strong>ance. Par contre la page de prés<strong>en</strong>tation deces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - Bruno Da Silva. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'<strong>en</strong>semble de son cont<strong>en</strong>u : textes, docum<strong>en</strong>ts, images, etc sans l'autorisation expresse de l'auteur.Sinon vous <strong>en</strong>courez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.http://g-rossolini.developpez.com/tutoriels/php/<strong>framework</strong>-debutant/


<strong>Réalisation</strong> <strong>d'un</strong> <strong>framework</strong> <strong>en</strong> <strong>PHP</strong> par Bruno Da SilvaVous pouvez retrouver le code complet de ces fonctions ci- dessous :Code complet/**sert a initier le moteur de debuggage, si son paramettre est a faux (ou est omis),*aucun debuggage ne sera effectué*/function dbgInit($display = false) {if ($display) {$GLOBALS['dbg'] = array(0=>array('msg'=>'Initialisation du debugging', 'Niveau'=>'1'));}}/**fonction "c<strong>en</strong>trale" : tout au long du script, cette fonction permet de* stocker des message a afficher elle accepte un second paramettre <strong>en</strong> option,* correspondant à une fonctionnalité.* on peut mettre n'importe quel <strong>en</strong>tier, mais il est recomm<strong>en</strong>dé de le definir* <strong>en</strong> constante <strong>en</strong> debut de programme afin d'eviter tout recoupage.*/function dbgStore($msg, $niveau = INDEFINI) {if ( isset( $GLOBALS['dbg']) ) {global $dbg;$dbg[] = array('msg'=>$msg, 'Niveau'=>$niveau);}}/**cette fonction accepte un nombre variable d'argum<strong>en</strong>ts, ceux ci etant <strong>en</strong> fait les <strong>en</strong>tiers* correspondants aux niveaux a afficher. ils serviront de comparaison avec ceux* definis avec dbgStore pour connaitre les message a afficher* ne pas passer de parametre correspond à ne ri<strong>en</strong> afficher.*/function dbgAffiche() {//on recupere le nb d'argum<strong>en</strong>ts :$niveauxVoulus = func_get_args();$afficherTous = false;//la boucle ci-dessous est equival<strong>en</strong>te a if (in_array(TOUS)) {$afficherTous = true;}for ($i = 0; $i < count ($niveauxVoulus); $i++ ) {if ($niveauxVoulus[$i] == TOUS) {$afficherTous = true;break;}}//on affiche ceux voulusif ( isset( $GLOBALS['dbg']) ) {global $dbg;echo "";foreach ($dbg as $ligne) {//si ligne[niveau] est dans le tableau des parametre passé//(qui definiss<strong>en</strong>t les niveaux voulus), on affiche)if (in_array ($ligne['Niveau'] ,$niveauxVoulus) || $afficherTous ) {echo "" . $ligne['msg'] . " -- Niveau : " . $ligne['Niveau']. " ";}}echo "";}}- 23 -Les sources prés<strong>en</strong>tés sur cette pages sont libres de droits, et vous pouvez les utiliser à votre conv<strong>en</strong>ance. Par contre la page de prés<strong>en</strong>tation deces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - Bruno Da Silva. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'<strong>en</strong>semble de son cont<strong>en</strong>u : textes, docum<strong>en</strong>ts, images, etc sans l'autorisation expresse de l'auteur.Sinon vous <strong>en</strong>courez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.http://g-rossolini.developpez.com/tutoriels/php/<strong>framework</strong>-debutant/


<strong>Réalisation</strong> <strong>d'un</strong> <strong>framework</strong> <strong>en</strong> <strong>PHP</strong> par Bruno Da SilvaIV - Modèle MVCNous allons maint<strong>en</strong>ant nous atteler à la définition <strong>d'un</strong> "cadre" permettant de respecter le modèle MVC. Pour ce faire,il nous faut séparer prés<strong>en</strong>tation (Pages HTML) et code métier (code <strong>PHP</strong>). Plusieurs façons de faire sont possibles.Nous allons procéder de la sorte : le code HTML sera dans un répertoire nommé modèle, le code <strong>PHP</strong> sera dansun répertoire nommé vue. Tous deux aurons le même nom de fichier à l'exception de l'ext<strong>en</strong>sion : ".php" pour le<strong>PHP</strong>, ".hmtl" pour le HTML.Afin d'ouvrir ces fichiers, il nous faudra du code <strong>PHP</strong>, ce sera, comme le nomme le modèle MVC, le contrôleur.Cette façon de procéder nous permet de n'avoir qu'une seule page à ouvrir (exemple : "index.php") et cette pages'occupera de choisir la vue et le modèle adaptés.Mais comm<strong>en</strong>t allons nous procéder pour savoir, justem<strong>en</strong>t, la page adaptée? c'est là qu'<strong>en</strong>tr<strong>en</strong>t <strong>en</strong> jeux lesrequêtes HTTP. Fort heureusem<strong>en</strong>t, nous n'aurons pas a toutes les utiliser. Pour la navigation, nous allonsnous cont<strong>en</strong>ter de requêtes "GET". Que va cont<strong>en</strong>ir cette requête? La réponse est : Qu'avons nous besoin qu'elleconti<strong>en</strong>ne, sachant que, pour l'instant, l'inconnue est le nom des fichiers du modèle et de la vue.Nous allons donc utiliser la requête "GET", afin de savoir quelle page afficher. Voyons comm<strong>en</strong>t cette requête HTTPs'utilise :IV-A - Requêtes HTTPRésumons, nous allons utiliser la requête HTTP "GET" afin de naviguer de page <strong>en</strong> page.Si vous voulez un cours complet sur ce sujet, cette page devrait vous plaire. Si vous voulez <strong>en</strong> savoir plus, celle6ciest faite pour vous. Pour les autres, voici une brève explication :Vous avez probablem<strong>en</strong>t déjà utilisé google ceci est une url cont<strong>en</strong>ant, <strong>en</strong> bref :le nom du protocole : "http"l'adresse du serveur : "www.google.fr"l'adresse du fichier sur le serveur : "/search"les requêtes GET : "hl=fr&q=requete+http+GET&meta="Les requêtes GET sont toujours introduites par un "?"Elles constitu<strong>en</strong>t <strong>en</strong> réalité un passage de paramètre du cli<strong>en</strong>t (vous) vers le serveur (www.google.fr). Il estévidemm<strong>en</strong>t possible de passer plusieurs paramètres au serveur, chacun étant séparé <strong>d'un</strong> "&".Chaque paramètre est construit comme suit :• Nom du paramètre• Signe "="• Valeur du paramètre- 24 -Les sources prés<strong>en</strong>tés sur cette pages sont libres de droits, et vous pouvez les utiliser à votre conv<strong>en</strong>ance. Par contre la page de prés<strong>en</strong>tation deces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - Bruno Da Silva. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'<strong>en</strong>semble de son cont<strong>en</strong>u : textes, docum<strong>en</strong>ts, images, etc sans l'autorisation expresse de l'auteur.Sinon vous <strong>en</strong>courez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.http://g-rossolini.developpez.com/tutoriels/php/<strong>framework</strong>-debutant/


<strong>Réalisation</strong> <strong>d'un</strong> <strong>framework</strong> <strong>en</strong> <strong>PHP</strong> par Bruno Da SilvaMaint<strong>en</strong>ant que nous savons utiliser une requête GET coté HTML appr<strong>en</strong>ons a la lire coté serveur : <strong>PHP</strong> possèdedes variables superglobales. La variable $_GET En est un exemple. Cette variable est un tableau cont<strong>en</strong>ant tous lesparamètres GET transmis au serveur. Pour les lire, il suffit de faire :Lecture <strong>d'un</strong> paramètre$_GET['nom_du_parametre'];Par exemple, pour charger le paramètre transmit par l'URI suivante :Li<strong>en</strong> avec passage de paramètrehttp://www.google.fr/search?q=1-1Il suffit de faire, coté <strong>PHP</strong>, pour le charger dans une variable nommée $question :Lecture du paramètre$question = $_GET['q'];Ainsi, $question pr<strong>en</strong>dra pour valeur "1-1". Un autre tableau superglobal permet de récupérer les paramètres GET :$_REQUEST sa particularité est qu'il récupère aussi les paramètres POST. Ceux ci sont transmis lorsque l'on utiliseun formulaire :Code HTML <strong>d'un</strong> formulairePrénom :Nom :Même si vous ne les connaissez pas, vous <strong>en</strong> avez déjà utilisés sans le savoir, <strong>en</strong> effet, tous les champs vouspermettant d'écrire des données dans une page de votre navigateur est <strong>en</strong> réalité un formulaire. Si vous ne mecroyez pas, copiez le code ci dessus dans un fichier texte vierge que vous r<strong>en</strong>ommerez "test.html", puis ouvrez le.Vous constaterez que bi<strong>en</strong> que vous cliquiez sur le bouton "OK", aucune information n'est transmise dans la barred'adresse. Si vous p<strong>en</strong>sez que c'est du a une erreur de code, testez celui ci :Le même code, mais avec la méthode GETPrénom :Nom :Et vous constaterez que l'adresse est actualisée, et possède désormais les paires clef/valeur dans l'url,symptomatiques du passage de paramètre par la méthode GET. Généralem<strong>en</strong>t, la méthode GET est utilisée pour lanavigation, et la méthode POST pour l'utilisation des formulaires. Cep<strong>en</strong>dant, afin de ne pas pr<strong>en</strong>dre de risques, nousallons utiliser la variable $_REQUEST qui permet de récupérer un paramètre qu'il soit passé <strong>en</strong> GET ou <strong>en</strong> POST.- 25 -Les sources prés<strong>en</strong>tés sur cette pages sont libres de droits, et vous pouvez les utiliser à votre conv<strong>en</strong>ance. Par contre la page de prés<strong>en</strong>tation deces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - Bruno Da Silva. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'<strong>en</strong>semble de son cont<strong>en</strong>u : textes, docum<strong>en</strong>ts, images, etc sans l'autorisation expresse de l'auteur.Sinon vous <strong>en</strong>courez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.http://g-rossolini.developpez.com/tutoriels/php/<strong>framework</strong>-debutant/


<strong>Réalisation</strong> <strong>d'un</strong> <strong>framework</strong> <strong>en</strong> <strong>PHP</strong> par Bruno Da SilvaIV-B - Script de récupération des requêtesRepr<strong>en</strong>ons Google comme exemple, allez sur le site de ce moteur de recherche, et lancez plusieurs recherchespuis analysez les paramètres affichés dans la barre d'adresse, vous constaterez que bi<strong>en</strong> que la valeur change <strong>en</strong>fonction de vos demandes, c'est toujours la clef "q" qui conti<strong>en</strong>t cette valeur :• recherche 1• recherche 2• recherche 3• recherche 4• ...La raison est très simple, du coté <strong>PHP</strong>, il est bi<strong>en</strong> plus pratique de connaître la variable a lire dans le tableau$_REQUEST. Faisons de même, et choisissons un nom de variable (Nous procéderons de cette façon pour tout<strong>en</strong>ouveau type de variable a lire : fixer un nom).page semble être un nom tout approprié, il est facilem<strong>en</strong>t compréh<strong>en</strong>sible, non? Ainsi, une fois ce nom choisit, ilsuffit, coté <strong>PHP</strong>, de placer le code suivant :T<strong>en</strong>tative de lecture du paramètre 'page'$page = $_REQUEST['page'];Afin de ne pas avoir a écrire tout le long du code "$_REQUEST['page']", nous stockons cette valeur dans une variable"$page" bi<strong>en</strong> plus rapide a écrire. Cep<strong>en</strong>dant, si vous testez ce code, vous réaliserez qu'il n'est pas fonctionnel. Eneffet, <strong>PHP</strong> ne créer l'élém<strong>en</strong>t 'page' du tableau $_REQUEST que si une requête cont<strong>en</strong>ant cette clef a été reçue.De façon plus explicite :imaginons que vous ayez placé ce code dans un fichier nommé "test.php", et l'ayez placé dans un répertoireaccessible a votre serveur web. ouvrez ce fichier (vous devriez avoir une URL ressemblant a :http://localhost/test/test.phpVous devriez avoir un beau message d'erreur. La solution est très simple : tester l'exist<strong>en</strong>ce de l'élém<strong>en</strong>t page dansle tableau $_REQUEST. Pour ce faire, il existe la fonction isset elle retourne vrai lorsque l'élém<strong>en</strong>t demandé estdéfinit, faux sinon.Repr<strong>en</strong>ons le code :Récupération <strong>d'un</strong> paramètreif ( isset($_REQUEST['page']) )$page = $_REQUEST['page'];Voila, vous avez <strong>en</strong>fin réussit a récupérer une requête HTTP sans risque de bug. Cep<strong>en</strong>dant, le travail n'est pasterminé, <strong>en</strong> effet, nous avons parlés précédemm<strong>en</strong>t des formulaires, sachez que valider un formulaire décl<strong>en</strong>chele chargem<strong>en</strong>t <strong>d'un</strong>e nouvelle page définie dans le formulaire. Bi<strong>en</strong> <strong>en</strong>t<strong>en</strong>du, notre configuration "mono-page" nouspermet de toujours faire recharger la page "index.php", cep<strong>en</strong>dant, la page a afficher (le paramètre GET ayant pourclef la chaîne "page") serait fastidieux, voir, dans certains cas, impossible a transmettre. Que faire? il faudrait, aucas où aucune page n'est spécifiée, savoir quelle est la dernière page qui a été demandée par le cli<strong>en</strong>t... <strong>PHP</strong> estplein de ressources, les sessions sont là pour nous le prouver (pour avoir plus de ressources sur les sessions,- 26 -Les sources prés<strong>en</strong>tés sur cette pages sont libres de droits, et vous pouvez les utiliser à votre conv<strong>en</strong>ance. Par contre la page de prés<strong>en</strong>tation deces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - Bruno Da Silva. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'<strong>en</strong>semble de son cont<strong>en</strong>u : textes, docum<strong>en</strong>ts, images, etc sans l'autorisation expresse de l'auteur.Sinon vous <strong>en</strong>courez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.http://g-rossolini.developpez.com/tutoriels/php/<strong>framework</strong>-debutant/


<strong>Réalisation</strong> <strong>d'un</strong> <strong>framework</strong> <strong>en</strong> <strong>PHP</strong> par Bruno Da Silvar<strong>en</strong>seignez vous par la, ou la). Brièvem<strong>en</strong>t, les sessions permett<strong>en</strong>t de conserver des information propres au cli<strong>en</strong>tlorsqu'il charge une nouvelle page, ainsi, a l'aide de ce mécanisme, il est possible de savoir quelle était la dernièrepage visitée.Une page gérant les sessions doit toujours comm<strong>en</strong>cer par l'instruction session_start() <strong>en</strong> début de programme. Unefois cette fonction saisie, vous pourrez accéder aux variables de session a l'aide du tableau $_SESSION. Cep<strong>en</strong>dant,tout comme pour les autre variables de navigation, il se peut que le tableau soit vide, il convi<strong>en</strong>t donc de le tester.Par exemple, pour savoir si la variable $page a été stockée dans la session, il suffit de faire :Test de définition de la varif ( isset($_SESSION['page']) ) {//serie de traitem<strong>en</strong>ts}En pr<strong>en</strong>ant tous les paramètres énumérés précédemm<strong>en</strong>t <strong>en</strong> compte, il convi<strong>en</strong>t de récupérer la page a afficher al'aide de $_REQUEST, si cette page n'est pas définie, il faut lire la page stockée <strong>en</strong> session, et, si elle n'existe pas...Eh bi<strong>en</strong>, nous n'avons qu'a appeler une page par défaut (qui sera probablem<strong>en</strong>t la page d'accueil). Essayons decoder tout ça :Choix de la page <strong>en</strong> fonction des différ<strong>en</strong>tes possibilités//page a afficher :switch (true) {//1er cas : si on a une nouvelle page a affichercase ( isset($_REQUEST['page']) ) :$page = $_REQUEST['page'];$_SESSION['page'] = $page;break;//sinon, on verifie si il y <strong>en</strong> a une stockée dans la sessioncase ( isset( $_SESSION['page'] ) ) :$page = $_SESSION['page'];break;//sinon, on affiche la page par defautdefault :$page = "defaut";break;}dbgStore("Page a afficher : '$page'", CONTROLEUR);De même que des pages a afficher, il peut arriver qu'une actionde l'utilisateur <strong>en</strong>traîne un traitem<strong>en</strong>t a décl<strong>en</strong>cher (exemple :pour un forum, ajout <strong>d'un</strong> nouvel utilisateur). Bi<strong>en</strong> <strong>en</strong>t<strong>en</strong>du,nous pouvons intégrer ces traitem<strong>en</strong>t aux pages <strong>PHP</strong> de la vue(cf. : modèle MVC), cep<strong>en</strong>dant, il peut être pratique depermettre a plusieurs pages d'accéder au même traitem<strong>en</strong>t...Ainsi, une solution simple existe : <strong>en</strong> pr<strong>en</strong>antexemple sur le paramètre "page", nous allons récupérerun paramètre "traitem<strong>en</strong>t". Le code a ajouter est :if (isset($_REQUEST['traitem<strong>en</strong>t']) ) {}dbgStore("Traitem<strong>en</strong>t a effectuer : '$traitem<strong>en</strong>t'", TRAITEMENT);require_once "traitem<strong>en</strong>ts/" . $traitem<strong>en</strong>t . ".php";- 27 -Les sources prés<strong>en</strong>tés sur cette pages sont libres de droits, et vous pouvez les utiliser à votre conv<strong>en</strong>ance. Par contre la page de prés<strong>en</strong>tation deces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - Bruno Da Silva. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'<strong>en</strong>semble de son cont<strong>en</strong>u : textes, docum<strong>en</strong>ts, images, etc sans l'autorisation expresse de l'auteur.Sinon vous <strong>en</strong>courez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.http://g-rossolini.developpez.com/tutoriels/php/<strong>framework</strong>-debutant/


<strong>Réalisation</strong> <strong>d'un</strong> <strong>framework</strong> <strong>en</strong> <strong>PHP</strong> par Bruno Da Silvale code est bi<strong>en</strong> plus simple que pour la page, car les traitem<strong>en</strong>ts effectués n'ont pas besoin d'être conservés dansla sessions (si vous <strong>en</strong> doutez, essayez de trouver une bonne raison pour les conserver). Nous r<strong>en</strong>controns pour lapremière fois la commande require_once qui, d'après le manuel <strong>PHP</strong> :"se remplace elle-même par le fichier spécifié, un peu comme les commandes de pré processeur C #include"Ici, le fichier spécifié est obligatoirem<strong>en</strong>t dans le répertoire "traitem<strong>en</strong>ts" et porte le nom de la valeur du paramètretransmis auquel on rajoute l'ext<strong>en</strong>sion ".php". Cep<strong>en</strong>dant, un gros souci apparaît : n'importe qui peut décl<strong>en</strong>cher untraitem<strong>en</strong>t! il suffit qu'il teste plusieurs valeurs pour le paramètre "traitem<strong>en</strong>t" transmis par l'url pour pouvoir décl<strong>en</strong>cherdes choses catastrophiques!Il faut donc sécuriser l'accès aux traitem<strong>en</strong>ts, et, pourquoi pas, aux pages. Nous allons donc créer deux fonctiondédiées :validDroitAcces($pageDemandee)etvalidDroitTraitem<strong>en</strong>t($traitem<strong>en</strong>tDemande)dont voici le code :Nos deux fonctions... un peu videsfunction validDroitAcces($pageDemandee) {$pageResultante = $pageDemandee;}return $pageResultante;function validDroitTraitem<strong>en</strong>t($traitem<strong>en</strong>tDemande) {$traintem<strong>en</strong>tResultant = $traitem<strong>en</strong>tDemande;}return $traintem<strong>en</strong>tResultant;Comme vous pouvez le constater, ces fonctions sont... un peu vides! La raison <strong>en</strong> est simple : elles devront êtreréécrites par l'utilisateur de notre <strong>framework</strong>, <strong>en</strong> effet, nous ne pouvons savoir quelle sera sa stratégie de sécurité :'(a ceci, il peut être intéressant d'ajouter un petit "plus" : nous avons définit que nos traitem<strong>en</strong>ts seront dans le répertoiregénérique "traitem<strong>en</strong>t", pourquoi ne pas rajouter un sous répertoire permettant de classer plus finem<strong>en</strong>t ces scripts,et par la même d'affiner la stratégie de sécurité :Version optimiséefunction validDroitTraitem<strong>en</strong>t($typeTDemande, $traitem<strong>en</strong>tDemande) {$typeTResultant = $typeTDemande;$traintem<strong>en</strong>tResultant = $traitem<strong>en</strong>tDemande ;return array($typeTResultant, $traintem<strong>en</strong>tResultant);}Ainsi, notre réception des données se complexifie.Nous allons <strong>en</strong> profiter pour la placer dans une fonction :- 28 -Les sources prés<strong>en</strong>tés sur cette pages sont libres de droits, et vous pouvez les utiliser à votre conv<strong>en</strong>ance. Par contre la page de prés<strong>en</strong>tation deces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - Bruno Da Silva. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'<strong>en</strong>semble de son cont<strong>en</strong>u : textes, docum<strong>en</strong>ts, images, etc sans l'autorisation expresse de l'auteur.Sinon vous <strong>en</strong>courez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.http://g-rossolini.developpez.com/tutoriels/php/<strong>framework</strong>-debutant/


<strong>Réalisation</strong> <strong>d'un</strong> <strong>framework</strong> <strong>en</strong> <strong>PHP</strong> par Bruno Da SilvaFonction recupRequest()function recupRequest() {dbgStore("On est dans recupRequest", CONTROLEUR);//page a afficher :switch (true) {//1er cas : si on a une nouvelle page a affichercase ( isset($_REQUEST['page']) ) :$page = validDroitAcces($_REQUEST['page']);if ($page == null) {//si on est pas autorisé$page = "accesRefuse";} else {//cas normal$_SESSION['page'] = $page;//session_register($page);}break;//sinon, on verifie si il y <strong>en</strong> a une stockée dans la sessioncase ( isset( $_SESSION['page'] ) ) :$page = $_SESSION['page'];break;//sinon, on affiche la page par defautdefault :$page = "defaut";break;}dbgStore("Page a afficher : '$page'", CONTROLEUR);//traitem<strong>en</strong>t a effectuer : (execution des fonctionnalitées validées par l'utilisateur)if (isset($_REQUEST['traitem<strong>en</strong>t']) && isset($_REQUEST['typeTraitem<strong>en</strong>t']) ) {list($typeTraitem<strong>en</strong>t, $traitem<strong>en</strong>t) = validDroitTraitem<strong>en</strong>t($_REQUEST['typeTraitem<strong>en</strong>t'],$_REQUEST['traitem<strong>en</strong>t']);if ($traitem<strong>en</strong>t != null ) {dbgStore("Traitem<strong>en</strong>t a effectuer : '$typeTraitem<strong>en</strong>t/$traitem<strong>en</strong>t'", TRAITEMENT);require_once "traitem<strong>en</strong>ts/" . $typeTraitem<strong>en</strong>t . "/" . $traitem<strong>en</strong>t . ".php";}} else if(isset($_REQUEST['traitem<strong>en</strong>t']) ) {dbgStore("Un traitem<strong>en</strong>t a été demandé, mais aucun type de traitem<strong>en</strong>t n'a été defini",CONTROLEUR);} else if(isset($_REQUEST['typeTraitem<strong>en</strong>t']) ) {dbgStore("Un type de traitem<strong>en</strong>t a été recus, mais aucun traitem<strong>en</strong>t n'a été defini",CONTROLEUR);}return $page;}Cette fonction utilise les deux autres fonctions que nous avons écrites afin de vérifier que l'utilisateur a bi<strong>en</strong> lesdroits qu'il prét<strong>en</strong>d. De plus, la fonction list fait son apparition. Elle permet de récupérer le résultat <strong>d'un</strong> tableau dansplusieurs variables.IV-C - Partie contrôleurAvant d'écrire le contrôleur, nous allons procéder a un grand ménage. Si vous avez testés tous les codes qui ontétés énumérés tout au long de cet article, vous devez avoir une page <strong>PHP</strong> complètem<strong>en</strong>t incompréh<strong>en</strong>sible!Nous allons remédier a cela, <strong>en</strong> utilisant, <strong>en</strong>core une fois la commande include_once. Tout d'abord, nous allonsséparer les différ<strong>en</strong>tes fonctionnalités du code <strong>en</strong> autant de fichiers, que nous allons placer dans un sous répertoir<strong>en</strong>ommé "includes". De plus, nous allons suivre une logique de nommage des fichiers :- 29 -Les sources prés<strong>en</strong>tés sur cette pages sont libres de droits, et vous pouvez les utiliser à votre conv<strong>en</strong>ance. Par contre la page de prés<strong>en</strong>tation deces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - Bruno Da Silva. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'<strong>en</strong>semble de son cont<strong>en</strong>u : textes, docum<strong>en</strong>ts, images, etc sans l'autorisation expresse de l'auteur.Sinon vous <strong>en</strong>courez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.http://g-rossolini.developpez.com/tutoriels/php/<strong>framework</strong>-debutant/


<strong>Réalisation</strong> <strong>d'un</strong> <strong>framework</strong> <strong>en</strong> <strong>PHP</strong> par Bruno Da SilvaNom du fichierbdd.inc.phpdebuggeur.inc.phpdroit_d_acces.inc.phphttp_request.inc.phptemplate.inc.phpfonctionsbase de donnéedebugdroit d'accèsrécupération des requêtesmoteur de templates(non implém<strong>en</strong>té pour le mom<strong>en</strong>t)Nous allons donc nous retrouver avec les répertoires suivants :includestemplatestraitem<strong>en</strong>tsvuesSQLnom du repertoirecont<strong>en</strong>ule code du <strong>framework</strong>les fichiers HTML servant de modèle(a définir par l'utilisateur)les traitem<strong>en</strong>t(a définir par l'utilisateur)les vues (fichiers <strong>PHP</strong>)(a définir par l'utilisateur)les fichiers SQL utilisés par la base dedonnée(a définir par l'utilisateur)Une fois tout le code exporté dans des fichiers a inclure, <strong>en</strong>core faut il l'inclure! C'est ce que nous allons faire :Inclusion du code// les scripts du TEMPLATE : Partie Modelerequire_once "includes/template.inc.php";// Partie Debuggeurrequire_once "includes/debuggeur.inc.php";// Partie BDDrequire_once "includes/bdd.inc.php";// Partie Controleurrequire_once "includes/droit_d_acces.inc.php";require_once "includes/http_request.inc.php";Ensuite, il ne nous reste plus qu'à écrire notre contrôleur. Vous allez voir, le plus dur est déjà fait :Le contrôleur//initialisation des info de debug- 30 -Les sources prés<strong>en</strong>tés sur cette pages sont libres de droits, et vous pouvez les utiliser à votre conv<strong>en</strong>ance. Par contre la page de prés<strong>en</strong>tation deces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - Bruno Da Silva. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'<strong>en</strong>semble de son cont<strong>en</strong>u : textes, docum<strong>en</strong>ts, images, etc sans l'autorisation expresse de l'auteur.Sinon vous <strong>en</strong>courez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.http://g-rossolini.developpez.com/tutoriels/php/<strong>framework</strong>-debutant/


<strong>Réalisation</strong> <strong>d'un</strong> <strong>framework</strong> <strong>en</strong> <strong>PHP</strong> par Bruno Da SilvaLe contrôleurdbgInit(true);//recuperation des variables de navigation dont le fichier a afficher$page = recupRequest();///// affichage de la nouvelle page//chargem<strong>en</strong>t du template (appel du modele)$template =& chargeTemplate("templates\\" . $page . ".html");if ($template == null) {//si page = null : le fichier de template demandé n'existe pas, on bloque la navigationecho "Erreure de navigation, le fichier demandé n'existe pas!";} else {//chargem<strong>en</strong>t de la partie dynamique (appel de la vue)require_once "vues\\" . $page . ".php";//affichage du resultataffiche($template);}//affichage des messages de debugdbgAffiche(TOUS);//a ce niveau, tous les affichages ont étés fait, on finit donc le programme.Vous vous demandez sûrem<strong>en</strong>t pourquoi ce code n'est pas placé dans une fonction? Tout simplem<strong>en</strong>t car, lorsqu'oneffectue un "include" le code inclut a la même portée que le code qui l'a appelé, cette partie ayant une portée globale,cela permet au code inclut d'<strong>en</strong> bénéficier, de même, si le code inclut effectue lui-même des includes, le chemin defichier sera constant (celui de notre contrôleur, et non celui de localisation du script).Reste une grande énigme : que peut bi<strong>en</strong> signifier la fonction chargeTemplate()? R<strong>en</strong>dez-vous au prochain et dernierchapitre afin de le savoir.IV-D - ConclusionCe chapitre se termine très rapidem<strong>en</strong>t. En effet, respecter l'architecture MVC n'est pas bi<strong>en</strong> compliqué, mais, surtoutest fortem<strong>en</strong>t dép<strong>en</strong>dant du chapitre suivant, du moins pour notre cas : <strong>en</strong> effet, nous allons utiliser un moteur detemplates.Comme toujours, pour finir, vous pouvez retrouver le code complet de notre contrôleur ci-dessous. Remarquez queles defines se retrouv<strong>en</strong>t <strong>en</strong> début de programme, et non dans un fichier inclus, ceci afin de faciliter la création d<strong>en</strong>ouveaux types de messages pour le deboggueur.


<strong>Réalisation</strong> <strong>d'un</strong> <strong>framework</strong> <strong>en</strong> <strong>PHP</strong> par Bruno Da Silvadefine( "TEMPLATE", 8);// pour le moteur de templatedefine( "TEMPLATEDYN", 9);// aussi pour le moteur de template, mais specifique à la fusion// les scripts du TEMPLATE : Partie Modelerequire_once "includes/template.inc.php";// Partie Debuggeurrequire_once "includes/debuggeur.inc.php";// Partie BDDrequire_once "includes/bdd.inc.php";// Partie Controleurrequire_once "includes/droit_d_acces.inc.php";require_once "includes/http_request.inc.php";//on ne peut pas mettre le reste dans une fonction car la partie//dynamique a besoin d'avoir une portée de ses variables globale.//le code qui suit est donc le point d'<strong>en</strong>trée du programme ://initialisation des infos de debugdbgInit(true);//recuperation des variables de navigation dont le fichier a afficher$page = recupRequest();///// affichage de la nouvelle page//chargem<strong>en</strong>t du template (appel du modele)$template =& chargeTemplate("templates\\" . $page . ".html");if ($template == null) {//si page = null : le fichier de template demandé n'existe pas, on bloque la navigationecho "Erreur de navigation, le fichier demandé n'existe pas!";} else {//chargem<strong>en</strong>t de la partie dynamique (appel de la vue)require_once "vues\\" . $page . ".php";//affichage du resultataffiche($template);}//affichage des messages de debugdbgAffiche(TOUS);//a ce niveau, tous les affichages ont etes fait, on finit donc le programme.?>- 32 -Les sources prés<strong>en</strong>tés sur cette pages sont libres de droits, et vous pouvez les utiliser à votre conv<strong>en</strong>ance. Par contre la page de prés<strong>en</strong>tation deces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - Bruno Da Silva. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'<strong>en</strong>semble de son cont<strong>en</strong>u : textes, docum<strong>en</strong>ts, images, etc sans l'autorisation expresse de l'auteur.Sinon vous <strong>en</strong>courez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.http://g-rossolini.developpez.com/tutoriels/php/<strong>framework</strong>-debutant/


<strong>Réalisation</strong> <strong>d'un</strong> <strong>framework</strong> <strong>en</strong> <strong>PHP</strong> par Bruno Da SilvaV - Moteur de templatesV-A - IntroductionBi<strong>en</strong> que nous ayons vu brièvem<strong>en</strong>t une définition de ce qu'est un moteur de templates, il peut être sage de s'yarrêter un mom<strong>en</strong>t :Leur utilisation divise le monde informatique : certains cri<strong>en</strong>t a l'hérésie, a la perte de performance... Si le sujet vousintéresse, vous pouvez lire le cours de Christophe Sion.Une dernière mise <strong>en</strong> garde : les moteurs de templates sont décriés, <strong>en</strong>tre autre, car ils <strong>en</strong>traîn<strong>en</strong>t une baisse deperformance. Je peux vous assurer que celui que vous allez voir n'est <strong>en</strong> aucun cas optimisé, il n'a aucune autreprét<strong>en</strong>tion que d'être un outil didactique. Si vous décidez de l'utiliser, vous <strong>en</strong> avez bi<strong>en</strong> sûr le droit, mais c'est à vosrisques et périls (comme pour tout le reste du programme ;p).V-B - Chargem<strong>en</strong>t du fichierLa première fonction est loin d'être la plus complexe : nous allons tout simplem<strong>en</strong>t ouvrir le fichier HTML cont<strong>en</strong>antle template.Fonction chargeTemplate()function chargeTemplate($fichier) {//on ouvre le fichier, et on affiche pas d'erreure si elle arrive : r<strong>en</strong>voyer null suffit!if (! $file = @file_get_cont<strong>en</strong>ts($fichier)) {$file = null;}$file = ouvreSousFichiers($file);return $file;}Seule une fonction doit vous poser problème : ouvreSousFichiers() : nous allons voir tout de suite son code :Fonction ouvreSousFichiers()function ouvreSousFichiers(&$template) {//definnition du motif de recherche :$motif = "#\[ *fileOp<strong>en</strong> *; *([[:alnum:]_/]*) *\]#i"; //ex : "#[ fileOp<strong>en</strong>; toto]#"while ( preg_match($motif, $template, $balises)) {//on stocke la balise pour la remplacer plus tard$balise = $balises[0];$nomFichier = "templates/" . $balises[1] . ".html";if (! $file = @file_get_cont<strong>en</strong>ts($nomFichier) ) {dbgStore("Erreure, le fichier a inserer dans le template n'a pas put etre ouvert : ". $nomFichier, TEMPLATE);return $template;}$template = str_replace($balise, $file, $template) ;}return $template;}Ici, ça comm<strong>en</strong>ce à se corser! Mais accrochez-vous, tout le reste du code va se voir truffé de ce mystérieuxpreg_match Et toute la difficulté consiste à compr<strong>en</strong>dre la signification de la chaîne qui lui est passée <strong>en</strong> paramètre :- 33 -Les sources prés<strong>en</strong>tés sur cette pages sont libres de droits, et vous pouvez les utiliser à votre conv<strong>en</strong>ance. Par contre la page de prés<strong>en</strong>tation deces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - Bruno Da Silva. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'<strong>en</strong>semble de son cont<strong>en</strong>u : textes, docum<strong>en</strong>ts, images, etc sans l'autorisation expresse de l'auteur.Sinon vous <strong>en</strong>courez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.http://g-rossolini.developpez.com/tutoriels/php/<strong>framework</strong>-debutant/


<strong>Réalisation</strong> <strong>d'un</strong> <strong>framework</strong> <strong>en</strong> <strong>PHP</strong> par Bruno Da Silva"#\[ *fileOp<strong>en</strong> *; *([[:alnum:]_/]*) *\]#"; //ex : "#[ var; toto]#"Cette chaîne est uneexpression régulière (PCRE)Les expressions régulières sont un langages a elles seules, elles serv<strong>en</strong>t a codifier de façon très puissante une chaînede caractère a rechercher, de nombreux tutoriaux sont disponibles à leur sujet, notamm<strong>en</strong>tRossolini.Nous n'allons pas nous attarder sur ce domaine, sachez juste que :• "/[" : est un échappem<strong>en</strong>t du caractère "[" qui a une signification particulière• "*" : signifie que le caractère précéd<strong>en</strong>t doit être prés<strong>en</strong>t de 0 a n foiscelui de Guillaume• "[]" : indique une liste, tout caractère prés<strong>en</strong>t dans cette liste est acceptable, de plus, les crochets peuv<strong>en</strong>têtres imbriqués.• "[:alnum:]" : est un alias pour alpha numérique ce qui signifie, bi<strong>en</strong> <strong>en</strong>t<strong>en</strong>du que tout caractère alphanumérique doit être accepté,• "[[:alnum:]_/]*" : signifie donc "de 0 a n fois peuv<strong>en</strong>t être prés<strong>en</strong>t : a-zA-Z0-9_/"Ainsi, le programme agit de la sorte :tant qu'une balise correspondant à l'expression régulière est trouvée, on ouvre le fichier HTML correspondant, et onremplace (cf. : str_replace()) la balise par le fichier ouvert.Passons à la fonction suivante :V-C - Fonction afficheCette fonction est la dernière du moteur appelée, au cours de l'exécution, d'autres fonction vont être exécutées.Cep<strong>en</strong>dant, au vu de leur complexité, mieux vaut les voir <strong>en</strong> dernier.Le principe de cette fonction est très simple :elle va effectuer une substitution des balises de type :[var;nomDeVariable]avec nomDeVariable qui est un nom de variable globale de <strong>PHP</strong>.Ensuite, un simple echo va permettre d'afficher le template sur la sortie standard (l'<strong>en</strong>voyer au navigateur) :Fonction affichefunction affiche(&$template) {//definition du motif des balises fixes$motif = "#\[ *var *; *([[:alnum:]_]*) *\]#i"; //ex : "#[ var; toto]#"//on charge les balises dans le tableau baliseswhile ( preg_match($motif, $template, $balises)) {//on stocke la balise pour la remplacer plus tard- 34 -Les sources prés<strong>en</strong>tés sur cette pages sont libres de droits, et vous pouvez les utiliser à votre conv<strong>en</strong>ance. Par contre la page de prés<strong>en</strong>tation deces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - Bruno Da Silva. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'<strong>en</strong>semble de son cont<strong>en</strong>u : textes, docum<strong>en</strong>ts, images, etc sans l'autorisation expresse de l'auteur.Sinon vous <strong>en</strong>courez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.http://g-rossolini.developpez.com/tutoriels/php/<strong>framework</strong>-debutant/


<strong>Réalisation</strong> <strong>d'un</strong> <strong>framework</strong> <strong>en</strong> <strong>PHP</strong> par Bruno Da SilvaFonction affiche$balise = $balises[0];$variable = $balises[1];if (isset($GLOBALS[$variable])) {dbgStore("On va substituer $balise par {$variable} qui possede la valeur :{$GLOBALS[$variable]}",TEMPLATE);$template = str_replace($balise, $GLOBALS[$variable], $template)or die("erreure lors de l'insertion du substitu : non trouvé");} else {dbgStore("La variable globale '$variable' n'a pas ete trouvée..." ." On la remplace par ''", TEMPLATE);$template = str_replace($balise, "", $template)or die("erreure lors de l'insertion du substitu : non trouvé");}}}//on <strong>en</strong>voie le template sur la sortie standardecho $template;Plus qu'une fonction et vous retrouvez votre liberté ! Mais att<strong>en</strong>tion, c'est une fonction championne! Si vous avez eudu mal à compr<strong>en</strong>dre les codes précéd<strong>en</strong>ts, accrochez vous!Afin de faciliter votre travail, nous allons l'étudier pas à pas.Tout d'abord, son but : remplacer une série de "blocs" situés dans le template HTML par le résultat <strong>d'un</strong>e requêteau serveur MySQL.Le "bloc" se prés<strong>en</strong>tera ainsi :Exemple <strong>d'un</strong> bloc a substituer[bloc1;block = li]nom : [bloc1; nom], prénom : [bloc1; pr<strong>en</strong>om ] ,adresse : [ bloc1 ;adresse]Ce code est composé de deux types de balises :Le premier type définit quelle est l'ét<strong>en</strong>due du code HTML a répéter : ici le tag "li"Le second informe le programme sur la colonne (du résultat de la requête SQL) qui doit remplacer notre balise.Étudions le code qui permet de trouver le code HTML à dupliquer :function mergeDyn($indexBalise, $resultQuery) {global $template;dbgStore("on est dans MergeDyn", TEMPLATEDYN);$motifBaliseBlock = "#\[ *$indexBalise *; *block *= *([[:alnum:]]+) *\]#i";- 35 -Les sources prés<strong>en</strong>tés sur cette pages sont libres de droits, et vous pouvez les utiliser à votre conv<strong>en</strong>ance. Par contre la page de prés<strong>en</strong>tation deces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - Bruno Da Silva. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'<strong>en</strong>semble de son cont<strong>en</strong>u : textes, docum<strong>en</strong>ts, images, etc sans l'autorisation expresse de l'auteur.Sinon vous <strong>en</strong>courez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.http://g-rossolini.developpez.com/tutoriels/php/<strong>framework</strong>-debutant/


<strong>Réalisation</strong> <strong>d'un</strong> <strong>framework</strong> <strong>en</strong> <strong>PHP</strong> par Bruno Da Silva//ex : "#[ balise1; block= toto]#"preg_match($motifBaliseBlock, $template, $blockNom);$baliseMere = $blockNom[0]; //recuperation de la balise correspondante trouvée$blockNom = ($blockNom[1]);$blockDebut = "";$blockFin = str_replace(") avant la suite du motif.Un exemple peut être plus parlant :Exempletexte a ne pas pr<strong>en</strong>dre <strong>en</strong> compte[bloc1; block = li]...- 36 -Les sources prés<strong>en</strong>tés sur cette pages sont libres de droits, et vous pouvez les utiliser à votre conv<strong>en</strong>ance. Par contre la page de prés<strong>en</strong>tation deces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - Bruno Da Silva. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'<strong>en</strong>semble de son cont<strong>en</strong>u : textes, docum<strong>en</strong>ts, images, etc sans l'autorisation expresse de l'auteur.Sinon vous <strong>en</strong>courez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.http://g-rossolini.developpez.com/tutoriels/php/<strong>framework</strong>-debutant/


<strong>Réalisation</strong> <strong>d'un</strong> <strong>framework</strong> <strong>en</strong> <strong>PHP</strong> par Bruno Da SilvaExempleDans cet exemple, si nous n'avions pas mis$blockDebut(.(?


<strong>Réalisation</strong> <strong>d'un</strong> <strong>framework</strong> <strong>en</strong> <strong>PHP</strong> par Bruno Da Silvacomporte une par<strong>en</strong>thèse permettant d'isoler la chaîne située après le ";" (ex : dans [bloc1; nom], la chaîne "nom"sera isolée et remplacée par une colonne de la requête s'appelant "nom". Au fur et à mesure, $mergedBlock se voitrempli des résultats de la base, tout <strong>en</strong> gardant la mise <strong>en</strong> forme originale (tags ...).V-D - ConclusionVoilà, notre programme est terminé, il est apte à accueillir un site <strong>en</strong> <strong>PHP</strong>, et d'offrir à son auteur un support de tousles concepts évoqués plus haut.- 38 -Les sources prés<strong>en</strong>tés sur cette pages sont libres de droits, et vous pouvez les utiliser à votre conv<strong>en</strong>ance. Par contre la page de prés<strong>en</strong>tation deces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - Bruno Da Silva. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'<strong>en</strong>semble de son cont<strong>en</strong>u : textes, docum<strong>en</strong>ts, images, etc sans l'autorisation expresse de l'auteur.Sinon vous <strong>en</strong>courez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.http://g-rossolini.developpez.com/tutoriels/php/<strong>framework</strong>-debutant/


<strong>Réalisation</strong> <strong>d'un</strong> <strong>framework</strong> <strong>en</strong> <strong>PHP</strong> par Bruno Da SilvaVI - Mode d'emploiMais au fait, comm<strong>en</strong>t s'utilise ce <strong>framework</strong>?En voilà une belle question!Pour comm<strong>en</strong>cer, il faut créer une page d'accueil nommée "defaut.html" (nous avons programmé cette page commepage par défaut <strong>en</strong> IV-B) et située dans le sous répertoire "templates"./templates/defaut.htmlAccueilBi<strong>en</strong>v<strong>en</strong>ue sur cette version de demonstration du <strong>framework</strong>!cliquez ici pour accéder a lapage de demonstration!Dans un souci de vulgarisation, le code HTML fourni <strong>en</strong> exemple n'est pas aux normes,cep<strong>en</strong>dant, il répond à nos besoins : d'aspect moins complexe, il est cep<strong>en</strong>dant affichépar tous les navigateurs.Si vous essayez de tester cette page, vous aurez droit à un beau message d'erreur. En effet, le contrôleur chercheà charger son homonyme coté <strong>PHP</strong>, créez donc un fichier vide dans le répertoire "vues" : nommé defaut.php, puistestez le tout.Créons maint<strong>en</strong>ant la page que nous avons mise <strong>en</strong> li<strong>en</strong>. Att<strong>en</strong>tion, <strong>en</strong> notant page=templatedans les paramètresdu li<strong>en</strong>, nous v<strong>en</strong>ons de conditionner le nom des deux pages à créer :./templates/template.htmldemonstration des templates[ test1; block=li][test1; nom][test1;pr<strong>en</strong>om]Nom- 39 -Les sources prés<strong>en</strong>tés sur cette pages sont libres de droits, et vous pouvez les utiliser à votre conv<strong>en</strong>ance. Par contre la page de prés<strong>en</strong>tation deces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - Bruno Da Silva. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'<strong>en</strong>semble de son cont<strong>en</strong>u : textes, docum<strong>en</strong>ts, images, etc sans l'autorisation expresse de l'auteur.Sinon vous <strong>en</strong>courez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.http://g-rossolini.developpez.com/tutoriels/php/<strong>framework</strong>-debutant/


<strong>Réalisation</strong> <strong>d'un</strong> <strong>framework</strong> <strong>en</strong> <strong>PHP</strong> par Bruno Da Silva./templates/template.htmlPrénom[test2;block=tr][test2;nom][test2;pr<strong>en</strong>om]Prénom :Nom :retoursCette page, un peu plus complexe, implém<strong>en</strong>te deux champs réplicables : "test1" et "test2". Afin de les exploiter,nous allons écrire le code <strong>PHP</strong> associé :./vues/template.phpdbgStore("Nous sommes dans './vues/template.php' et allons t<strong>en</strong>ter d'utiliser le bloc 'test1'");$result = query("SELECT nom, pr<strong>en</strong>om FROM personne ");mergeDyn("test1", $result);Att<strong>en</strong>tion, p<strong>en</strong>sez toujours à rajouter les tags aux scripts <strong>PHP</strong>.Bon, vous p<strong>en</strong>sez que ça va marcher ?Essayez pour voir !En bas de page, grâce aux fonctions de debug, vous devriez obt<strong>en</strong>ir des information quand à l'erreur qui ne manquerapas de surv<strong>en</strong>ir :N'oublions pas que nous sommes <strong>en</strong> train de créer une version de démonstration, nous partons donc de zéro. Ainsi,aucune base de donnée n'existe <strong>en</strong>core, la requête ne peut donc qu'échouer. Créons donc une base de test :Création de la baseCREATE DATABASE tuto;USE tuto;CREATE TABLE `personne` (- 40 -Les sources prés<strong>en</strong>tés sur cette pages sont libres de droits, et vous pouvez les utiliser à votre conv<strong>en</strong>ance. Par contre la page de prés<strong>en</strong>tation deces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - Bruno Da Silva. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'<strong>en</strong>semble de son cont<strong>en</strong>u : textes, docum<strong>en</strong>ts, images, etc sans l'autorisation expresse de l'auteur.Sinon vous <strong>en</strong>courez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.http://g-rossolini.developpez.com/tutoriels/php/<strong>framework</strong>-debutant/


<strong>Réalisation</strong> <strong>d'un</strong> <strong>framework</strong> <strong>en</strong> <strong>PHP</strong> par Bruno Da SilvaCréation de la base`nom` varchar(100) NOT NULL default '',`pr<strong>en</strong>om` varchar(100) NOT NULL default '');INSERT INTO `personne` (`nom`,`pr<strong>en</strong>om`) VALUES('pierre','dupont'),('alain','dupontel'),('ichigo','kazuma'),('molko','brian');Voilà, nous pouvons dorénavant visualiser la page. Vous constaterez que seules les balises "test1" ont été utilisées.Modifions le code <strong>PHP</strong> :Nouvelle versiondbgStore("Nous sommes dans './vues/template.php' et allons t<strong>en</strong>ter d'utiliser le bloc 'test2'");$result = query("SELECT nom, pr<strong>en</strong>om FROM personne ");mergeDyn("test2", $result);Cette fois ci, seules les balises "test2" sont utilisées par le moteur.Maint<strong>en</strong>ant, nous allons lancer une requête SQL : supprimez l'attribut "style="display:none;"" de la balise form.Très bi<strong>en</strong>, maint<strong>en</strong>ant, lorsque ce formulaire est rempli, il ne se passe ri<strong>en</strong>. C'est tout à fait normal, il faut le gérercoté <strong>PHP</strong> :Ajout <strong>d'un</strong> <strong>en</strong>registrem<strong>en</strong>tdbgStore("Nous sommes dans './vues/template.php' et allons utiliser un formulaire");if ( isset($_REQUEST['nom']) && isset($_REQUEST['pr<strong>en</strong>om']) ) {dbgStore("Une requête d'insertion va etrre réalisée");$table = "personne";$champ = "nom, pr<strong>en</strong>om";$value = $_REQUEST['nom'] . "," . $_REQUEST['pr<strong>en</strong>om'];dbInsert ($table, $champ, $value);}$result = query("SELECT nom, pr<strong>en</strong>om FROM personne ");mergeDyn("test2", $result);Comme toujours, nous allons tester si aucun bug ne fait son apparition... Et là, c'est le drame ! la requête ne fonctionnepas. En effet, <strong>en</strong> analysant les message de la fonction de debug, nous constatons :messageOn va lancer la requête : INSERT INTO personne (nom, pr<strong>en</strong>om) VALUES (Mouse,Mickey)-- Niveau : 5 La requête a échoué, message de la BDD : 'Champ 'Mouse' inconnu dansfield list', erreur numero : 1054 -- Niveau : 5Le bilan est que nous essayons d'insérer des chaînes de caractères sans les <strong>en</strong>tourer de guillemets. Corrigeonsce problème :Code corrigé- 41 -Les sources prés<strong>en</strong>tés sur cette pages sont libres de droits, et vous pouvez les utiliser à votre conv<strong>en</strong>ance. Par contre la page de prés<strong>en</strong>tation deces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - Bruno Da Silva. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'<strong>en</strong>semble de son cont<strong>en</strong>u : textes, docum<strong>en</strong>ts, images, etc sans l'autorisation expresse de l'auteur.Sinon vous <strong>en</strong>courez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.http://g-rossolini.developpez.com/tutoriels/php/<strong>framework</strong>-debutant/


<strong>Réalisation</strong> <strong>d'un</strong> <strong>framework</strong> <strong>en</strong> <strong>PHP</strong> par Bruno Da SilvaCode corrigédbgStore("Nous sommes dans './vues/template.php' et allons utiliser un formulaire");if ( isset($_REQUEST['nom']) && isset($_REQUEST['pr<strong>en</strong>om']) ) {dbgStore("Une requête d'insertion va etrre réalisée");$table = "personne";$champ = "nom, pr<strong>en</strong>om";$value = "'{$_REQUEST['nom']}', '{$_REQUEST['pr<strong>en</strong>om']}'";dbInsert ($table, $champ, $value);}$result = query("SELECT nom, pr<strong>en</strong>om FROM personne ");mergeDyn("test2", $result);Voilà, le code fonctionne, vous pouvez constater que votre saisie dans le formulaire a bi<strong>en</strong> été insérée dans la base.Une autre façon de faire aurait été d'utiliser une fonction dédiée : repr<strong>en</strong>ons le code, afin d'<strong>en</strong> créer une. Pour lefichier HTML, éditez la ligne suivante :Ligne à réécrireEt remplacez-la par :Nouvelle ligne - choix 1Vous pouvez, de même, déplacer la partie suivante du code <strong>PHP</strong> :Partie du code à déplacerif ( isset($_REQUEST['nom']) && isset($_REQUEST['pr<strong>en</strong>om']) ) {dbgStore("Une requête d'insertion va etrre réalisée");$table = "personne";$champ = "nom, pr<strong>en</strong>om";$value = "'{$_REQUEST['nom']}', '{$_REQUEST['pr<strong>en</strong>om']}'";dbInsert ($table, $champ, $value);}Le fichier dans lequel coller ce code est déterminé par les paramètres que nous avons transmis via le formulaire :• traitem<strong>en</strong>t="ajoutPersonne"• typeTraitem<strong>en</strong>t="BDD"Il faut donc créer un fichier nommé ajoutPersonne.php qui doit être situé dans l'aboresc<strong>en</strong>ce suivante :./traitem<strong>en</strong>ts/BDD (<strong>en</strong> effet, tous les traitem<strong>en</strong>t sont dans le répertoire traitem<strong>en</strong>ts, le sous répertoire, quant à lui,est conditionné par la valeur de "typeTraitem<strong>en</strong>t")- 42 -Les sources prés<strong>en</strong>tés sur cette pages sont libres de droits, et vous pouvez les utiliser à votre conv<strong>en</strong>ance. Par contre la page de prés<strong>en</strong>tation deces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - Bruno Da Silva. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'<strong>en</strong>semble de son cont<strong>en</strong>u : textes, docum<strong>en</strong>ts, images, etc sans l'autorisation expresse de l'auteur.Sinon vous <strong>en</strong>courez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.http://g-rossolini.developpez.com/tutoriels/php/<strong>framework</strong>-debutant/


<strong>Réalisation</strong> <strong>d'un</strong> <strong>framework</strong> <strong>en</strong> <strong>PHP</strong> par Bruno Da SilvaP<strong>en</strong>sez bi<strong>en</strong> <strong>en</strong>t<strong>en</strong>du à ajouter un message de debug. Le fichier final devrait ressembler à :./traitem<strong>en</strong>ts/BDD/ajoutPersonne.phpdbgStore("Nous somme dans ajoutPersonne.php");if ( isset($_REQUEST['nom']) && isset($_REQUEST['pr<strong>en</strong>om']) ) {dbgStore("Une requête d'insertion va etrre réalisée");$table = "personne";$champ = "nom, pr<strong>en</strong>om";$value = "'{$_REQUEST['nom']}', '{$_REQUEST['pr<strong>en</strong>om']}'";dbInsert ($table, $champ, $value);}Voilà, vous devriez être <strong>en</strong> mesure d'utiliser cet outil que nous v<strong>en</strong>ons de programmer :)Si vous avez bi<strong>en</strong> suivi, vous saurez au'il ne faut pas utiliser le <strong>framework</strong> que nous v<strong>en</strong>onsde créer ! Il est largem<strong>en</strong>t préférable d'<strong>en</strong> choisir un qui a été développé pour une utilisationréelle (pas comme celui-ci, utile uniquem<strong>en</strong>t pour la démonstration).- 43 -Les sources prés<strong>en</strong>tés sur cette pages sont libres de droits, et vous pouvez les utiliser à votre conv<strong>en</strong>ance. Par contre la page de prés<strong>en</strong>tation deces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - Bruno Da Silva. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'<strong>en</strong>semble de son cont<strong>en</strong>u : textes, docum<strong>en</strong>ts, images, etc sans l'autorisation expresse de l'auteur.Sinon vous <strong>en</strong>courez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.http://g-rossolini.developpez.com/tutoriels/php/<strong>framework</strong>-debutant/


<strong>Réalisation</strong> <strong>d'un</strong> <strong>framework</strong> <strong>en</strong> <strong>PHP</strong> par Bruno Da SilvaVII - Conclusion GénéraleVous v<strong>en</strong>ez de créer un <strong>framework</strong>. Cep<strong>en</strong>dant, ne chantez pas victoire trop vite : il n'est certainem<strong>en</strong>t pas utilisabletel quel, il possède trop de lacunes. Pour vous <strong>en</strong> faire une idée, r<strong>en</strong>dez vous ici et testez toutes les possibilitésoffertes par un vrai moteur de template! Pour ce qui est du reste du code, il peut être intéressant de vous <strong>en</strong> servircomme base, mais je vous conseille de l'<strong>en</strong>glober dans des classes. Vous verrez, l'utilisation <strong>en</strong> est bi<strong>en</strong> plus aisée.Ainsi, la plus grosse lacune de ce <strong>framework</strong> est bel et bi<strong>en</strong> le moteur de template. Cep<strong>en</strong>dant, il est tout à faitpossible d'<strong>en</strong> intégrer un autre, sachez cep<strong>en</strong>dant que si vous débutez <strong>en</strong> <strong>PHP</strong>, vous risquez de vite vous décourager.Certains d'<strong>en</strong>tre eux (comme Smarty) nécessit<strong>en</strong>t un appr<strong>en</strong>tissage de leur syntaxe fort bi<strong>en</strong> fournie...Peut être serait-il plus judicieux de vous lancer dans de petits projets n'intégrant pas <strong>en</strong>core de templates.Pour finir, vous avez dû constater que certains codes fournis <strong>en</strong> exemple possèd<strong>en</strong>t un "gros tas" de comm<strong>en</strong>tairesprécédant chaque fonction : l'intérêt <strong>d'un</strong>e telle démarche est d'<strong>en</strong>suite pouvoir générer une API telle que celle ci :À INTÉGRER!! une fois mon hebergem<strong>en</strong>t dvp effectifPour finir, si vous êtes t<strong>en</strong>tés par la découverte <strong>d'un</strong> <strong>framework</strong> professionnel, allez donc faire un tourici.Li<strong>en</strong>s :• Programmation Web/<strong>PHP</strong> et architecture MVC, par Serge Tahé- 44 -Les sources prés<strong>en</strong>tés sur cette pages sont libres de droits, et vous pouvez les utiliser à votre conv<strong>en</strong>ance. Par contre la page de prés<strong>en</strong>tation deces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - Bruno Da Silva. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'<strong>en</strong>semble de son cont<strong>en</strong>u : textes, docum<strong>en</strong>ts, images, etc sans l'autorisation expresse de l'auteur.Sinon vous <strong>en</strong>courez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.http://g-rossolini.developpez.com/tutoriels/php/<strong>framework</strong>-debutant/


<strong>Réalisation</strong> <strong>d'un</strong> <strong>framework</strong> <strong>en</strong> <strong>PHP</strong> par Bruno Da Silva- 45 -Les sources prés<strong>en</strong>tés sur cette pages sont libres de droits, et vous pouvez les utiliser à votre conv<strong>en</strong>ance. Par contre la page de prés<strong>en</strong>tation deces sources constitue une oeuvre intellectuelle protégée par les droits d'auteurs. Copyright © 2006 - Bruno Da Silva. Aucune reproduction, mêmepartielle, ne peut être faite de ce site et de l'<strong>en</strong>semble de son cont<strong>en</strong>u : textes, docum<strong>en</strong>ts, images, etc sans l'autorisation expresse de l'auteur.Sinon vous <strong>en</strong>courez selon la loi jusqu'à 3 ans de prison et jusqu'à 300 000 E de dommages et intérêts.http://g-rossolini.developpez.com/tutoriels/php/<strong>framework</strong>-debutant/

Hooray! Your file is uploaded and ready to be published.

Saved successfully!

Ooh no, something went wrong!