É r i c D a s p e t
C y r i l P i e r r e d e G e y e r
P r é f a c e d e D a m i e n S e g u y
PHP 5
avancé
4e
édition
L’une des grandes forces de PHP est sa facilité de prise en main. Il se révèle pratique à
mettre en œuvre grâce à sa docum...
Table des matières
Avant-propos . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ...
PHP 5 avancé
VIII
PHP en France et dans le monde . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
Les chif...
Table des matières
IX
Enchaînement des instructions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55
...
PHP 5 avancé
X
Inclure des bibliothèques ou des fichiers . . . . . . . . . . . . . . . . . . . . . . . . 105
Différence ent...
Table des matières
XI
Trier les tableaux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ....
PHP 5 avancé
XII
Créer des valeurs aléatoires . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149
...
Table des matières
XIII
Retours à la ligne et zones de texte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1...
PHP 5 avancé
XIV
Environnement système . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 212
N...
Table des matières
XV
Stockage des données de session . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236
...
PHP 5 avancé
XVI
Garder la compatibilité avec PHP 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266
La cop...
Table des matières
XVII
Les objets, classes et interfaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ...
PHP 5 avancé
XVIII
Sécurité et fichiers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ....
Table des matières
XIX
Récupération du contenu . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ....
PHP 5 avancé
XX
CHAPITRE 17
Travailler avec
une base de données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ...
Table des matières
XXI
Utiliser des connexions persistantes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 451...
PHP 5 avancé
XXII
Les assertions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ....
Table des matières
XXIII
Manipulation des éléments. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ...
PHP 5 avancé
XXIV
CHAPITRE 22
Les services web . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ....
Table des matières
XXV
L’approche search&replace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6...
PHP 5 avancé
XXVI
Classe pour le Cache HTML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 642
Autr...
Table des matières
XXVII
Les graphiques à base de lignes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . ....
PHP 5 avancé
XXVIII
Échappement automatique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 712
...
Table des matières
XXIX
Quelques frameworks disponibles en Open Source . . . . . . . . . . . . . . . 765
Copix et Jelix . ...
Avant-propos
Pourquoi ce livre ?
Pourquoi écrire un livre si son sujet n’est pas une affaire de passion ? En effet, pour n...
PHP 5 avancé
XXXII
Structure de l’ouvrage
Cet ouvrage s’articule autour des thèmes abordés lors du développement d’une app...
Avant-propos
XXXIII
les sessions, leur utilité et leur sécurité. Les développeurs confirmés y trouveront les
informations p...
PHP 5 avancé
XXXIV
La quatrième et dernière partie traite des sujets annexes lors de vos développements, la
sécurité et le...
1
Qu’est-ce que PHP ?
PHP (PHP Hypertext PreProcessor) est un langage de programmation. Sa principale
application se situe...
PHP 5 avancé
2
exemple d’afficher la date du jour à un endroit bien précis du visuel. On parle alors de
page dynamique.
Dan...
Qu’est-ce que PHP ?
CHAPITRE 1
3
Que faire avec PHP ?
La principale utilisation que l’on peut avoir de PHP est l’utilisati...
PHP 5 avancé
4
Particularités de PHP
Les principaux « concurrents » de PHP sont Perl, .NET et ses différents langages, JSP...
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Php5 avancé
Prochain SlideShare
Chargement dans…5
×

Php5 avancé

259 vues

Publié le

PHP 5 avace

Publié dans : Technologie
0 commentaire
0 j’aime
Statistiques
Remarques
  • Soyez le premier à commenter

  • Soyez le premier à aimer ceci

Aucun téléchargement
Vues
Nombre de vues
259
Sur SlideShare
0
Issues des intégrations
0
Intégrations
4
Actions
Partages
0
Téléchargements
14
Commentaires
0
J’aime
0
Intégrations 0
Aucune incorporation

Aucune remarque pour cette diapositive

