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

Pratique de MySQL et PHP- P52 pps

5 137 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

5.3 Portabilité multi-SGBD 233 5.3 PORTABILITÉ MULTI-SGBD Nous abordons maintenant la question de la portabilité sur plusieurs systèmes de bases de données. Le présent livre est principalement orienté vers MySQL, mais ce produit lui-même s’attache à respecter la norme SQL, ce qui ouvre la perspective de pouvoir porter une application sur d’autres SGBD. Pour un site spécifique, installé en un seul exemplaire, avec le choix définitif d’utiliser MySQL, la question de la portabilité ne se pose pas. À l’autre extrême un logiciel généraliste que l’on souhaite diffuser le plus largement possible gagnera à être compatible avec des systèmes répandus comme PostgreSQL, ORACLE, voire SQLite. SQLite est une interface SQL pour stocker et rechercher des données dans un fichier, sans passer par un serveur de bases de données. SQLite est fourni avec PHP 5 et ne nécessite donc aucune installation autre que celle de PHP. Le site W EBSCOPE est conçu (et testé) pour être portable, ce qui impose quelques précautions initiales discutées ici. MySQL est un SGBD relationnel. Il appartient à une famille de systèmes très répandus – ORACLE, PostgreSQL, SQL Server, SYBASE, DB2, le récent SQLite – qui tous s’appuient sur le modèle relationnel de représentation et d’interrogation des données, modèle dont la principale concrétisation est le langage SQL. En théorie, toute application s’appuyant sur un SGBD relationnel est portable sur les autres. En pratique, chaque système ajoute à la norme SQL ses propres spécificités, ce qui nécessite, quand on veut concevoir une application réellement portable, de bien distinguer ce qui relève de la norme et ce qui relève des extensions propriétaires. Cette section décrit les écueils à éviter et donne quelques recommandations. Le site proposé dans les chapitres qui suivent s’appuie sur ces recommandations pour proposer un code entièrement portable. La seule modification à effectuer pour passer d’un système à un autre est un simple changement de paramètre de configuration. Comme nous allons le voir, le développement d’une application portable n’est pas plus difficile que celle d’une application dédiée, à condition de mettre en place quelques précautions initiales simples. Cette section peut être omise sans dommage par ceux qui n’envisagent pas d’utiliser un autre système que MySQL. 5.3.1 Précautions syntaxiques Il faut bien distinguer deux parties dans SQL. Le langage de définition de données, ou LDD, permet de créer tous les composants du schéma – principalement les tables. Les commandes sont les CREATE, ALTER,etDROP. Le langage de manipulation de données (LMD) comprend les commandes SELECT, UPDATE, INSERT et DELETE. MySQL est très proche de la norme SQL, et tout ce que nous avons présenté jusqu’ici, à quelques exceptions près, relève de cette norme et peut fonctionner sous un autre SGBD. Ces exceptions sont : 1. certains types de données, dont, principalement, TEXT ; 234 Chapitre 5. Organisation du développement 2. des constructions comme ENUM et SET ; 3. l’auto-incrémentation des clés (option AUTO_INCREMENT de CREATE TABLE). Il suffit d’ignorer ENUM et SET. Pour les types de données, MySQL propose un ensemble plus riche que celui de la norme SQL. Le tableau 2.1, page 462, donne la liste des types disponibles et précise ceux qui appartiennent à la norme SQL ANSI : il faut se limiter à ces derniers pour une application portable. Cela étant, certains types très pratiques, comme TEXT, ne sont pas normalisés (ou, plus précisément, la norme SQL qui préconise BIT VARYING n’est pas suivie). Il est souvent nécessaire d’utiliser ce type car les attributs de type VARCHAR sont limités à une taille maximale de 255 caractères. Le type TEXT existe dans PostgreSQL, mais pas dans ORACLE où son équivalent est le type LONG. Le script de création de notre schéma, Films.sql, page 202, est entièrement compatible avec la norme, à l’exception du résumé du film, de type TEXT, qu’il faut donc remplacer par LONG si l’on souhaite utiliser ORACLE. Ce genre de modification affecte l’installation, et pas l’utilisation du site, ce qui limite les inconvénients. Un type normalisé en SQL, mais assez difficile d’utilisation est le type DATE.Dans le cadre d’une application PHP, le plus simple est de stocker les dates au format dit « Unix », soit un entier représentant le nombre de secondes depuis le premier janvier 1970. Des fonctions PHP (notamment getDate()) permettent ensuite de manipuler et d’afficher cette valeur à volonté. Pour les mots-clés de SQL et les identificateurs, il n’y a pas de problème si on se limite aux caractères ASCII (mieux vaut éviter les lettres accentuées). L’utilisation des majuscules et minuscules est en revanche un point délicat. Les mots-clés SQL ne sont pas sensibles à la casse, et il en va de même des identificateurs. Pour un système relationnel, toutes les syntaxes suivantes seront donc acceptées, quelle que soit la casse employée pour créer le schéma : • SELECT TITRE FROM FILM ; • select titre from film ; • Select Titre From Film. Attention cependant à MySQL qui stocke chaque table dans un fichier dont le nom est celui donné à la table dans la commande CREATE TABLE. Sous un système UNIX où les noms de fichiers sont sensibles à la casse, MySQL ne trouvera ni la table FILM ni la table film si le fichier s’appelle Film. Il faut donc toujours nommer les tables de la même manière dans la clause FROM, ce qui est facilité par l’emploi d’une convention uniforme comme – par exemple – une majuscule pour la première lettre et des minuscules ensuite. Il faut de plus prendre en compte PHP qui, lui, est sensible à la casse dans les noms des variables. Les variables $TITRE, $titre et $Titre sont donc considérées comme différentes. Ces noms de variables sont attribués automatiquement par les fonctions PHP d’accès aux bases de données comme mysql_fetch_object() (MySQL), pg_fetch_object() (PostgreSQL), oci_fetch_object() (ORACLE), etc. Tout 5.3 Portabilité multi-SGBD 235 dépend de la manière dont ces fonctions nomment les attributs dans les résultats. Or les systèmes appliquent des règles très différentes : • MySQL utilise la même casse que celle de la clause SELECT : après un SELECT Titre FROM Film on récupèrera donc une variable $Titre ; • PostgreSQL utilise toujours les minuscules, quelle que soit la casse employée : après un SELECT Titre FROM Film on récupèrera donc une variable $titre ; • ORACLE utilise toujours les majuscules, quelle que soit la casse employée : après un SELECT Titre FROM Film on récupèrera donc une variable $TITRE. Ces différentes conventions sont dangereuses car elle influent directement sur la correction du code PHP. Avec l’apparition de la couche PDO qui uniformise l’accès aux bases de données depuis la version PHP 5.1, le problème est plus facile à résoudre, mais il est préférable dès le départ d’adopter des noms dattributs loù la casse n’est pas significative : nous avons choisi d’utiliser uniquement les minuscules. Dernier point auquel il faut être attentif : l’échappement des chaînes de caractères pour traiter les caractères gênants (typiquement, les apostrophes) avant une insertion ou une mise à jour. On utilise traditionnellement la fonction addSlashes() qui convient pour MySQL et PostgreSQL, mais par pour ORACLE, SQLite ou SYBASE qui utilisent le doublement des apostrophes. Il faut donc encapsuler la technique d’échappement dans une fonction qui se charge d’appliquer la méthode appropriée en fonction du SGBD utilisé (c’est la méthode prepareChaine() de notre classe BD). 5.3.2 Le problème des séquences Voyons maintenant le problème de l’incrémentation automatique des identifiants. Il est très fréquent d’utiliser comme clé primaire d’une table un numéro qui doit donc être incrémenté chaque fois que l’on insère une nouvelle ligne. En l’absence d’un mécanisme spécifique pour gérer ce numéro, on peut penser à prendre le numéro maximal existant et à lui ajouter 1. En SQL cela s’exprime facilement comme ceci : SELECT MAX(id) + 1 FROM < table> −− puis insertion dans la table avec le numéro obtenu Cette solution n’est pas très satisfaisante. Il faut en effet s’assurer que deux sessions utilisateur ne vont pas simultanément effectuer la requête donnant le nouvel id, sous peine de se retrouver avec deux commandes INSERT utilisant le même identifiant. On peut verrouiller la table avant d’effectuer la requête SELECT,auprixd’un blocage temporaire mais général, y compris pour les sessions qui ne cherchent pas à créer d’identifiant. Enfin, dernier inconvénient, cela peut soulever des problèmes de performances. Tous les systèmes fournissent donc des générateurs d’identifiants, ou séquences. Malheureusement aucun n’applique la même méthode. Dans MySQL, on peut asso- cier une option AUTO_INCREMENT à une clé primaire (voir par exemple page 199). 236 Chapitre 5. Organisation du développement Si on n’indique pas cette clé dans une commande INSERT, MySQL se charge auto- matiquement d’attribuer un nouvel identifiant. De plus il est possible de récupérer l’identifiant précédemment attribué avec la fonction last_insert_id().SQLite emploie la même méthode, sans spécifier AUTO_INCREMENT. Sous ORACLE et PostgreSQL, on utilise des séquences 5 qui sont des composants du schéma dédiés à la génération d’identifiants. Une séquence est créée par la commande DDL suivante : CREATE SEQUENCE <nomS´equence>; Il existe, pour chaque système, de nombreuses options permettant d’indiquer la valeur initiale, la valeur maximale, le pas d’incrémentation, etc. Sous PostgreSQL, on peut obtenir un nouvel identifiant en appliquant la fonction NEXTVAL() àla séquence. Ensuite, dans la même session, on obtient l’identifiant qui vient d’être attribué avec la fonction CURRVAL(). Voici un exemple de session sous PostgreSQL. On crée la séquence, on appelle deux fois NEXTVAL() puis une fois CURRVAL(). Films=# CREATE SEQUENCE ma_sequence; CREATE SEQUENCE Films=# SELECT NEXTVAL(’ma_sequence’); nextval 1 Films=# SELECT NEXTVAL(’ma_sequence’); nextval 2 Films=# SELECT CURRVAL(’ma_sequence’); currval 2 Le fonctionnement est pratiquement identique sous ORACLE. Pour obtenir, dans une application PHP, un générateur d’identifiants qui fonctionne sur tous les SGBD, il faut donc écrire une fonction (ou une méthode dans une classe) qui fait appel, selon le système utilisé, à la méthode appropriée. En ce qui concerne MySQL, si on souhaite que l’application soit portable, on ne peut pas utiliser l’auto-incrémentation des lignes de la table ; il faut donc se ramener aux séquences trouvées dans les autres systèmes. On y arrive aisément en créant une table spéciale, avec un seul attribut auto-incrémenté. Chaque insertion dans cette table génère un nouvel identifiant que l’on peut alors obtenir avec la fonction last_insert_id(). Voici, sous MySQL, une session équivalente à celle de PostgreSQL. 5. PostgreSQL fournit également un type non standard SERIAL qui fonctionne comme l’auto- incrémentation de MySQL. 5.3 Portabilité multi-SGBD 237 mysql> CREATE TABLE SequenceArtiste -> (id INTEGER NOT NULL AUTO_INCREMENT, -> PRIMARY KEY (id)); mysql> mysql> insert into SequenceArtiste values(); Query OK, 1 row affected (0,01 sec) mysql> insert into SequenceArtiste values(); Query OK, 1 row affected (0,00 sec) mysql> select last_insert_id(); + + | last_insert_id() | + + |2| + + La classe BD, décrite dans le chapitre 3, est enrichie d’une méthode abstraite genereID(), déclarée comme suit : // G´en´eration d’un identifiant abstract public function genereID($nomSequence); Cette méthode est ensuite déclinée dans chaque sous-classe correspondant à chaque système. Voici la méthode pour MySQL. // G´en´eration d’un identifiant public function genereID($nomSequence) { // Insertion d’un ligne pour obtenir l’auto-incr´ementation $this->execRequete("INSERT INTO $nomSequence VALUES()"); // Si quelque chose s’est mal pass´e, on a lev´e une exception, // sinon on retourne l’identifiant return mysql_insert_id(); } Et la voici pour PostgreSQL. // G´en´eration d’un identifiant public function genereID($nomSequence) { // Appel `alas´equence $res = $this->execRequete("SELECT NextVal(’$nomSequence’) AS id"); $seq = $this->objetSuivant($res); return $seq->id; } La gestion des séquences est le seul aspect pour lequel la programmation d’une application PHP/MySQL s’écarte légèrement des techniques que l’on emploierait si . CREATE, ALTER,etDROP. Le langage de manipulation de données (LMD) comprend les commandes SELECT, UPDATE, INSERT et DELETE. MySQL est très proche de la norme SQL, et tout ce que nous avons présenté jusqu’ici,. et SET ; 3. l’auto-incrémentation des clés (option AUTO_INCREMENT de CREATE TABLE). Il suffit d’ignorer ENUM et SET. Pour les types de données, MySQL propose un ensemble plus riche que celui de. est de stocker les dates au format dit « Unix », soit un entier représentant le nombre de secondes depuis le premier janvier 1970. Des fonctions PHP (notamment getDate()) permettent ensuite de

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

TỪ KHÓA LIÊN QUAN