1. Trang chủ
  2. » Công Nghệ Thông Tin

Pratique de MySQL et PHP- P58 pot

5 235 0

Đang tải... (xem toàn văn)

THÔNG TIN TÀI LIỆU

Cấu trúc

  • Table des Matières

  • Avant-propos

  • Première partie – Programmation web avec MySQL/PHP

    • Chapitre 1 – Introduction à MySQL et PHP

      • 1.1 Introduction au Web et à la programmation web

        • 1.1.1 Serveurs web

        • 1.1.2 Documents web : le langage XHTML

        • 1.1.3 Programmation web

        • 1.1.4 Sessions

      • 1.2 Programmation web avec MySQL et PHP

        • 1.2.1 MySQL

        • 1.2.2 PHP

      • 1.3 Une première base MySQL

        • 1.3.1 Création d'une table

        • 1.3.2 L'utilitaire mysql

        • 1.3.3 L'interface PhpMyAdmin

      • 1.4 Accès à MySQL avec PHP

        • 1.4.1 L'interface MySQL/PHP

        • 1.4.2 Formulaires d'interrogation

        • 1.4.3 Formulaires de mises à jour

    • Chapitre 2 – Techniques de base

      • 2.1 Programmation avec fonctions

        • 2.1.1 Création de fonctions

        • 2.1.2 Utilisation des fonctions

        • 2.1.3 À propos de require et include

        • 2.1.4 Passage par valeur et passage par référence

      • 2.2 Traitement des données transmises par HTTP

        • 2.2.1 Échappement et codage des données HTTP

        • 2.2.2 Contrôle des données HTTP

        • 2.2.3 Comment insérer dans la base de données : insertion dans MySQL

        • 2.2.4 Traitement de la réponse

        • 2.2.5 Comment obtenir du texte « pur » : envoi de l'e-mail

        • 2.2.6 En résumé : traitement des requêtes et des réponses

      • 2.3 Mise à jour d'une base par formulaire

        • 2.3.1 Script d'insertion et de mise à jour

        • 2.3.2 Validation des données et expressions régulières

      • 2.4 Transfert et gestion de fichiers

        • 2.4.1 Transfert du client au serveur

        • 2.4.2 Transfert du serveur au client

      • 2.5 Sessions

        • 2.5.1 Comment gérer une session web ?

        • 2.5.2 Gestion de session avec cookies

        • 2.5.3 Prise en charge des sessions dans PHP

      • 2.6 SQL dynamique et affichage multi-pages

        • 2.6.1 Affichage d'une requête dynamique

        • 2.6.2 Affichage multi-pages

    • Chapitre 3 - Programmation objet

      • 3.1 Tour d'horizon de la programmation objet

        • 3.1.1 Principes de la programmation objet

        • 3.1.2 Objets et classes

        • 3.1.3 Les exceptions

        • 3.1.4 Spécialisation : classes et sous-classes

        • 3.1.5 Spécialisation et classes abstraites : la classe BD

        • 3.1.6 Résumé

      • 3.2 La classe Tableau

        • 3.2.1 Conception

        • 3.2.2 Utilisation

        • 3.2.3 Implantation

      • 3.3 La classe Formulaire

        • 3.3.1 Conception

        • 3.3.2 Utilisation

        • 3.3.3 Implantation

      • 3.4 La classe IhmBD

        • 3.4.1 Utilisation

        • 3.4.2 Implantation

  • Deuxième partie – Conception et création d’un site

    • Chapitre 4 – Création d'une base MySQL

      • 4.1 Conception de la base

        • 4.1.1 Bons et mauvais schémas

        • 4.1.2 Principes généraux

        • 4.1.3 Création d'un schéma E/A

      • 4.2 Schéma de la base de données

        • 4.2.1 Transcription des entités

        • 4.2.2 Associations de un à plusieurs

        • 4.2.3 Associations de plusieurs à plusieurs

      • 4.3 Création de la base Films avec MySQL

        • 4.3.1 Tables

        • 4.3.2 Contraintes

        • 4.3.3 Modification du schéma

    • Chapitre 5 – Organisation du développement

      • 5.1 Choix des outils

        • 5.1.1 Environnement de développement intégré Eclipse

        • 5.1.2 Développement en équipe : Subversion

        • 5.1.3 Production d'une documentation avec PhpDoc

        • 5.1.4 Tests unitaires avec PhpUnit

        • 5.1.5 En résumé

      • 5.2 Gestion des erreurs

        • 5.2.1 Erreurs syntaxiques

        • 5.2.2 Gestion des erreurs en PHP

        • 5.2.3 Les exceptions PHP

        • 5.2.4 Gestionnaires d'erreurs et d'exceptions

      • 5.3 Portabilité multi-SGBD

        • 5.3.1 Précautions syntaxiques

        • 5.3.2 Le problème des séquences

        • 5.3.3 PDO, l'interface générique d'accès aux bases relationnelles

    • Chapitre 6 – Architecture du site : le pattern MVC

      • 6.1 Le motif de conception MVC

        • 6.1.1 Vue d'ensemble

        • 6.1.2 Le modèle

        • 6.1.3 La vue

        • 6.1.4 Contrôleurs et actions

        • 6.1.5 Organisation du code et conventions

      • 6.2 Structure d'une application MVC : contrôleurs et actions

        • 6.2.1 Le fichier index.php

        • 6.2.2 Le contrôleur frontal

        • 6.2.3 Créer des contrôleurs et des actions

      • 6.3 Structure d'une application MVC : la vue

        • 6.3.1 Les templates

        • 6.3.2 Combiner des templates

        • 6.3.3 Utilisation d'un moteur de templates comme vue MVC

        • 6.3.4 Exemple complet

        • 6.3.5 Discussion

      • 6.4 Structure d'une application MVC : le modèle

        • 6.4.1 Modèle et base de données : la classe TableBD

        • 6.4.2 Un exemple complet de saisie et validation de données

        • 6.4.3 Pour conclure

    • Chapitre 7 – Production du site

      • 7.1 Authentification

        • 7.1.1 Problème et solutions

        • 7.1.2 Contrôleur d'authentification et de gestion des sessions

        • 7.1.3 Les actions de login et de logout

      • 7.2 Recherche, présentation, notation des films

        • 7.2.1 Outil de recherche et jointures SQL

        • 7.2.2 Notation des films

      • 7.3 Affichage des films et forum de discussion

      • 7.4 Recommandations

        • 7.4.1 Algorithmes de prédiction

        • 7.4.2 Agrégation de données avec SQL

        • 7.4.3 Recommandations de films

    • Chapitre 8 – XML

      • 8.1 Introduction à XML

        • 8.1.1 Pourquoi XML ?

        • 8.1.2 XML et HTML

        • 8.1.3 Syntaxe de XML

      • 8.2 Export de données XML

        • 8.2.1 Comment passer d'une base MySQL à XML

        • 8.2.2 Application avec PHP

      • 8.3 Import de données XML dans MySQL

        • 8.3.1 Simple XML

        • 8.3.2 L'API SAX

        • 8.3.3 Une classe de traitement de documents XML

      • 8.4 Mise en forme de documents avec XSLT

        • 8.4.1 Quelques mots sur XSLT

        • 8.4.2 Application d'un programme XSLT avec PHP

  • Troisième partie – Compléments

    • Chapitre 9 – Introduction au Zend Framework

      • 9.1 Mise en route

        • 9.1.1 Installation d'une application ZF

        • 9.1.2 Redirection des requêtes avec le ZF

        • 9.1.3 Organisation et conventions

        • 9.1.4 Routage des requêtes dans une application Zend

        • 9.1.5 Configuration

        • 9.1.6 Connexion à la base de données

        • 9.1.7 Le registre

        • 9.1.8 Contrôleurs, actions et vues

      • 9.2 Accès à la base de données

        • 9.2.1 Interrogation

        • 9.2.2 Insertion et mise à jour

      • 9.3 Le MVC du Zend Framework

        • 9.3.1 L'objet request

        • 9.3.2 L'objet response

        • 9.3.3 Gérer les exceptions

      • 9.4 La vue dans le Zend Framework

        • 9.4.1 Les vues sont des scripts PHP

        • 9.4.2 Le layout

        • 9.4.3 Créer des Helpers

      • 9.5 Le composant Modèle du Zend Framework

        • 9.5.1 L'ORM du Zend Framework

        • 9.5.2 Le modèle ORM de l'application

        • 9.5.3 Manipulation des données avec les classes ORM

      • 9.6 Pour conclure

    • Chapitre 10 – Récapitulatif SQL

      • 10.1 Sélections

        • 10.1.1 Renommage, fonctions et constantes

        • 10.1.2 La clause DISTINCT

        • 10.1.3 La clause ORDER BY

        • 10.1.4 La clause WHERE

        • 10.1.5 Dates

        • 10.1.6 Valeurs nulles

        • 10.1.7 Clauses spécifiques à MySQL

      • 10.2 Jointures

        • 10.2.1 Interprétation d'une jointure

        • 10.2.2 Gestion des ambiguïtés

        • 10.2.3 Jointures externes

      • 10.3 Opérations ensemblistes

      • 10.4 Requêtes imbriquées

        • 10.4.1 Exemples de requêtes imbriquées

        • 10.4.2 Requêtes corrélées

        • 10.4.3 Requêtes avec négation

      • 10.5 Agrégation

        • 10.5.1 La clause GROUP BY

        • 10.5.2 La clause HAVING

      • 10.6 Mises à jour

        • 10.6.1 Insertion

        • 10.6.2 Destruction

        • 10.6.3 Modification

    • Chapitre 11 – Récapitulatif PHP

      • 11.1 Généralités

        • 11.1.1 Commentaires

        • 11.1.2 Variables et littéraux

        • 11.1.3 Constantes

      • 11.2 Types

        • 11.2.1 Types numériques et booléens

        • 11.2.2 Chaînes de caractères

        • 11.2.3 Tableaux

        • 11.2.4 Conversion et typage

      • 11.3 Expressions

      • 11.4 Opérateurs

        • 11.4.1 Concaténation de chaînes

        • 11.4.2 Incrémentations

        • 11.4.3 Opérateurs de bits

        • 11.4.4 Opérateurs logiques

      • 11.5 Structures de contrôle

        • 11.5.1 Tests

        • 11.5.2 Boucles

        • 11.5.3 Les instructions break et continue

      • 11.6 Fonctions

        • 11.6.1 Passage des arguments

        • 11.6.2 Valeurs par défaut

        • 11.6.3 Fonctions et variables

      • 11.7 Programmation orientée-objet

        • 11.7.1 Classes et objets

        • 11.7.2 Constructeurs et destructeurs

        • 11.7.3 Sous-classes

        • 11.7.4 Manipulation des objets

        • 11.7.5 Compléments

  • Quatrième partie – Annexes

    • Annexe A – Installation Apache/PHP/MySQL

      • A. 1 Mot de passe root

      • A. 2 Création de bases et d'utilisateurs

        • A. 2.1 La commande GRANT

        • A. 2.2 Modification des droits d'accès

      • A. 3 Fichiers de configuration

        • A. 3.1 Format d'un fichier de configuration

        • A. 3.2 Les différents fichiers

        • A. 3.3 Configuration du serveur

        • A. 3.4 Configuration d'un compte administrateur

      • A. 4 Sauvegardes

      • A. 5 phpMyAdmin

    • Annexe B – Référence MySQL

      • B. 1 Types de données MySQL

      • B. 2 Commandes de MySQL

      • B. 3 Fonctions MySQL

    • Annexe C – Fonctions PHP

      • C. 1 Fonctions générales

      • C. 2 Chaînes de caractères

      • C. 3 Dates

      • C. 4 Tableaux

      • C. 5 Fonctions XML

      • C. 6 Accès aux fichiers

      • C. 7 Interface PHP/MySQL

  • Index général

  • Index des fonctions PHP

  • Index des commandes SQL

  • Table des figures