Php5 avancé

  1. 1. É r i c D a s p e t C y r i l P i e r r e d e G e y e r P r é f a c e d e D a m i e n S e g u y PHP 5 avancé 4e édition
  2. 2. L’une des grandes forces de PHP est sa facilité de prise en main. Il se révèle pratique à mettre en œuvre grâce à sa documentation de référence et aux nombreuses applications disponibles. PHP est un langage didactique car il ne masque pas la complexité et pousse l’utilisateur à comprendre et à appliquer les standards. À l’inverse, d’autres technologies encadrent beaucoup l’utilisateur et l’abandonnent lorsque les problèmes deviennent plus complexes. PHP distille progressivement les technologies qu’il exploite, et donne toujours au programmeur la possibilité d’aller plus loin. La maîtrise du langage (on pourrait même parler de plate-forme) requiert donc un appren- tissage permanent, qui va de pair avec l’utilisation de PHP. Pour aller plus vite avec PHP, il faut expérimenter, ou profiter de l’expérience des autres. C’est dans ce sens que PHP 5 avancé a été pensé : il est fait pour ceux qui veulent aller plus loin, et plus vite. PHP 5 avancé est un livre à garder à côté de son clavier. Contrairement aux autres livres pédagogiques, il propose un panorama très large du langage. Il fournit des méthodes pour chaque aspect de la programmation. Bien sûr, on y retrouve tout ce qui a fait le succès de PHP 4, mais le livre se concentre surtout sur les nouveautés introduites en PHP 5. Cette nouvelle évolution du langage introduit la programmation objet moderne, simplifie le XML, met sur le devant de la scène SQLite et élève le niveau de programmation en général. PHP 5 est aussi la preuve que les projets Open Source peuvent rivaliser avec les éditeurs propriétaires, en termes de niveau de fonctionnalités, de sécurité, de fiabilité et au niveau théorique. Ce livre est résolument tourné vers les informaticiens qui veulent aller plus loin avec PHP et ne jamais manquer de ressources pour toutes leurs applications Web. Il sert de référence à tous ceux qui veulent intelligemment tirer le meilleur de la technologie. Damien SEGUY Responsable de la documentation PHP française Vice-président AFUP Webmestre Nexen.net Préface
  3. 3. 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 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 1 Que faire avec PHP ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3 Particularités de PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4 Historique. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6 Mode de développement du projet PHP. . . . . . . . . . . . . . . . . . . . . . . . . . . 8 Nouveautés de PHP 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 La programmation orientée objet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 Refonte et simplification de XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 Intégration de la base SQLite. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10 Simplification des tâches courantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 PDO : socle commun aux SGBD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 Architecture et fonctionnement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 Architecture technique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 11 Fonctionnement de PHP. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
  4. 4. PHP 5 avancé VIII PHP en France et dans le monde . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 Les chiffres d’utilisation en France . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14 La communauté française. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 15 Les ressources d’aide francophones . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 16 Les ressources d’aide anglophones. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23 CHAPITRE 2 Installer et configurer PHP 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 Migration vers PHP 5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 27 Incompatibilités . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 PHP en ligne de commande et en CGI . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 Modes d’installation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 CGI . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 28 Modules . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 Installer PHP 5 sous MS-Windows . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 Installation automatique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 29 Installation manuelle. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 30 Installer PHP 5 sous Unix . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 Utilisation automatisée . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 38 Installation manuelle d’Apache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 39 Installation manuelle de MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 40 Installation manuelle de PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 41 Gestion des droits d’accès . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 Modules additionnels PECL. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44 Configuration de PHP avec php.ini . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45 Utilisation des modules et des extensions . . . . . . . . . . . . . . . . . . . . . . . . . 45 Les directives de configuration. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46 Gestion de la configuration. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 50 CHAPITRE 3 Les structures de base . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 Insertion de PHP dans HTML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 53 Balises d’ouverture et de fermeture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54 Les commentaires. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 54
  5. 5. Table des matières IX Enchaînement des instructions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 55 Structure du document . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 56 Exécuter du code PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57 Constantes et variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 Variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59 Constantes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 63 Types de données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 64 Booléens (boolean). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65 Les nombres entiers (integer). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 65 Les nombres flottants (double, float) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66 Les chaînes de caractères (string). . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 66 Les tableaux (array) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 71 Transtypage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 76 CHAPITRE 4 Traitements de base . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79 Les opérateurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79 Opérateurs d’affectation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79 Opérateurs arithmétiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 81 Opérateurs combinés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 83 La concaténation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84 Opérateurs de comparaison . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 84 Opérateurs logiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86 Opérateurs sur les bits . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86 Priorités entre opérateurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 87 Structures de contrôle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88 Les conditions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88 Les boucles. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 93 Les instructions d’arrêt. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 98 Les fonctions utilisateurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99 Déclaration d’une fonction. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 99 Appel de fonction. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 100 Visibilité des variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 101 Retourner plusieurs valeurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 103 Nombre de paramètres indéfini . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 104
  6. 6. PHP 5 avancé X Inclure des bibliothèques ou des fichiers . . . . . . . . . . . . . . . . . . . . . . . . 105 Différence entre require() et include() . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106 require_once() et include_once() . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 106 CHAPITRE 5 Traitements de chaînes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107 Fonctions d’affichage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107 Affichages simples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 107 Affichages avec masques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 108 Informations sur une chaîne . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111 Accéder à un caractère précis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111 Valeur ASCII d’un caractère. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111 Taille d’une chaîne . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 111 Position d’une sous-chaîne . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 113 Présence de certains caractères. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114 Conversions et formatages . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114 Protections et échappements. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 114 Conventions d’affichage locales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 118 Jeux de caractères . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 119 Manipulations sur les chaînes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122 Recherche d’une sous-chaîne . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122 Récupérer une sous-chaîne . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122 Remplacer un motif . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 122 Fonctions d’élagage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 123 Remplissage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124 Changement de casse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 124 Coupure 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 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 128 Recherche de la clé correspondante . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 129 Nombre d’occurrences d’un élément . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130 Récupération aléatoire d’éléments . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 130
  7. 7. Table des matières XI Trier les tableaux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131 Tri par valeur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131 Tri en ordre inverse. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 131 Garder les associations clé-valeur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132 Tri par clé . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132 Tri naturel. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 132 Trier avec une fonction utilisateur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 133 Tri multicritère . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134 Extractions et remplacement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134 Affecter des variables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 134 Sérialisation de tableaux. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135 Extraction d’un sous-tableau . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 135 Remplacement d’un sous-tableau. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 136 Gestion des clés et des valeurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137 Liste des clés utilisées . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137 Liste des valeurs utilisées. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137 Échanger les clés et les valeurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 137 Fusions et séparations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138 Fusion de plusieurs tableaux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 138 Séparation d’un tableau en plusieurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 139 Différences et intersections . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140 Différences entre tableaux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140 Intersections entre deux tableaux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 140 Gestion 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 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 143 Affichage de débogage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 146 Coloration syntaxique de code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 147 Fonctions mathématiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148 Connaître les extrémités . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148 Arrondir des valeurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 148
  8. 8. PHP 5 avancé XII Créer des valeurs aléatoires . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 149 Travailler 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 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 155 Corrélation IP/DNS . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 156 Fonctions de chiffrement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 157 Quelques définitions : chiffrement, hachage, codage/décodage. . . . . . . . . 157 Fonctions de hachage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 158 Fonctions de codage et décodage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 162 Exécution de code . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163 Fonction à l’arrêt du script . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 163 Exécution d’une chaîne de code PHP. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 164 Login/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 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 169 Méthode d’envoi du formulaire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 170 Champ de texte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 171 Zone de texte. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 173 Cases à cocher . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 174 Bouton radio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 175 Liste de sélections et liste déroulante . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 176 Champs cachés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 178 Les champs pour mot de passe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179 Image cliquable. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179 Envoi d’images et de fichiers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 179 Réception des données en PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180 Utilisation des superglobales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 180 Récupération d’une donnée simple. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 181
  9. 9. Table des matières XIII Retours à la ligne et zones de texte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 182 Utilisation des cases à cocher. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 184 Validation de données avec l’extension Filter . . . . . . . . . . . . . . . . . . . . . . 184 Listes à sélections multiples. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 191 Gestion des images cliquables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 192 Téléchargements d’images et de fichiers . . . . . . . . . . . . . . . . . . . . . . . . . . 192 Formulaire dynamique et tableaux. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 194 Autres problématiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195 Gestion du temps . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 195 Gestion de la taille des données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196 Stockage des fichiers temporaires . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196 Sécurité et données reçues . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 196 Procédure de gestion des formulaires. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 197 CHAPITRE 9 Environnement web et superglobales . . . . . . . . . . . . . . . . . . . . . . 199 Descriptif du contexte Web . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199 Client-serveur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 199 En-tête et contenu. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 200 Variables superglobales . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201 Informations sur le serveur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 201 Nom du serveur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202 Racine du serveur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 202 Autres informations sur le serveur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203 Authentification HTTP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 203 Principes du protocole HTTP. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204 Gestion avec PHP. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 204 Authentification par le serveur web . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206 Paramètres de la connexion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206 Adresse IP et port du client . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 206 Adresse IP et port du serveur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208 Description de la requête HTTP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 208 Paramètres de la requête. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209 L’adresse demandée (URL) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 209 Informations fournies par le client . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 210
  10. 10. 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 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 213 Nombre 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. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 217 Lecture d’un cookie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 218 Suppression d’un cookie. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 220 Modifier 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 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 225 Les 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 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 234 Suppression d’une session . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235 Définition manuelle de l’initialisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . 235
  11. 11. Table des matières XV Stockage des données de session . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 236 Paramètres du cookie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237 Accès concurrents aux sessions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 237 Configuration de PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238 Initialisation des sessions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238 Stockage des données de session . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 238 Paramètres du cookie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239 Expiration des sessions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239 Gestion du cache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 239 Transmission de l’identifiant . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 240 Gestionnaires de sessions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 241 Définir un gestionnaire personnalisé . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 242 Limitations et sécurité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245 Cachez les sessions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245 N’utilisez pas la réécriture des liens. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245 Les identifiants par défaut suffisent . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 245 Attaque par fixation de session. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 246 Vérifiez l’identité de l’utilisateur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 246 N’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 ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 253 Qu’est-ce qu’un objet ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254 Qu’est-ce qu’une classe ?. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 254 Qu’est-ce qu’une instance ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255 Utilisation simple des objets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255 Déclarer une classe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 255 Utilisation des objets . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 257 Vérifier le type d’un objet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 262 Copie et référence . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264 Le comportement PHP 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 264 PHP 5, le passage par référence . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 265
  12. 12. PHP 5 avancé XVI Garder la compatibilité avec PHP 4 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266 La copie explicite d’objet, ou clonage . . . . . . . . . . . . . . . . . . . . . . . . . . . . 266 Égalité et identité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269 Constructeurs et destructeurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269 Constructeur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 269 Destructeur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 271 La notion d’héritage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272 Définition de la notion d’héritage . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272 Définition d’une classe héritée . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 272 Redéfinition d’attribut ou de méthode . . . . . . . . . . . . . . . . . . . . . . . . . . . . 274 Accès aux méthodes parentes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 275 Sûreté de programmation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 276 Typage. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 279 Classes abstraites et interfaces . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 280 Accès statiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283 Accès à une classe arbitraire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283 Définition en vue d’un accès statique. . . . . . . . . . . . . . . . . . . . . . . . . . . . . 283 Accès à la classe en cours. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284 Accès à la classe parente. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 284 Chargement automatique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 285 Utilisation via les sessions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 285 Utilisation de __sleep() et __wakeup(). . . . . . . . . . . . . . . . . . . . . . . . . . . . 285 Surcharge . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 286 Affectations des attributs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 287 Lecture d’attribut (Mutator) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 287 Appel d’une méthode (Accessor) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288 Itérateurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288 Utilisation simple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 288 Utilisation complète . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 291 Notations d’index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 292 Auto-incrémentation. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 293 Coupler PHP et UML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 294 Introspection . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 295 Principes pour démarrer . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 295 Les fonctions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 297
  13. 13. Table des matières XVII 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
  14. 14. PHP 5 avancé XVIII Sécurité et fichiers . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333 Permissions et droits d’accès . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333 Arguments utilisateur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 333 Safe_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. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 337 Lancement interactif. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 341 Sécurité et programmes externes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 347 Gestion des sockets réseau . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 347 Ouverture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 348 Lecture et écriture. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 349 Fermeture . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 349 Fonctions de contrôle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 349 Gestion unifiée des flux . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 351 Types de flux gérés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 352 Utilisation simple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 355 Contextes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 359 Filtres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 361 Types personnalisés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 364 Cas d’application . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 366 Système de paiement en ligne . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 366 Sauvegardes automatiques pour interface réseau . . . . . . . . . . . . . . . . . . . . 369 Conversion entre jeux de caractères . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 371 CHAPITRE 15 Flux de sortie PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 375 Principes et utilisations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 375 Principe de fonctionnement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 375 Exemples d’utilisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 376 Gestion du tampon de sortie . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 377 Début et arrêt de la mise en tampon . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 377
  15. 15. Table des matières XIX 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
  16. 16. 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 ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 413 Travailler avec un SGBD relationnel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 414 Présentation de MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 415 Points forts/points faibles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 415 Fonctionnalités . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 417 Types de tables MySQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 418 Outils d’administration Open Source . . . . . . . . . . . . . . . . . . . . . . . . . . . 421 phpMyAdmin . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 422 Les commandes SQL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 423 Créer une base de données . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 424 Créer des tables. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 425 Modifier des tables . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 431 Supprimer des tables. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 432 Insérer des données (INSERT) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 432 Modifier des données (UPDATE) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 434 Effacer des données (DELETE) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 435 Remplacer des données (REPLACE) . . . . . . . . . . . . . . . . . . . . . . . . . . . . 436 Filtrer avec la clause WHERE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 437 Sélectionner des données (SELECT) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 438 Gé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
  17. 17. Table des matières XXI Utiliser des connexions persistantes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 451 Gérer les erreurs de connexion. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 452 Fermer une connexion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 453 Se connecter à plusieurs bases de données. . . . . . . . . . . . . . . . . . . . . . . . . 454 Créer un fichier de configuration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 455 Effectuer une requête . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 456 Requêtes invalides . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 457 Requête de sélection. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 457 Requête d’insertion / modification . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 461 Sé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 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 469 Préparer une requête. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 470 Lier des données à des paramètres et exécution. . . . . . . . . . . . . . . . . . . . . 470 Exploitation d’une requête de sélection . . . . . . . . . . . . . . . . . . . . . . . . . . . 472 Fermeture 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 ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 483 Pourquoi gérer les erreurs ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 484 Que faire avec les erreurs ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 484 Les erreurs PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 485 Description d’une erreur PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 485 Les bases d’une gestion d’erreur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 486 Niveaux d’erreurs et filtres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 488 Créer une erreur manuellement . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 491 Affichage des erreurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 492 Journalisation des erreurs (log) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 493 Personnaliser le gestionnaire d’erreurs. . . . . . . . . . . . . . . . . . . . . . . . . . . . 498
  18. 18. PHP 5 avancé XXII Les assertions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 499 Description d’une assertion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 499 Utilisation d’une assertion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 499 Désactivation des assertions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 500 Configuration des assertions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 500 Personnalisation de la gestion. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 502 Les exceptions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 503 Description d’une exception. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 503 Lancement d’une exception . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 504 Réception d’une exception . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 504 Filtrage des exceptions reçues . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 505 Propagation des exceptions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 506 Utilisation des exceptions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 508 Politiques de gestion d’erreur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 509 Le développement. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 509 Être averti lors d’un problème . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 509 Toujours agir lors d’une erreur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 510 Externaliser les alertes de sécurité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 510 Gardez des traces sur le contexte . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 510 CHAPITRE 20 XML : concepts et SimpleXML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 513 De l’utilité du XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 513 Gains apportés par XML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 514 Exemples d’utilisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 514 Présentation et prérequis . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 514 Structure du XML. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 515 Principaux formats . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 519 Gérer le XML à la main . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 521 Création d’un nouveau fichier . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 521 Relecture et manipulations . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 523 Ecrire du XML avec XMLWriter . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 523 Prise en main rapide . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 524 Fonctionnalités avancées . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 525 Utilisation de SimpleXML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 526 Import et export d’un document . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 527
  19. 19. Table des matières XXIII 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
  20. 20. PHP 5 avancé XXIV CHAPITRE 22 Les services web . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 575 Introduction aux services web . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 575 Protocoles et technologies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 575 Principe d’un appel à un service. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 579 Utilisation simple (avec WSDL) . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 583 Créer un client SOAP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 584 Créer un serveur SOAP. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 585 Persistance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 589 Cache WSDL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 590 Utiliser SOAP sans WSDL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 591 Créer un client SOAP sans WSDL . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 591 Serveur SOAP sans WSDL. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 592 Gestion des types et des structures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 593 Compatibilité .Net et formats . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 595 Différents formats de message . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 595 Compatibilité avec un service .Net. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 596 Autres détails et possibilités . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 596 Codage caractères . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 596 Définir des en-têtes SOAP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 597 Utiliser un autre transport que HTTP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 598 Gestion des erreurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 598 Erreurs reçues par un client SOAP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 599 Utilisation des traces. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 599 Renvoyer 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. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 602 Le couteau suisse : smarty . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 602 Un système original : Templeet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 603 Différentes approches . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 603 L’approche PHP natif . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 604
  21. 21. Table des matières XXV L’approche search&replace . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 606 L’approche par composants . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 608 Utilisation de XML et XSLT . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 609 Analyse et choix . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 610 Pérennité de la solution retenue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 611 Simplicité pour les graphistes. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 611 Simplicité pour les développeurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 612 Les performances du moteur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 612 Bibliothèques Open Source . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 613 PHPLib. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 613 Smarty . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 616 Templeet . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 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. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 629 Cache de fichiers de différents types . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 631 Cache de configuration. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 632 Cache des données utilisateur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 632 Cache par session . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 633 Les caches HTTP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 633 Dates de mises à jour des fichiers. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 634 Utilisation des serveurs proxies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 635 Utiliser la date d’expiration . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 637 Mise à jour du cache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 637 Détection de la modification. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 638 Temps de validité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 638 Sites semi-statiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 639 Pear::Cache . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 639 La classe générique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 640
  22. 22. PHP 5 avancé XXVI Classe pour le Cache HTML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 642 Autres caches . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 643 Pear::Cache_Lite . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 644 Utilisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 644 Spé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 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 650 Libérer les ressources mémoire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 653 Affichage de l’image sur le navigateur. . . . . . . . . . . . . . . . . . . . . . . . . . . . 654 Enregistrer l’image dans un fichier. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 655 Travail sur une image . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 656 Le référentiel. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 656 Tracer des formes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 656 Écrire du texte. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 659 Copie d’une zone d’image . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 663 Gestion de la palette de couleurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 664 Connaître la taille d’une image. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 665 Astuces et remarques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 666 Éviter les fausses couleurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 666 Limite de temps . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 666 Malvoyants 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 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 669 Architecture de la JpGraph. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 670 Création d’un graphique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 671 Envoi et enregistrement de l’image . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 672 Gérer les polices de caractères . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 672 Propriétés et méthodes communes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 673
  23. 23. Table des matières XXVII Les graphiques à base de lignes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 673 Les graphiques en camembert . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 676 D’autres types de graphiques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 679 Étude de cas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 680 Redimensionner des images . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 680 Superposer des images . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 683 CHAPITRE 26 Expressions régulières . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 685 Syntaxe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 685 Protections et échappements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 686 Délimitation et présentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 686 Chaîne de recherche simple . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 687 Construction d’expression . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 688 Gestion des occurrences multiples . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 691 Assertions. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 693 Captures . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 695 Modificateurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 696 Les fonctions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 697 Chercher une correspondance . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 697 Faire des remplacements . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 699 Échappement et protections . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 702 Performances . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 703 Fonctionnement du moteur. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 703 Stratégies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 704 Boucles infinies . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 704 CHAPITRE 27 Sécurité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 705 Qu’est-ce que la sécurité ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 705 Préoccupations du gestionnaire . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 706 Préoccupations de l’utilisateur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 706 Pourquoi parler de l’utilisateur ? . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 707 Configuration et sécurité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 708 Interface avec le serveur web . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 709 Safe_mode et restrictions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 711
  24. 24. PHP 5 avancé XXVIII Échappement automatique . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 712 Variables globales. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 713 Sessions et identifiants . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 713 Mises à jour du logiciel . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 715 Stockage des données et fichiers. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 715 Sécurité de l’application . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 717 Vérification des entrées utilisateur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 717 Éviter les principales attaques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 721 Emplacement des contrôles . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 725 Gérer les erreurs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 728 Sécuriser les sessions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 728 Chiffrement et sécurité . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 729 Bonnes habitudes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 731 Vérifiez vos résultats. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 732 Ne croyez pas l’utilisateur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 733 N’exagérez pas . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 734 Faites faire un audit externe . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 734 CHAPITRE 28 Outils de développement PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 735 Éditeurs de texte & IDE . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 735 UltraEdit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 736 PHPEdit . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 738 Eclipse . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 744 Le Zend Studio . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 746 Les outils de modélisation/RAD . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 749 Macromedia Dreamweaver MX . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 749 WaterProof ::UML . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 754 UML2PHP5 . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 759 CHAPITRE 29 Les frameworks . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 763 Ce qu’est un framework . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 763 Un cadre de travail . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 763 La séparation MVC . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 764 Les avantages d’un framework . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 764
  25. 25. Table des matières XXIX Quelques frameworks disponibles en Open Source . . . . . . . . . . . . . . . 765 Copix et Jelix . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 765 Symfony . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 766 Zend Framework . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 766 Les autres . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 767 Courte introduction à Symfony . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 768 Installation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 768 Initialisation de l’application . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 768 Génération du modèle . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 769 Premier contrôleur . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 769 Lien avec la vue . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 771 Le test . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 772 Quelques points non abordés . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 772 Documentation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 773 ANNEXE Ressources en ligne . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 775 Bibliothèques . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 775 Applications PHP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 779 ERP. . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 781 Index . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 785
  26. 26. Avant-propos Pourquoi ce livre ? Pourquoi écrire un livre si son sujet n’est pas une affaire de passion ? En effet, pour nous, PHP est une affaire de cœur. Nous allons vous transmettre non seulement un savoir mais aussi une expérience et une passion. PHP peut être considéré comme un des fers de lance du monde Open Source. Toute l’image de cette philosophie de partage et d’entraide s’exprime à travers lui. Et si à une belle idée, on associe un produit fiable, stable, complet et étendu, pourquoi hésiter ? En dépit de ses atouts, PHP a été longtemps perçu par les professionnels comme un outil pour pages personnelles ou petits projets. Certes, il est adapté à ce type de missions, mais son spectre d’action est nettement plus vaste. Heureusement grâce à ses qualités intrin- sèques et à sa communauté qui a réussi à se faire entendre et à séduire, les mentalités ont fini par évoluer et PHP a été élevé à sa juste valeur. Ce livre, nous l’avons pensé et écrit pour des développeurs pointilleux désirant exploiter au mieux les capacités de PHP. Sans le rendre inaccessible aux débutants, nous souhai- tions qu’il soit utile à des développeurs professionnels ou d’un niveau avancé. L’arrivée de PHP 5 n’a finalement été qu’un prétexte pour nous pencher sur cet ouvrage. Nous avons tous deux des profils différents, l’un très technique et puriste, l’autre orienté vers le fonctionnel, la vulgarisation et la pédagogie. Le résultat se veut donc très pointu et très vaste tout en adoptant une approche pédagogue. La nouvelle version de PHP rompt avec l’ancien modèle objet : celui-ci, limité, a été remplacé par un modèle objet complet, et de nombreuses fonctionnalités ayant pour but de faciliter la vie du développeur ont été introduites. Nous avons désormais un langage mature, adapté à des projets web professionnels et qui n’a pas à rougir d’une comparaison avec d’autres langages ou architectures. Ces pages ont été conçues de façon à souligner ces nouveaux ajouts et à fournir une réfé- rence utile au jour le jour pour les développeurs PHP. Contrairement à d’autres ouvrages qui se fondent massivement sur l’excellente documentation de PHP (visible en ligne et à jour sur fr.php.net), nous avons souhaité réaliser un livre qui lui apporte une réelle valeur ajoutée, dépassant le simple étalage des fonctions et des paramètres.
  27. 27. PHP 5 avancé XXXII Structure de l’ouvrage Cet ouvrage s’articule autour des thèmes abordés lors du développement d’une applica- tion web. Chaque chapitre est centré sur un de ces thèmes. Il décrit les différentes fonc- tionnalités PHP qui s’y rapportent mais aussi tout ce qui les entoure et qui permettra de les mettre en œuvre. Des exemples concrets, des cas d’applications pratiques et des retours d’expériences seront régulièrement présentés. La première partie du livre fait office d’entrée en la matière : • Le chapitre 1 donne toutes les informations sur la plate-forme PHP, sa diffusion et les ressources d’aide que vous pourrez trouver, francophones et internationales. • Le chapitre 2 détaille les options de configuration les plus importantes et les procé- dures d’installation, sous Unix et Microsoft Windows. Il y est également présenté les différents points à prendre en compte pour une migration de PHP4 vers PHP5. La partie suivante concerne les fonctionnalités de base du langage. On y trouve les rappels sur la syntaxe et les structures, puis l’interface avec les pages web via les formu- laires ou cookies. Cette partie permet aux débutants d’apprendre les bonnes bases de PHP. Les développeurs confirmés pourront, eux, y trouver une référence avec quelques astuces et détails utiles : • Le chapitre 3 fait un rappel des syntaxes de base du langage PHP : types de données, affectation, organisation du code, etc. • Le chapitre 4 montre les structures de bases de PHP : les différentes boucles et conditions. • Le chapitre 5 détaille les différentes fonctions de gestion des chaînes de caractères. • Le chapitre 6 se focalise sur la gestion des tableaux et les fonctions afférentes. • Le chapitre 7 présente les quelques fonctions usuelles qui ne se rapportent pas à un sujet particulier et qui sont souvent utiles lors de développements. • Le chapitre 8 décrit l’interaction entre PHP et les formulaires HTML (variables, fichiers), ainsi que les superglobales PHP permettant leur manipulation. • Le chapitre 9 est le dernier de cette première partie très orientée vers la référence, il complète le précédent en s’intéressant à l’environnement autour de PHP : principalement la communication avec le serveur web, le système et le réseau. La troisième partie entre dans le cœur du sujet en se focalisant sur différents thèmes rencontrés dans le cadre du développement d’applications poussées. Le développeur confirmé y trouvera matière à progresser : • Le chapitre 10 commence cette section avec une description avancée des cookies, de leur utilisation et de leur environnement. On y retrouvera aussi quelques informations liées à la sécurité. • Le chapitre 11 prend la suite du chapitre sur les cookies pour évoquer les sessions. Outre la description simple de leur utilisation, nous abordons une réflexion globale sur
  28. 28. Avant-propos XXXIII les sessions, leur utilité et leur sécurité. Les développeurs confirmés y trouveront les informations pour mettre en œuvre leur propre gestionnaire de session. • Le chapitre 12 présente la plus grosse avancée de PHP 5 : la programmation orientée objet. Une description complète des fonctionnalités y est faite, mettant en exergue les différences fondamentales par rapport à PHP 4. • Le chapitre 13 décrit en détail la gestion des fichiers : lecture, écriture, manipulations, fichiers distants, etc. • Le chapitre 14 étend les notions abordées avec les fichiers pour manipuler tous types de flux de données : sockets réseaux, exécution de programmes externes et flux personnalisés. • Le chapitre 15 s’intéresse à la gestion du tampon de sortie de PHP : pouvoir appliquer un filtre sur les données envoyées au navigateur, pouvoir manipuler le flux de sortie pour compresser les pages web, etc. • Le chapitre 16 détaille tout ce que vous devez savoir concernant l’envoi et la réception d’e-mails : de l’utilisation pour envoyer un simple message texte jusqu’à la description des e-mails HTML ou avec pièces jointes. • Le chapitre 17 est dédié au langage SQL et aux SGBD en général. Une approche poussée du cas de MySQL est réalisée. • Le chapitre 18 présente en détail comment communiquer entre PHP et une base de données en utilisant PDO (PHP Data Object). • Le chapitre 19 est dédié à la gestion des erreurs avec PHP. La première partie décrit la gestion des erreurs classiques telles qu’on peut les voir dans PHP 4 et des assertions. La seconde partie décrit une nouveauté de PHP 5 : les exceptions. D’autres points comme la configuration, les journaux d’erreur ou la politique de gestion des erreurs sont aussi abordés. • Le chapitre 20 présente une autre nouveauté de PHP 5 : la gestion XML avec SimpleXML. Les notions basiques de gestion XML y seront abordées, ainsi que tout ce dont vous avez besoin pour lire et manipuler rapidement du XML. • Le chapitre 21 complète le précédent en donnant les méthodes pour les manipulations avancées que vous pourriez avoir à faire avec XML : SAX, DOM, XSLT, etc. • Le chapitre 22 traite des services web et particulièrement de SOAP. • Le chapitre 23 traite de la dissociation de la logique métier et du visuel : les templates. • Le chapitre 24 aborde toutes les problématiques de la gestion des caches. Il vous donne toutes les clés pour trouver ou créer le système adapté à vos besoins. • Le chapitre 25 détaille l’utilisation de l’extension GD. Elle vous permettra de produire ou manipuler facilement des images, des photos diagrammes ou des graphiques avec PHP. • Le chapitre 26 se focalise sur l’utilisation des expressions régulières. La syntaxe et l’utilisation des expressions compatibles Perl supportées par PHP seront décrites en détail.
  29. 29. PHP 5 avancé XXXIV La quatrième et dernière partie traite des sujets annexes lors de vos développements, la sécurité et les outils : • Le chapitre 27 fait un tour des aspects de la sécurité à prendre en compte lors du déve- loppement d’une application. Vous y trouverez des exemples de failles ou de problèmes fréquents ainsi que les bonnes habitudes pour les éviter. • Les chapitres 28 et 29 achèvent ce livre avec une description des différents outils de développement pour PHP et des frameworks intéressants. Remerciements Nous tenons à remercier tous ceux qui nous ont aidés à rédiger ce livre. Aux familles, proches et amis pour leur soutien et leur patience pendant ces longs mois de rédaction et de réflexion, à Eyrolles pour avoir cru en notre projet et l’avoir soutenu dès le départ, à Sarah Gedon, Romain Bourdon, Guillaume Ponçon, Sarah Haim, Grégoire Cachet, Valérie Poinsotte et Stéphane Deschamps pour leurs multiples aides pour le développement des divers chapitres, à, dans le désordre, Christophe Gesché (Moosh), Paul Bardinon, Jérôme Renard, , Alain Gazalet, Eudes Robichon, Frédéric Bordage, Guillaume Bouchard, Julien Jackubowski, Yoan Blanc, Laurent Jouanneau, Damien et Ghislain Seguy, Quentin Sinagra, Remi Pauchet, KDO, Xavier Langlet, Jean-Eudes Amrein, Raphaël Rousseau et Stéphane Raviart pour les diverses relectures qu’ils ont pu faire, à tous les lecteurs des précédentes éditions, qui par leurs retours nous ont permis d’améliorer cet ouvrage, … et tous les autres dont nous n’avons pas le nom complet, que nous n’avons pas pu recontacter ou que nous avons simplement oubliés dans la précipitation juste avant l’impression de cette page. Merci à tous, car sans vous ce livre n’aurait peut-être pas vu le jour. Éric Daspet et Cyril Pierre de Geyer
  30. 30. 1 Qu’est-ce que PHP ? PHP (PHP Hypertext PreProcessor) est un langage de programmation. Sa principale application se situe au niveau de la gestion des sites web dynamiques. On peut par exem- ple lui faire créer le contenu de pages HTML suivant différents paramètres : l’âge d’un visiteur, sa catégorie socioprofessionnelle, des mots-clés qu’il aura indiqués dans un moteur de recherche, des actualités du jour, etc. Les capacités de PHP ne s’arrêtent pas à la création de pages web. Il est aussi possible de manipuler des images, de créer des fichiers PDF, de se connecter à des bases de données ou des serveurs LDAP, et même d’instancier des objets Java. Un module annexe lui permet également de fournir des interfaces graphiques classiques (client lourd, sans navi- gateur ou serveur web), via GTK. Les fonctionnalités de PHP permettant de sortir de l’ordinaire des sites web sont très nombreuses. Dans ce chapitre, nous allons vous montrer que PHP est non seulement un langage mais aussi une plate-forme globale. Nous vous présenterons ses possibilités, ses caractéristiques et son historique. Enfin, nous aborderons PHP du côté français, c’est-à- dire en mettant en avant les ressources et chiffres mis à disposition par la communauté francophone. Introduction à PHP Un langage Open Source PHP est à l’origine un langage de script conçu spécifiquement pour agir sur les serveurs web. En ajoutant quelques lignes de PHP à une page HTML, le serveur exécute les instructions correspondantes pour écrire du code HTML à la place. Le résultat (le code HTML initial ajouté à celui produit par PHP) est envoyé au navigateur. Cela permet par
  31. 31. PHP 5 avancé 2 exemple d’afficher la date du jour à un endroit bien précis du visuel. On parle alors de page dynamique. Dans l’exemple suivant, PHP ajoute une chaîne de caractères au milieu du code HTML : <html> <head> <title>Exemple</title> </head> <body> <p> <?php echo "Ceci est une syntaxe PHP"; ?> </p> </body> </html> PHP dispose de près de 3 000 fonctions utilisables dans des applications très variées et couvre pratiquement tous les domaines en rapport avec les applications web. Par exem- ple, presque tous les SGBD du marché (Systèmes de gestion de bases de données) peuvent s’interfacer avec PHP, qu’ils soient commerciaux ou qu’ils viennent du monde du logiciel libre. PHP 5 et ses nouveautés propulsent PHP dans le monde des plates-formes d’entreprises comme .Net ou J2EE. Licence et téléchargement PHP est distribué via une licence propre qui permet sa rediffusion, son utilisation et sa modification librement et gratuitement. Il peut être téléchargé depuis le site web officiel sur http://www.php.net/ ou un de ses miroirs tel que http://fr.php.net/. Exécution L’exécution de PHP est similaire à celle de Java ou des langages .NET, c’est-à-dire que les scripts sont convertis en un langage intermédiaire (byte code) avant d’être exécutés. Toutefois, à la différence de ces langages, le code intermédiaire de PHP est recréé à chaque exécution et ne peut pas être diffusé. Du point de vue utilisateur, on exploite directement le code source : il n’y a pas d’étape de compilation. Courbe d’apprentissage Reprenant une syntaxe claire et familière puisque très proche de celle du langage C, PHP est un langage dont la prise en main est généralement très rapide. Il est facile d’en apprendre les bases mais il est difficile de le maîtriser pleinement. Effectivement, connaî- tre et utiliser toutes les fonctionnalités et concepts de PHP nécessite un apprentissage poussé.
  32. 32. Qu’est-ce que PHP ? CHAPITRE 1 3 Que faire avec PHP ? La principale utilisation que l’on peut avoir de PHP est l’utilisation d’un langage de script traité côté serveur pour la création de pages web. Cette utilisation sur serveur web est la principale mais PHP peut également être utilisé pour deux autres types de dévelop- pement. Fonctionnement couplé à un serveur web Le fonctionnement sur un serveur web est l’application la plus répandue. Trois compo- sants entrent en jeu : un serveur web (le plus souvent Apache ou IIS), le module PHP et un navigateur web. Lorsque le serveur web reçoit une demande de page, PHP en élabore le contenu avant de l’envoyer au navigateur. Ce mode de fonctionnement permet de créer des sites Internet dynamiques ou de s’interfacer avec des progiciels pour gérer la logique métier de l’entreprise. Applications en ligne de commande Vous pouvez utiliser PHP de façon autonome, sans serveur web, en ligne de commande. Pour cela, il vous suffit de faire appel à l’exécutable php. Cela peut parfois être utile pour réaliser des actions simples sur votre ordinateur (par exemple, changer automatiquement le nom de plusieurs centaines de fichiers) sans nécessiter la présence de tout un contexte web. Pour automatiser des actions, vous pouvez coupler son utilisation au gestionnaire des tâches (serveur cron sous Linux). Le fonctionnement est le même : vous appelez un fichier contenant le script via PHP : php -q rename.php. Services web PHP permet de créer et d’utiliser des services web. Ce type d’application permet de mettre votre contenu à disposition d’autres personnes. Ainsi, tels Amazon, Google ou Yahoo!, vous pourrez créer vos propres applications que d’autres utiliseront. On parle alors d’applications en « marque blanche ». Amazon, par exemple, vous permet de reprendre son catalogue, de le mettre à vos couleurs et de vendre ses produits comme s’il s’agissait des vôtres. PHP vous permet autant de gérer et de produire des services web que d’en utiliser. Applications graphiques PHP dispose d’une extension permettant de produire des applications graphiques tradi- tionnelles. Il n’y a alors ni serveur web ni navigateur, et l’application s’exécute entière- ment sur le poste client. L’extension nécessaire n’est pas incluse par défaut, mais vous pouvez la récupérer sur un site dédié : http://gtk.php.net/. L’ajout récent de la prise en charge des bases de données SQLite va donner une toute nouvelle ampleur à ce type de dévelop- pement. PHP peut alors piloter toute l’application de façon autonome, des fenêtres à la gestion des données sans nécessiter de serveurs ou logiciels annexes. Vous pourrez retrouver au chapitre 18 toutes les informations pour vous connecter à SQLite via PDO.
  33. 33. PHP 5 avancé 4 Particularités de PHP Les principaux « concurrents » de PHP sont Perl, .NET et ses différents langages, JSP (Java Server Pages), voire ColdFusion. Globalement, il faut garder en tête qu’à chaque problème correspond sa solution et qu’il est difficile de dire que tel langage ou tel autre est meilleur de façon générale. Cependant, PHP 5 dispose par rapport à ses concurrents de quelques particularités et avantages signi- ficatifs. De nombreux connecteurs techniques PHP intègre des possibilités de connexion à la majorité des bases de données (Oracle, SQL Serveur, MySQL, dBase, ODBC, etc.), annuaires (LDAP, etc.) et systèmes de paiement en ligne (VeriSign, Cybercash, Crédit Mutuel, etc.). C’est particulièrement intéressant quand on sait que près de 40 % de la charge de déve- loppement d’une application est liée à l’intégration d’applications ou de sources de données existantes (selon IDC, cabinet de conseil et d’études sur les marchés des nouvelles technologies de l’information). L’essentiel des protocoles et des formats qu’on peut rencontrer sur Internet ou intranet sont aussi pris en charge : TCP, HTTP, SMTP, LDAP, IMAP, POP, SSL, Soap, XSLT, XML, PDF, etc. Peu de connecteurs applicatifs Bien que pouvant s’interfacer avec SAP, Lotus Notes, IBM iseries et d’autres progiciels, PHP ne dispose pas d’un grand nombre de connecteurs applicatifs. On peut regretter par exemple l’absence de connecteurs vers les principaux MOM du marché (Message Orien- ted Middleware) tels que Tibco, MQseries ou Microsoft MSMQ. On trouve toutefois un connecteur pour SAP qui permet d’exécuter les différentes fonctions du progiciel. La possibilité pour PHP de se connecter directement au backend (interfaces internes des logiciels) et aux bases de données permet de compenser en partie ce manque. Les performances de PHP PHP est extrêmement performant et fiable, même selon les critères d’application criti- ques. Avec un seul serveur standard, on peut répondre à des millions de requêtes par jour. Pour des sites à très fort trafic, il existe diverses solutions permettant d’optimiser et d’améliorer les performances globales de PHP. Des sites ou des applications importantes utilisent PHP (Le Monde, Le Figaro, TV5, Yahoo, TF1, Canal +…). Il s’agit maintenant d’une solution reconnue comme viable autant du côté stabilité et fiabilité que du côté des performances. Des chiffres détaillés sur l’utilisation de PHP seront donnés plus loin dans ce chapitre.

×