View
3
Download
0
Category
Preview:
Citation preview
Table des matières
Avant-propos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . XXXI
Pourquoi ce livre ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . XXXI
Structure de l’ouvrage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . XXXII
Remerciements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . XXXIV
CHAPITRE 1
Qu’est-ce que PHP ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
Introduction à PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1
Un langage Open Source . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1Que faire avec PHP ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3Particularités de PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4Historique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6Mode de développement du projet PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
Nouveautés de PHP 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
La programmation orientée objet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10Refonte et simplification de XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10Intégration de la base SQLite . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10Simplification des tâches courantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11PDO : socle commun aux SGBD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
Architecture et fonctionnement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11
Architecture technique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11Fonctionnement de PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
PHP Livre Page VII Mercredi, 5. septembre 2007 6:12 18
PHP 5 avancéVIII
PHP en France et dans le monde . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
Les chiffres d’utilisation en France . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14La communauté française . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15Les ressources d’aide francophones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16Les ressources d’aide anglophones. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
CHAPITRE 2
Installer et configurer PHP 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
Migration vers PHP 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27
Incompatibilités . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28PHP en ligne de commande et en CGI . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
Modes d’installation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28
CGI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28Modules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
Installer PHP 5 sous MS-Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29
Installation automatique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29Installation manuelle. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30
Installer PHP 5 sous Unix . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38
Utilisation automatisée . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38Installation manuelle d’Apache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39Installation manuelle de MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40Installation manuelle de PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41Gestion des droits d’accès . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44Modules additionnels PECL. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
Configuration de PHP avec php.ini . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
Utilisation des modules et des extensions . . . . . . . . . . . . . . . . . . . . . . . . . 45Les directives de configuration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46Gestion de la configuration. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50
CHAPITRE 3
Les structures de base . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
Insertion de PHP dans HTML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53
Balises d’ouverture et de fermeture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54Les commentaires . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
PHP Livre Page VIII Mercredi, 5. septembre 2007 6:12 18
Table des matièresIX
Enchaînement des instructions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55Structure du document . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56Exécuter du code PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
Constantes et variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59Constantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63
Types de données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64
Booléens (boolean). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65Les nombres entiers (integer) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65Les nombres flottants (double, float) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66Les chaînes de caractères (string). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66Les tableaux (array) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71Transtypage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76
CHAPITRE 4
Traitements de base . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
Les opérateurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
Opérateurs d’affectation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79Opérateurs arithmétiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81Opérateurs combinés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83La concaténation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84Opérateurs de comparaison . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84Opérateurs logiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86Opérateurs sur les bits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86Priorités entre opérateurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87
Structures de contrôle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
Les conditions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88Les boucles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93Les instructions d’arrêt. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98
Les fonctions utilisateurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99
Déclaration d’une fonction. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99Appel de fonction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100Visibilité des variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101Retourner plusieurs valeurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103Nombre de paramètres indéfini . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
PHP Livre Page IX Mercredi, 5. septembre 2007 6:12 18
PHP 5 avancéX
Inclure des bibliothèques ou des fichiers . . . . . . . . . . . . . . . . . . . . . . . . 105
Différence entre require() et include() . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106require_once() et include_once() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106
CHAPITRE 5
Traitements de chaînes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
Fonctions d’affichage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107
Affichages simples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107Affichages avec masques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108
Informations sur une chaîne . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111
Accéder à un caractère précis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111Valeur ASCII d’un caractère. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111Taille d’une chaîne . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111Position d’une sous-chaîne . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113Présence de certains caractères. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
Conversions et formatages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114
Protections et échappements. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114Conventions d’affichage locales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118Jeux de caractères . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119
Manipulations sur les chaînes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122
Recherche d’une sous-chaîne . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122Récupérer une sous-chaîne . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122Remplacer un motif . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122Fonctions d’élagage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123Remplissage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124Changement de casse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124Coupure de paragraphes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 125
CHAPITRE 6
Utilisation des tableaux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
Taille d’un tableau . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 127
Recherche d’un élément . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128
Présence dans le tableau . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128Recherche de la clé correspondante . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129Nombre d’occurrences d’un élément . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130Récupération aléatoire d’éléments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130
PHP Livre Page X Mercredi, 5. septembre 2007 6:12 18
Table des matièresXI
Trier les tableaux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131
Tri par valeur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131Tri en ordre inverse. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131Garder les associations clé-valeur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132Tri par clé . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132Tri naturel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132Trier avec une fonction utilisateur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133Tri multicritère . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134
Extractions et remplacement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134
Affecter des variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134Sérialisation de tableaux. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135Extraction d’un sous-tableau . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135Remplacement d’un sous-tableau. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136
Gestion des clés et des valeurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137
Liste des clés utilisées . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137Liste des valeurs utilisées . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137Échanger les clés et les valeurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137
Fusions et séparations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138
Fusion de plusieurs tableaux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138Séparation d’un tableau en plusieurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139
Différences et intersections . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140
Différences entre tableaux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140Intersections entre deux tableaux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140Gestion des doublons . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141
Gestion des piles et des files . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 141
Navigation dans les tableaux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 142
CHAPITRE 7
Fonctions usuelles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143
Fonction d’affichage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143
Informations de configuration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143Affichage de débogage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146Coloration syntaxique de code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147
Fonctions mathématiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148
Connaître les extrémités . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148Arrondir des valeurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148
PHP Livre Page XI Mercredi, 5. septembre 2007 6:12 18
PHP 5 avancéXII
Créer des valeurs aléatoires . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149Travailler sur différentes bases . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 150
Fonctions de date . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151
Formater une date/heure locale. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 151
Fonctions réseau . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155
Résolution DNS d’une adresse IP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155Corrélation IP/DNS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156
Fonctions de chiffrement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157
Quelques définitions : chiffrement, hachage, codage/décodage . . . . . . . . . 157Fonctions de hachage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158Fonctions de codage et décodage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162
Exécution de code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163
Fonction à l’arrêt du script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163Exécution d’une chaîne de code PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164Login/mot de passe sécurisés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164
CHAPITRE 8
Formulaires et superglobales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167
Formulaires HTML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 167
Nouveautés depuis PHP 4.0 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168
Caractères spéciaux et HTML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 168
Création du formulaire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169
Déclaration d’un formulaire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169Méthode d’envoi du formulaire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170Champ de texte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171Zone de texte. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173Cases à cocher . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174Bouton radio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175Liste de sélections et liste déroulante . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176Champs cachés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178Les champs pour mot de passe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179Image cliquable. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179Envoi d’images et de fichiers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179
Réception des données en PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180
Utilisation des superglobales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180Récupération d’une donnée simple. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181
PHP Livre Page XII Mercredi, 5. septembre 2007 6:12 18
Table des matièresXIII
Retours à la ligne et zones de texte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182Utilisation des cases à cocher. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184Validation de données avec l’extension Filter . . . . . . . . . . . . . . . . . . . . . . 184Listes à sélections multiples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191Gestion des images cliquables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192Téléchargements d’images et de fichiers . . . . . . . . . . . . . . . . . . . . . . . . . . 192Formulaire dynamique et tableaux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194
Autres problématiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195
Gestion du temps . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195Gestion de la taille des données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196Stockage des fichiers temporaires . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196Sécurité et données reçues . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196Procédure de gestion des formulaires. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197
CHAPITRE 9
Environnement web et superglobales . . . . . . . . . . . . . . . . . . . . . . 199
Descriptif du contexte Web . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199
Client-serveur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199En-tête et contenu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200Variables superglobales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201
Informations sur le serveur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201
Nom du serveur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202Racine du serveur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202Autres informations sur le serveur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203
Authentification HTTP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203
Principes du protocole HTTP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204Gestion avec PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204Authentification par le serveur web . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206
Paramètres de la connexion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206
Adresse IP et port du client . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206Adresse IP et port du serveur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208
Description de la requête HTTP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208
Paramètres de la requête. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209L’adresse demandée (URL) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209Informations fournies par le client . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210
PHP Livre Page XIII Mercredi, 5. septembre 2007 6:12 18
PHP 5 avancéXIV
Environnement système . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212
Nom du script exécuté . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212
Interactions PHP/JavaScript . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213
Ligne de commande . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213
Lecture des arguments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213Nombre d’arguments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 214
CHAPITRE 10
Les cookies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215
Présentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 215
Forme du cookie sur votre ordinateur. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 216
Lecture et écriture d’un cookie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217
Envoi d’un cookie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217Lecture d’un cookie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218Suppression d’un cookie. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220Modifier les valeurs d’un cookie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220
Validité et date d’expiration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 221
Tableaux et types complexes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 222
Restriction de portée du cookie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 223
Limitations et sécurité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225
Limitations dues aux navigateurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225Les cookies n’ont aucune sécurité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225
Cas d’application . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226
Outil de personnalisation d’affichage . . . . . . . . . . . . . . . . . . . . . . . . . . . . 226
CHAPITRE 11
Les sessions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231
Qu’est-ce qu’une session ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 231
Lecture et écriture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 232
Utilisation avancée . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 233
Fonctionnement interne des sessions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 234Suppression d’une session . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235Définition manuelle de l’initialisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235
PHP Livre Page XIV Mercredi, 5. septembre 2007 6:12 18
Table des matièresXV
Stockage des données de session . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236Paramètres du cookie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237Accès concurrents aux sessions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237
Configuration de PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238
Initialisation des sessions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238Stockage des données de session . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238Paramètres du cookie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239Expiration des sessions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239Gestion du cache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239Transmission de l’identifiant . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240
Gestionnaires de sessions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241
Définir un gestionnaire personnalisé . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242
Limitations et sécurité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245
Cachez les sessions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245N’utilisez pas la réécriture des liens. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245Les identifiants par défaut suffisent . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245Attaque par fixation de session. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 246Vérifiez l’identité de l’utilisateur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 246N’ayez pas confiance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 246
Cas d’application . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247
Authentification par formulaire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 247
CHAPITRE 12
Gestion des objets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253
Introduction aux objets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253
Pourquoi programmer en objet ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253Qu’est-ce qu’un objet ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254Qu’est-ce qu’une classe ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254Qu’est-ce qu’une instance ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255
Utilisation simple des objets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255
Déclarer une classe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255Utilisation des objets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257Vérifier le type d’un objet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262
Copie et référence . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264
Le comportement PHP 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264PHP 5, le passage par référence . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265
PHP Livre Page XV Mercredi, 5. septembre 2007 6:12 18
PHP 5 avancéXVI
Garder la compatibilité avec PHP 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266La copie explicite d’objet, ou clonage . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266Égalité et identité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269
Constructeurs et destructeurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269
Constructeur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269Destructeur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271
La notion d’héritage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272
Définition de la notion d’héritage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272Définition d’une classe héritée . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272Redéfinition d’attribut ou de méthode . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274Accès aux méthodes parentes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275
Sûreté de programmation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276
Typage. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279Classes abstraites et interfaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 280
Accès statiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283
Accès à une classe arbitraire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283Définition en vue d’un accès statique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283Accès à la classe en cours. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284Accès à la classe parente. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284
Chargement automatique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 285
Utilisation via les sessions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 285
Utilisation de __sleep() et __wakeup(). . . . . . . . . . . . . . . . . . . . . . . . . . . . 285
Surcharge . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286
Affectations des attributs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 287Lecture d’attribut (Mutator) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 287Appel d’une méthode (Accessor) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288
Itérateurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288
Utilisation simple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288Utilisation complète . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291
Notations d’index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 292
Auto-incrémentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293
Coupler PHP et UML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 294
Introspection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 295
Principes pour démarrer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 295Les fonctions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 297
PHP Livre Page XVI Mercredi, 5. septembre 2007 6:12 18
Table des matièresXVII
Les objets, classes et interfaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 300
Les attributs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 302
CHAPITRE 13
Gestion de fichiers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303
Lecture et écriture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 303
Fonctions d’accès rapide . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 304
Ouverture d’un fichier . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 310
Lecture d’un fichier . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 313
Écriture dans un fichier. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 314
Positions dans le fichier . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 315
Fermeture d’un fichier . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 317
Gestion du tampon . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 317
Accès concurrents. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 318
Manipulation de fichiers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 320
Copie et déplacement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 320
Création et effacement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 321
Liens . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 322
Gestion des répertoires . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323
Parcourir un répertoire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 323
Position dans l’arborescence . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 325
Créations et effacements. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 326
Informations sur les fichiers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 326
Existence d’un fichier. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 327
Dates de fichiers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 327
Taille de fichier . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 328
Espace disque disponible . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 328
Nom et adresse d’un fichier . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 329
Nature des fichiers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 329
Liens symboliques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 330
Permissions et droits d’accès . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 330
Changement de propriétaire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 332
Modifier les permissions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 332
Masque par défaut . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 332
PHP Livre Page XVII Mercredi, 5. septembre 2007 6:12 18
PHP 5 avancéXVIII
Sécurité et fichiers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333
Permissions et droits d’accès . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333Arguments utilisateur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333Safe_mode et open_basedir . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333
Cas d’application . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 334
Outil de gestion documentaire simple . . . . . . . . . . . . . . . . . . . . . . . . . . . . 334
CHAPITRE 14
Gestion des flux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 337
Exécution de programmes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 337
Lancement sans interactions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 337Lancement interactif . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 341Sécurité et programmes externes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 347
Gestion des sockets réseau . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 347
Ouverture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 348Lecture et écriture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 349Fermeture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 349Fonctions de contrôle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 349
Gestion unifiée des flux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 351
Types de flux gérés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 352Utilisation simple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 355Contextes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 359Filtres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 361Types personnalisés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 364
Cas d’application . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 366
Système de paiement en ligne . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 366Sauvegardes automatiques pour interface réseau . . . . . . . . . . . . . . . . . . . . 369Conversion entre jeux de caractères . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 371
CHAPITRE 15
Flux de sortie PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 375
Principes et utilisations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 375
Principe de fonctionnement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 375Exemples d’utilisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 376
Gestion du tampon de sortie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 377
Début et arrêt de la mise en tampon . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 377
PHP Livre Page XVIII Mercredi, 5. septembre 2007 6:12 18
Table des matièresXIX
Récupération du contenu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 377
Imbrication de tampons . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 379
Informations sur le tampon. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 379
Filtres automatiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 380
Compression des pages avec zlib . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 380
Conversion entre jeux de caractères . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 381
Filtres utilisateur. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 382
Automatisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 383
Tampon interne de PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 384
Délai avant affichage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 384
Vider le tampon . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 384
Autres tampons en jeu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 384
CHAPITRE 16
Envoyer et recevoir des e-mails . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 385
De l’utilité de gérer des e-mails . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 385
Webmail Open Source . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 386
Mise en œuvre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 388
Prérequis techniques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 388
Anatomie d’un e-mail. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 389
Envoyer des e-mails . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 390
Courrier électronique multimédia . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 393
Envoyer des e-mails au format HTML. . . . . . . . . . . . . . . . . . . . . . . . . . . . 395
Envoyer des pièces jointes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 397
Recevoir des e-mails. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 402
Astuces et sécurité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 406
Lancer un script à la réception . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 406
Vérification d’une adresse e-mail. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 407
Espacer vos envois en masse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 408
Bibliothèques Open Source . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 408
HTML Mime mail par phpguru.org . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 408
Cas d’application . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 411
Gestion d’une lettre d’information . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 411
PHP Livre Page XIX Mercredi, 5. septembre 2007 6:12 18
PHP 5 avancéXX
CHAPITRE 17
Travailler avec une base de données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 413
Utilisation d’un SGBD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 413
Qu’est-ce qu’un SGBD ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 413Travailler avec un SGBD relationnel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 414
Présentation de MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 415
Points forts/points faibles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 415Fonctionnalités . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 417Types de tables MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 418
Outils d’administration Open Source . . . . . . . . . . . . . . . . . . . . . . . . . . . 421
phpMyAdmin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 422
Les commandes SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 423
Créer une base de données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 424Créer des tables. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 425Modifier des tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 431Supprimer des tables. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 432Insérer des données (INSERT) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 432Modifier des données (UPDATE) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 434Effacer des données (DELETE) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 435Remplacer des données (REPLACE) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 436Filtrer avec la clause WHERE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 437Sélectionner des données (SELECT) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 438Gérer les transactions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 441
CHAPITRE 18
Utiliser une base de données avec PHP . . . . . . . . . . . . . . . . . . . . 443
Approche classique PHP 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 443
PDO, PHP Data Object . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 445
Particularités . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 445
Utiliser votre base de données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 446
Structure des classes de PDO . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 447
Prise en main rapide . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 448
Connexion au serveur de données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 450
Structure du DSN . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 450
PHP Livre Page XX Mercredi, 5. septembre 2007 6:12 18
Table des matièresXXI
Utiliser des connexions persistantes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 451Gérer les erreurs de connexion. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 452Fermer une connexion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 453Se connecter à plusieurs bases de données. . . . . . . . . . . . . . . . . . . . . . . . . 454Créer un fichier de configuration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 455
Effectuer une requête . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 456
Requêtes invalides . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 457Requête de sélection. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 457Requête d’insertion / modification . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 461Sécurité et échappements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 463
Gestion des erreurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 465
Utiliser les exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 466
Gestion des transactions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 466
Les requêtes préparées . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 468
Construction de la requête . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 469Préparer une requête. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 470Lier des données à des paramètres et exécution. . . . . . . . . . . . . . . . . . . . . 470Exploitation d’une requête de sélection . . . . . . . . . . . . . . . . . . . . . . . . . . . 472Fermeture de la requête préparée . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 473
Cas d’application . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 473
Gestion de publication . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 473
CHAPITRE 19
Erreurs et exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 483
Explications sur les erreurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 483
Qu’est-ce qu’une erreur ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 483Pourquoi gérer les erreurs ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 484Que faire avec les erreurs ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 484
Les erreurs PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 485
Description d’une erreur PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 485Les bases d’une gestion d’erreur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 486Niveaux d’erreurs et filtres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 488Créer une erreur manuellement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 491Affichage des erreurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 492Journalisation des erreurs (log) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 493Personnaliser le gestionnaire d’erreurs. . . . . . . . . . . . . . . . . . . . . . . . . . . . 498
PHP Livre Page XXI Mercredi, 5. septembre 2007 6:12 18
PHP 5 avancéXXII
Les assertions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 499
Description d’une assertion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 499Utilisation d’une assertion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 499Désactivation des assertions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 500Configuration des assertions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 500Personnalisation de la gestion. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 502
Les exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 503
Description d’une exception . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 503Lancement d’une exception . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 504Réception d’une exception . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 504Filtrage des exceptions reçues . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 505Propagation des exceptions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 506Utilisation des exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 508
Politiques de gestion d’erreur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 509
Le développement. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 509Être averti lors d’un problème . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 509Toujours agir lors d’une erreur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 510Externaliser les alertes de sécurité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 510Gardez des traces sur le contexte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 510
CHAPITRE 20
XML : concepts et SimpleXML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 513
De l’utilité du XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 513
Gains apportés par XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 514Exemples d’utilisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 514
Présentation et prérequis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 514
Structure du XML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 515Principaux formats . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 519
Gérer le XML à la main . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 521
Création d’un nouveau fichier . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 521Relecture et manipulations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 523
Ecrire du XML avec XMLWriter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 523
Prise en main rapide . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 524Fonctionnalités avancées . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 525
Utilisation de SimpleXML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 526
Import et export d’un document . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 527
PHP Livre Page XXII Mercredi, 5. septembre 2007 6:12 18
Table des matièresXXIII
Manipulation des éléments. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 528
Manipulation des attributs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 532
Recherche Xpath . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 533
Extension des objets SimpleXML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 535
Cas d’application . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 535
Lecture d’un fichier RSS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 535
CHAPITRE 21
XML avancé . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 539
Relecture d’un XML avec SAX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 539
Fonctionnement des événements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 540
Initialisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 541
Réagir à des événements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 543
Envoi des données et analyse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 547
Manipulation avec DOM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 549
Structure générale. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 550
L’objet document . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 551
Description d’un nÏ ud . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 553
Navigation dans l’arbre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 555
Gestion des attributs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 560
Création de nœuds . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 562
Modification de l’arbre XML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 564
Création d’un document complet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 566
Recherche Xpath . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 567
Extension des classes DOM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 568
Utilisation de Xinclude. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 569
Validation et conformité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 569
Transformation XML par XSLT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 570
Utilisation du module XSL. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 570
Initialisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 571
Chargement de la feuille de style . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 571
Transformation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 571
Paramètres de transformation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 572
Extensions et interactions avec PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 572
PHP Livre Page XXIII Mercredi, 5. septembre 2007 6:12 18
PHP 5 avancéXXIV
CHAPITRE 22
Les services web . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 575
Introduction aux services web . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 575
Protocoles et technologies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 575Principe d’un appel à un service. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 579
Utilisation simple (avec WSDL) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 583
Créer un client SOAP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 584Créer un serveur SOAP. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 585Persistance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 589Cache WSDL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 590
Utiliser SOAP sans WSDL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 591
Créer un client SOAP sans WSDL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 591Serveur SOAP sans WSDL. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 592Gestion des types et des structures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 593
Compatibilité .Net et formats . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 595
Différents formats de message . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 595Compatibilité avec un service .Net . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 596
Autres détails et possibilités . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 596
Codage caractères . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 596Définir des en-têtes SOAP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 597Utiliser un autre transport que HTTP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 598
Gestion des erreurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 598
Erreurs reçues par un client SOAP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 599Utilisation des traces. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 599Renvoyer une erreur dans un serveur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 600
CHAPITRE 23
Les templates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 601
De l’utilité des templates . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 601
Moteurs de templates Open Source . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 602
Une solution légère : PHPLib . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 602Le couteau suisse : smarty . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 602Un système original : Templeet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 603
Différentes approches . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 603
L’approche PHP natif . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 604
PHP Livre Page XXIV Mercredi, 5. septembre 2007 6:12 18
Table des matièresXXV
L’approche search&replace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 606L’approche par composants . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 608Utilisation de XML et XSLT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 609
Analyse et choix . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 610
Pérennité de la solution retenue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 611Simplicité pour les graphistes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 611Simplicité pour les développeurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 612Les performances du moteur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 612
Bibliothèques Open Source . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 613
PHPLib . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 613Smarty . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 616Templeet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 622
CHAPITRE 24
Les systèmes de cache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 627
De l’utilité des caches . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 627
Outils de cache Open Source . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 628
Mise en œuvre . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 628
Les caches globaux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 628
Cache d’une page HTML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 629Cache de fichiers de différents types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 631Cache de configuration. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 632
Cache des données utilisateur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 632
Cache par session . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 633
Les caches HTTP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 633
Dates de mises à jour des fichiers. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 634Utilisation des serveurs proxies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 635Utiliser la date d’expiration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 637
Mise à jour du cache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 637
Détection de la modification. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 638Temps de validité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 638Sites semi-statiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 639
Pear::Cache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 639
La classe générique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 640
PHP Livre Page XXV Mercredi, 5. septembre 2007 6:12 18
PHP 5 avancéXXVI
Classe pour le Cache HTML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 642Autres caches . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 643
Pear::Cache_Lite . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 644
Utilisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 644Spécialisations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 645
Étude de cas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 646
Cache pour un site d’actualité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 646
CHAPITRE 25
Gestion des images . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 649
Utilité de la gestion d’images . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 649
Prérequis techniques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 650
Initialisation et utilisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 650
La création du modèle de l’image . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 650Libérer les ressources mémoire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 653Affichage de l’image sur le navigateur . . . . . . . . . . . . . . . . . . . . . . . . . . . . 654Enregistrer l’image dans un fichier. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 655
Travail sur une image . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 656
Le référentiel. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 656Tracer des formes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 656Écrire du texte. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 659Copie d’une zone d’image . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 663Gestion de la palette de couleurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 664Connaître la taille d’une image. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 665
Astuces et remarques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 666
Éviter les fausses couleurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 666Limite de temps . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 666Malvoyants et référencement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 666
L’outil Open Source de gestion d’albums photos : Gallery . . . . . . . . . 667
La bibliothèque Open Source JpGraph . . . . . . . . . . . . . . . . . . . . . . . . . 668
Installation et configuration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 669Architecture de la JpGraph . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 670Création d’un graphique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 671Envoi et enregistrement de l’image . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 672Gérer les polices de caractères . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 672Propriétés et méthodes communes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 673
PHP Livre Page XXVI Mercredi, 5. septembre 2007 6:12 18
Table des matièresXXVII
Les graphiques à base de lignes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 673Les graphiques en camembert . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 676D’autres types de graphiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 679
Étude de cas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 680
Redimensionner des images . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 680Superposer des images . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 683
CHAPITRE 26
Expressions régulières . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 685
Syntaxe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 685
Protections et échappements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 686Délimitation et présentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 686Chaîne de recherche simple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 687Construction d’expression . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 688Gestion des occurrences multiples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 691Assertions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 693Captures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 695Modificateurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 696
Les fonctions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 697
Chercher une correspondance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 697Faire des remplacements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 699Échappement et protections . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 702
Performances . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 703
Fonctionnement du moteur. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 703Stratégies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 704Boucles infinies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 704
CHAPITRE 27
Sécurité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 705
Qu’est-ce que la sécurité ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 705
Préoccupations du gestionnaire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 706Préoccupations de l’utilisateur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 706Pourquoi parler de l’utilisateur ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 707
Configuration et sécurité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 708
Interface avec le serveur web . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 709Safe_mode et restrictions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 711
PHP Livre Page XXVII Mercredi, 5. septembre 2007 6:12 18
PHP 5 avancéXXVIII
Échappement automatique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 712Variables globales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 713Sessions et identifiants . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 713Mises à jour du logiciel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 715Stockage des données et fichiers. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 715
Sécurité de l’application . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 717
Vérification des entrées utilisateur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 717Éviter les principales attaques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 721Emplacement des contrôles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 725Gérer les erreurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 728Sécuriser les sessions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 728Chiffrement et sécurité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 729
Bonnes habitudes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 731
Vérifiez vos résultats. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 732Ne croyez pas l’utilisateur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 733N’exagérez pas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 734Faites faire un audit externe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 734
CHAPITRE 28
Outils de développement PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 735
Éditeurs de texte & IDE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 735
UltraEdit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 736PHPEdit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 738Eclipse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 744Le Zend Studio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 746
Les outils de modélisation/RAD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 749
Macromedia Dreamweaver MX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 749WaterProof ::UML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 754UML2PHP5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 759
CHAPITRE 29
Les frameworks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 763
Ce qu’est un framework . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 763
Un cadre de travail . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 763La séparation MVC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 764Les avantages d’un framework . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 764
PHP Livre Page XXVIII Mercredi, 5. septembre 2007 6:12 18
Table des matièresXXIX
Quelques frameworks disponibles en Open Source . . . . . . . . . . . . . . . 765
Copix et Jelix . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 765Symfony . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 766Zend Framework . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 766Les autres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 767
Courte introduction à Symfony . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 768
Installation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 768Initialisation de l’application . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 768Génération du modèle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 769Premier contrôleur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 769Lien avec la vue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 771Le test . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 772Quelques points non abordés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 772Documentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 773
ANNEXE
Ressources en ligne . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 775
Bibliothèques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 775Applications PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 779ERP. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 781
Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 785
PHP Livre Page XXIX Mercredi, 5. septembre 2007 6:12 18
Recommended