Nội dung

6.3 Structure d’une application MVC : la vue 263 <!−− Le formulaire pour saisir la requête −−> <center> <form method=’post ’ action =’?ctrl=saisie&amp;action=recherche ’> <b>Titre ou partie du titre</b> <input type=’text ’ name=" titre " value="" size =’30’ maxlength =’30’/> <input type=’submit ’ name="submit" value="Rechercher" /> </form> </ center> Rappelons que notre « layout » comprend deux références d’entités : titre_page et contenu (voir ce qui précède). Le but de chaque action (au moins en ce qui concerne la présentation du résultat) est de créer une valeur pour ces deux entités. Voici l’action form_recherche. function form_recherche () { /∗ Définition du titre ∗ / $this−>vue−>titre_page = "Recherche des films " ; /∗∗ ∗ On charge le template "saisie_recherche" ∗ dans l ’ entité "contenu" ∗ / $this−>vue−>setFile("contenu" , "saisie_form_recherche . tpl"); /∗ Il n’y a plus qu’à afficher . ∗/ echo $this−>vue−>render ("page"); } C’est une page statique, qui se contente de combiner deux templates en plaçant le contenu du fichier saisie_form_recherche.tpl dans l’entité contenu du layout. La seconde action est un peu plus longue (forcément). Voyons d’abord le template : Exemple 6.12 Le template saisie_recherche.tpl montrant le résultat de la recherche <p> <b>Voici le résultat de votre recherche . </b> Vous pouvez maintenant utiliser le lien "mise à jour " pour accéder à un formulaire de modification des films . </p> <center> < table border =’4’ cellspacing=’5’> < tr class="header"> <th>Titre</th><th>Année</ th><th>Action</ th> </ tr> <!−− Le bloc pour le template affichant une ligne −−> <!−− BEGIN l i g n e −−> 264 Chapitre 6. Architecture du site: le pattern MVC < tr class =’{classe_css } ’> <td>{titre_film }</td><td>{ annee }</ td> <td><ahref="? ctrl=saisie&amp; action=form_modifier&amp; id={ id_film }"> Mise à jour</a> </td> </ tr> <!−− END ligne −−> </ table> </ center> Il s’agit de deux templates imbriqués. Le second, marqué par les commentaires BEGIN et END, correspond à chaque ligne du tableau montrant les films. À l’inté- rieur de ce template imbriqué on trouve les références aux entités classe_css, titre_film, id_film,etannee. Le code de l’action est donné ci-dessous : les commentaires indiquent le rôle de chaque partie. function recherche () { // Définition du titre $this−>vue−>titre_page = "Résultat de la recherche" ; // On charge les templates nécessaires $this−>vue−>setFile("texte" , "saisie_recherche . tpl"); // On extrait le bloc imbriqué "ligne", et on le remplace par // la référence à une entité "lignes" $this−>vue−>setBlock ("texte" , "ligne" , "lignes"); // Le titre a été saisi ? On effectue la recherche if ( i s S e t ($_POST[ ’ t i t r e ’ ]) ) { $titre = htmlEntities($_POST[ ’ titre ’]) ; } else { // Il faudrait sans doute protester? $titre = ""; } // Exécution de la requête $ r e q uet e = "SELECT ∗ FROM Film WHERE titre LIKE ’%$titre%’ " ; $resultat = $this−>bd−>execRequete( $requete ) ; $compteur = 1; while ($film = $this−>bd−>objetSuivant ($resultat)) { if ($compteur++ % 2 == 0) $classe = "even" ; else $classe = "odd" ; // Affectation des entités de la ligne $this−>vue−>classe_css = $classe ; $this−>vue−>titre_film = $film−>titre ; $this−>vue−>id_film = $film−>id ; 6.3 Structure d’une application MVC : la vue 265 $this−>vue−>annee = $film−>annee ; // On effectue la substitution dans "ligne", en concaténant // le résultat dans l ’entité "lignes" $this−>vue−>append ( " lignes " , " ligne ") ; } // On a le formulaire et le tableau : on parse et on place // le résultat dans l ’entité ’contenu ’ $this−>vue−>assign ("contenu" , " texte "); /∗ Il n’y a plus qu’à afficher. ∗ / echo $this−>vue−>render ("page"); } Notez que l’action attend en paramètre une variable titre transmise en post.En principe ce paramètre vient du formulaire. Une action devrait toujours vérifier que les paramètres attendus sont bien là, et filtrer leur valeur (en supprimant par exemple les balises HTML que des personnes malicieuses pourraient y injecter). C’est ce que fait la fonction htmlEntities(), en remplaçant les caractères réservés HTML par des appels d’entités. Rappelez-vous toujours qu’un script PHP peut être déclenché par n’importe qui, et pas toujours avec de bonnes intentions. Ces actions sont du « pur » PHP, sans aucune trace de HTML. Si on conçoit les choses avec soin, on peut structurer ainsi une application MVC en fragments de code, chacun d’une taille raisonnable, avec une grande clarté dans l’organisation de toutes les parties de l’application. Avant d’étudier la dernière partie du MVC, le modèle, nous allons comme promis revenir un moment sur les avantages et inconvénients du système de templates pour gérer le composant Vue. 6.3.5 Discussion Les templates offrent un bon exemple de la séparation complète de la « logique » de l’application, codée en PHP, et de la présentation, codée en HTML. Une des forces de ce genre de système est que toute la mise en forme HTML est écrite une seule fois, puis reprise et manipulée grâce aux fonctions PHP. On évite donc, pour les modifications du site, l’écueil qui consisterait à dupliquer une mise en forme autant de fois qu’il y a de pages dans le site. C’est ce que doit satisfaire tout gestionnaire de contenu HTML digne de ce nom en proposant une notion de « style » ou de « modèle » dont la mise à jour est répercutée sur toutes les pages reposant sur ce style ou ce modèle. Un problème délicat reste la nécessité de produire un nombre très important de templates si on veut gérer la totalité du site de cette manière et interdire la production de tout code HTML avec PHP. Cette multiplication de « petits » modèles (pour les tableaux, les lignes de tableaux, les formulaires et tous leurs types de champs, etc.) peut finir par être très lourde à gérer. Imaginez par exemple ce que peut être la production avec des templates d’un formulaire comme ceux que nous pouvons obtenir avec la classe Formulaire, comprenant une imbrication de tableaux, de champs de saisie et de valeurs par défauts fournies en PHP. 266 Chapitre 6. Architecture du site: le pattern MVC Un bon compromis est d’utiliser des modèles de page créés avec un générateur de documents HTML, pour la description du graphisme du style. Cela correspond grosso modo à l’en-tête, au pied de page et aux tableaux HTML qui définissent l’em- placement des différentes parties d’une page. On place dans ces modèles des entités qui définissent les composants instanciés par le script PHP : tableaux, formulaires, menus dynamiques, etc. Ensuite, dans le cadre de la programmation PHP, on prend ces modèles comme templates, ce qui rend le code indépendant du graphisme, et on utilise, pour produire le reste des éléments HTML, plus neutres du point de vue de la présentation, les utilitaires produisant des objets HTML complexes comme Tableau ou Formulaire. Le code PHP produit alors ponctuellement des composants de la page HTML, mais dans un cadre bien délimité et avec des utilitaires qui simplifient beaucoup cette tâche. L’utilisation des feuilles de style CSS permet de gérer quand même la présentation de ces éléments HTML. Il suffit pour cela de prévoir l’ajout d’une classe CSS dans les balises HTML produites. Cette solution limite le nombre de templates nécessaires, tout en préservant un code très lisible. On peut également s’intéresser à des systèmes de templates plus évolués que celui présenté ici. Il en existe beaucoup (trop ). Attention cependant : le choix d’un système de templates a un impact sur tout le code du site, et il n’est pas du tout facile de faire marche arrière si on s’aperçoit qu’on a fait fausse route. Posez-vous les quelques questions suivantes avant de faire un choix : • Le système préserve-t-il la simplicité de production du code HTML, ou faut-il commencer à introduire des syntaxes compliquées dans les templates pour décrire des boucles, des éléments de formulaire, etc. La méthode consistant à décrire des blocs est un premier pas vers l’introduction de structures de programmation (boucles, tests) dans les modèles, et il est tentant d’aller au-delà. Si la personne responsable du code HTML doit se transformer en programmeur, on perd cependant l’idée de départ • Le système est-il répandu, bien documenté, soutenu par une collectivité active et nombreuse de programmeurs ? Est-il, au moins en partie, compatible avec les systèmes classiques ? • Quelles sont ses performances ? Est-il doté d’un système de cache qui évite d’effectuer systématiquement les opérations coûteuses de substitution et de copies de chaînes de caractères ? Gardez en vue qu’un bon système de templates doit avant tout faciliter la répar- tition des tâches et rester simple et efficace. Il paraît peu raisonnable de se lancer dans des solutions sans doute astucieuses mais complexes et non normalisées. Si vraiment la séparation du contenu et de la présentation est très importante pour vous, par exemple parce que vous souhaitez produire plusieurs formats différents (HTML, WML, PDF, etc.) à partir d’un même contenu, pourquoi ne pas étudier les outils basés sur XML comme le langage de transformation XSLT, introduit dans le chapitre 8 ? Ces langages sont normalisés par le W3C, on bénéficie donc en les adoptant des très nombreux outils et environnements de développement qui leur sont consacrés. 6.4 Structure d’une application MVC : le modèle 267 Nous verrons également dans le chapitre 9 une approche pour gérer la vue, celle du Zend Framework, assez différente des systèmes de templates. Elle a le mérite d’utiliser directement PHP pour la mise en forme, ce qui évite d’avoir à inventer un nouveau pseudo-langage de programmation. En contrepartie la saisie est lourde et le code obtenu peu plaisant à lire. Le système idéal, simple, léger, lisible et bien intégré à PHP, reste à définir. En résumé, le style d’imbrication de PHP et de HTML fait partie des questions importantes à soulever avant le début du développement d’un site. La réponse varie en fonction de la taille du développement et de l’équipe chargée de la réalisation, des outils disponibles, des compétences de chacun, des contraintes (le site doit-il évoluer fréquemment ? Doit-il devenir multilingue à terme, certaines fonctionnalités sont-elles communes à d’autre sites ?), etc. J’espère que les différentes techniques présentées dans ce livre vous aideront à faire vos choix en connaissance de cause. 6.4 STRUCTURE D’UNE APPLICATION MVC : LE MODÈLE Il nous reste à voir le troisième composant de l’architecture MVC : le modèle. Le modèle est constitué de l’ensemble des fonctionnalités relevant du traitement (au sens large) des données manipulées par l’application. Cette notion de traitement exclut la présentation qui, nous l’avons vu, est prise en charge par la vue. Tout ce qui concerne la gestion des interactions avec l’utilisateur ainsi que le workflow (séquence des opérations) relève du contrôleur. Par élimination, tout le reste peut être imputé au modèle. Il faut souligner qu’on y gagne de ne pas du tout se soucier, en réalisant le modèle, du contexte dans lequel il sera utilisé. Un modèle bien conçu et implanté peut être intégré à une application web mais doit pouvoir être réutilisé dans une application client/serveur, ou un traitement batch. On peut le réaliser de manière standard, sous forme de fonctions ou de classes orientées-objet, sans se soucier de HTML. Il n’y aurait pas grand-chose de plus à en dire si, très souvent, le modèle n’était pas également le composant chargé d’assurer la persistance des données, autrement dit leur survie indépendamment du fonctionnement de l’application. 6.4.1 Modèle et base de données : la classe TableBD Dans des applications web dynamiques, le modèle est aussi une couche d’échange entre l’application et la base de données. Cette couche peut simplement consister en requêtes SQL de recherche et de mise à jour. Elle peut être un peu plus sophistiquée et factoriser les fonctions assurant les tâches routinières : recherche par clé, insertion, mise à jour, etc. À l’extrême, on peut mettre en œuvre un mapping objet-relationnel (Objet-Relational Mapping, ORM en anglais) qui propose une vue de la base de données reposant sur des classes orientées-objet. Ces classes masquent le système relationnel sous-jacent, ainsi que les requêtes SQL. Comme d’habitude, essayons d’être simples et concret : dans ce qui suit je propose une couche Modèle un peu plus élaborée que la communication par SQL, et je montre comment l’exploiter dans notre site pour des recherches (pas trop sophis- tiquées) et des mises à jour. Le chapitre 9 montre avec le Zend Framework le degré d’abstraction que l’on peut obtenir avec une couche ORM. . nécessité de produire un nombre très important de templates si on veut gérer la totalité du site de cette manière et interdire la production de tout code HTML avec PHP. Cette multiplication de « petits. fonction de la taille du développement et de l’équipe chargée de la réalisation, des outils disponibles, des compétences de chacun, des contraintes (le site doit-il évoluer fréquemment ? Doit-il devenir. code PHP produit alors ponctuellement des composants de la page HTML, mais dans un cadre bien délimité et avec des utilitaires qui simplifient beaucoup cette tâche. L’utilisation des feuilles de

Ngày đăng: 06/07/2014, 00:20

w