Vous êtes sur la page 1sur 219

Programmation oriente objet et

usage avanc de PHP5 & MySQL5


Zend Technologies
France Tlcom / Orange

Copyright 2006, Zend Technologies Inc.

Introduction PHP Avanc

Copyright 2006, Zend Technologies Inc.

Introduction PHP Avanc

Introduction

Objectifs de la formation

La matrise de la programmation PHP 5


L'ensemble des nouveauts
Les bases de la POO
La matrise optimale du SGBD MySQL

Comment profiter de la formation

Participer
Faire les exercices, mmes triviaux
Innover ! Les TPs vous permettent de comprendre les
concepts, faites-les votre manire

#3

Plan de formation

Plan de formation (1/2)


Rappels de MySQL
La PHPDOC
Indexation et MySQL
Introduction la POO
Le connecteur PDO
POO Avance
Gestion des exceptions
Gestion des transactions SQL
Flux XML
Optimisation des bases de donnes
#4

Plan de formation

Plan de formation (2/2)


Services Web
Introduction la SPL

#5

Rappel MySQL

Copyright 2006, Zend Technologies Inc.

Rappel MySQL

Structure de la base de donnes

#7

Rappel MySQL

Structure de la base de donnes


Un champ est une donne, dfinie par un type,

une longueur et des contraintes.


Un enregistrement est une ensemble de champs.
Une table contient des enregistrements et des
champs.
Un schma (nom ANSI d'une base de donnes)
est un ensemble de tables.
Le serveur peut contenir plusieurs schmas.

#8

Rappel MySQL

L'extension mysqli
Permet de profiter des fonctionnalits de MySQL
4.1 et +
A partir de PHP 4.1.3
PHP doit tre compil avec le support de
l'extension mysqli (linux)
L'extension mysqli doit tre active dans php.ini
(windows)

#9

Rappel MySQL

Se connecter
La fonction mysqli_connect(), possde 4
arguments principaux :

l'adresse du serveur
le nom d'utilisateur
le mot de passe pour l'authentification
la base de donnes utiliser

# 10

Rappel MySQL

Se connecter
Connexion au serveur MySQL
<?php
$link=mysqli_connect('sql.zend.fr','monlogin','secret',
'mabase');

# 11

Rappel MySQL

Crer un fichier de configuration


L'accs aux bases de donnes se fait en plusieurs
points de l'application
Factorisez les informations de connexion dans un
fichier de configuration

# 12

Rappel MySQL

Crer un fichier de configuration


Fichier de configuration
<?php
$mysql_host='sql.zend.fr';
$mysql_login='login';
$mysql_pass='secret';
$mysql_db='mabase';
$link=mysqli_connect($mysql_host,$mysql_login,$mysql_pass,
$mysql_db);

# 13

Rappel MySQL

Envoyer une requte au serveur


La fonction mysqli_query() permet d'envoyer une
requte au serveur MySQL
Elle prend 2 paramtres :

un identifiant de connexion vers le serveur


une requte SQL

# 14

Rappel MySQL

Envoyer une requte au serveur


Envoi d'une requte
<?php
include_once'configuration.php';
$sql="SELECTnom,prenomFROMclientWHEREville='Paris'";
$resultat=mysqli_query($link,$sql);

# 15

Rappel MySQL

Rcuprer le rsultat
3 fonctions pour rcuprer le rsultat d'une
requte :

mysqli_fetch_assoc() : Rcupre le rsultat sous forme


de tableau associatif
mysqli_fetch_row() : Rcupre le rsultat sous forme de
tableau index
mysqli_fetch_object() : Rcupre le rsultat sous forme
d'objet

# 16

Rappel MySQL

Rcuprer le rsultat
Exploiter le rsultat d'une requte SELECT
<?php
include_once'configuration.php';
$sql="SELECTnom,prenomFROMclientWHEREville='Paris'";
$resultat=mysqli_query($link,$sql);
$enregistrement=mysqli_fetch_assoc($resultat);
while($enregistrement){
//Affichelechampprenom
echo$enregistrement['prenom'],'';
//Affichelechampnom
echo$enregistrement['nom'],'<br>';
}

# 17

Rappel MySQL

Fermer une connexion


La fonction mysqli_close() permet de fermer la

connexion
Elle prend en argument l'identifiant de connexion

# 18

Rappel MySQL

Fermer une connexion


mysqli_close() : ferme la connexion
<?php
include_once('configuration.php');
$sql="SELECTnom,prenomFROMclientWHEREville='Paris'";
$resultat=mysqli_query($link,$sql);
$enregistrement=mysqli_fetch_assoc($resultat);
while($enregistrement){
//Affichelechampprenom
echo$enregistrement['prenom'],'';
//Affichelechampnom
echo$enregistrement['nom'],'<br>';
}
//fermelaconnexion
mysqli_close($link)

# 19

Rappel MySQL

Rappels MySQL (1/3)


A l'aide de phpMyAdmin, crez une base 'magasin'
Dans cette base, crez une table 'produits' avec 5
champs :

'id' de type 'INT', cl primaire, auto-incrment


'nom' de type VARCHAR(250)
'description' de type TEXT
'prix' de type DECIMAL
'image' de type BLOB

Vous pouvez aussi utiliser d'autres outils (Mysql Query Browser, SQL
Front, ...).
# 20

Rappel MySQL

Rappels MySQL (2/3)


Crez un fichier 01_configuration.php

Dfinissez les variables $mysql_host = 'localhost', $mysql_db =


'magasin', $mysql_login = 'root', $mysql_pass = ''.
Il s'agit des paramtres de connexion la base de donnes
MySQL
Mettez des commentaires sur ces variables

C'est ce fichier de configuration que nous allons utiliser pour nous


connecter la base de donnes.
# 21

Rappel MySQL

Rappels MySQL (3/3)


Crez un fichier 02_rappels.php
Dans ce fichier

Connectez-vous la base avec mysqli


Excutez une requte qui rapatrie les produits dans l'ordre
croissant des prix
Affichez ces produits avec une boucle while
Fermez la connexion la base de donnes

Ces rappels sont galement valables avec l'extension mysql (PHP4)


en mode procdural.
# 22

La PHPDOC

Copyright 2006, Zend Technologies Inc.

La PHPDOC

Introduction
La phpdoc est un standard d'criture pour la

documentation d'un code source en PHP.


On reconnait la phpdoc sa structure.
La phpdoc permet de documenter en particulier :

Les fichiers php


Le classes
Les fonctions et les mthodes de classe
Les constantes et les proprits de classe

# 24

La PHPDOC

Importance de la documentation
La documentation permet de rendre
comprhensible un code source.
La phpdoc est un standard !

Qui permet de travailler plusieurs.


Qui permet d'changer le code source.
Qui rend possible une gnration universelle de
documentation en ligne ou papier.

# 25

La PHPDOC

Structure de la PHPDOC
La PHPDOC est reconnaissable sa structure
/**
*JesuisuncommentairePHPDOC!
*/

# 26

La PHPDOC

Les balises de la PHPDOC


La PHPDOC possde des balises d'identification
/**
*Jesuisletitredemoncommentaire.
*
*Jesuislecontenudemoncommentaire.
*
*@authorStevenVanPoeck<steven@zend.com>
*@copyrightZend2006
*@packagetaskmanager
*@version0.1
*/

# 27

La PHPDOC

Les tags utiles (1)


@access

Dsigne la visibilit d'une proprit ou d'une mthode


(public, protected, private static).

@author

Auteur de l'lment (page, classe, mthode, fonction,


proprit)

@copyright

Copyright du code source ou de la classe.

# 28

La PHPDOC

Les tags utiles (2)


@deprecated

La prsence de ce tag informe le dveloppeur que


cette fonctionnalit est dprcie et sera retire
terme.

@example

Lien vers un exemple. Il est aussi possible de mettre en


place des exemples "inline".

@ignore

Demande au parseur phpdoc d'ignorer un lment


(pour un doublon par exemple)

# 29

La PHPDOC

Les tags utiles (3)


@internal

Introduit une documentation "prive" qui peut tre ou


ne pas tre gnre la demande.

@link

Introduit un lien en rapport avec l'lment (exemple ou


documentation supplmentaire). Cette balise
n'accepte qu'un lien http.

@see

Fait rfrence une ressource (classe, fonction, etc. ou


lien).

# 30

La PHPDOC

Les tags utiles (4)


@since

Informe depuis quelle version de l'application une


fonction existe.

@tutorial

Lien vers la documentation tendue de l'lment. Pour


d'autres liens, utiliser plutt @link ou @see.

@version

Version de l'lment.

# 31

La PHPDOC

Compltion dans l'diteur


Les tags @var et @return permettent d'expliciter le
type de donne qui sera contenu dans une
proprit ou renvoy par une fonction ou une
mthode.
Dans l'exemple du slide suivant, l'diteur sait que
la proprit $statement contient une valeur de
type PDOStatement.

# 32

La PHPDOC

Compltion dans Zend Studio

# 33

La PHPDOC

Documentation d'un fichier


Dans le dernier fichier PHP que vous avez cr

Ajoutez un commentaire PHPDOC en haut du fichier


Ajoutez un titre et une description
Reprez les tags utiles la description du fichier et ajoutez-les

A l'aide de l'assistant PHPDocumentor de Zend Studio,


gnrez une documentation sur ce fichier

IMPORTANT : Documentez votre code au fur et mesure. A la fin de


la formation, nous gnrerons la documentation de l'ensemble de
vos exercices.
# 34

Gestion des Index

Copyright 2006, Zend Technologies Inc.

Gestion des Index

Les index

Les index acclrent les lectures (SELECT)


Mais peuvent ralentir les critures (INSERT, UPDATE,
DELETE)
3 syntaxes pour la cration

CREATE TABLE...
CREATE [UNIQUE|FULLTEXT] INDEX nom_index ON
nom_table (colonne__indexer,...)
ALTER TABLE nom_table ADD {INDEX|KEY|UNIQUE|
PRIMARY KEY} [nom_index] (colonne__indexer,...)

# 36

Gestion des Index

Les index

Crer un index
/*Ajoutd'unindexuniquesurlechampine*/
CREATEuniqueINDEXidx_ineONetudiant(ine);
/*Ajoutd'unindexfulltextsurlechampcv*/
CREATEfulltextINDEXidx_ft_cvONetudiant(cv);
/*Ajoutd'uneclprimairesurlechampid_etudiant*/
ALTERTABLEetudiantADDprimarykey(id_etudiant);
/*Ajoutd'unindexsurlecoupledechampsnom,prenom*/
ALTERTABLEidx_nom_prenomADDkey(nom,prenom);

# 37

Gestion des Index

Les types d'index


PRIMARY KEY

identifiant unique d'un enregistrement


Interdit les doublons
NOT NULL: interdit la valeur NULL
Un seul par table, mais peut regrouper plusieurs
champs

UNIQUE

Interdit les doublons


Peut prendre des valeurs NULL
Possibilit d'en avoir plusieurs

# 38

Gestion des Index

Les types d'index


KEY / INDEX

Permet d'indexer des champs avec des valeurs


identiques

FULLTEXT

Optimise la recherche de mots dans du texte


Pour les champs de type CHAR, VARCHAR ou TEXT

# 39

Gestion des Index

Les types d'index


Crer une table avec des index
CREATETABLEetudiant(
id_etudiantintunsignedNOTNULLauto_increment,
inechar(11),
nomchar(30),
prenomchar(30),
cvtext,
PRIMARYKEY(id_etudiant),
UNIQUE(ine),
KEY(nom,prenom),
FULLTEXT(cv)
)engine=MyISAM;

# 40

Gestion des Index

Les types d'index (1/2)


Recherche FULLTEXT
/*Recherchedestudiantsayantlemotclphpdansleurcv*/
SELECTineFROMetudiant
WHEREMATCH(cv)AGAINST('php');
/*Recherchedestudiantsayantlesmotsclphpetcertification
dansleurcv*/
SELECTineFROMetudiant
WHEREMATCH(cv)AGAINST('phpcertification');

# 41

Gestion des Index

Les types d'index (2/2)


Recherche FULLTEXT
/*RechercheFULLTEXTboolenne(avecoprateurs)*/
/*Recherchedestudiantsayantlesmotsclphpetmysql
maispasaspdansleurcv*/
SELECTineFROMetudiant
WHEREMATCH(cv)AGAINST('+php+mysqlasp'INBOOLEANMODE);
/*Recherched'uneexpression*/
SELECTineFROMetudiant
WHEREMATCH(cv)AGAINST('"J'aimelePHP"'INBOOLEANMODE);

# 42

Gestion des Index

Table avec indexes (1/2)


Si ce n'est pas dj fait, l'aide de phpMyAdmin

crez une base 'magasin'


Dans cette base, crez une table 'produits' avec 5
champs :

'id' de type 'INT', cl primaire, auto-incrment


'nom' de type VARCHAR(250)
'description' de type TEXT
'prix' de type DECIMAL
'image' de type BLOB

Vous pouvez aussi utiliser d'autres outils (Mysql Query Browser, SQL
Front, ...).
# 43

Gestion des Index

Table avec indexes (2/2)


Mettez des indexes sur les champs suivants

nom
prix

Faites en sorte que les champs suivants soient uniques

nom

Cette tape est gnralement importante pour l'efficacit future


de vos applications.
# 44

Les bases de la POO

Copyright 2006, Zend Technologies Inc.

Les bases de la POO

Introduction

Une classe / un objet


Constructeur / destructeur
Visibilit
Diffrences entre PHP 4 et PHP 5
Classes abstraites et interfaces
Hritage / surcharge
Srialisation
Clonage

# 46

Les bases de la POO

Qu'est-ce qu'une classe ?


Une classe peut tre vue comme une abstraction.
Elle contient des proprits et des mthodes :

Proprit = variable de classe


Mthode = fonction de classe

L'environnement de la classe est protg :

Les proprits et les mthodes peuvent tre dclares


comme non accessibles en dehors de la classe.
Les proprits ne se mlangent pas aux variables
globales.

# 47

Les bases de la POO

Exemple de classe

# 48

Les bases de la POO

Qu'est-ce qu'un objet ?


Un objet est une instance de classe.
Avec une classe, on peut crer autant d'objets

qu'on veut (sauf si dans l'implmentation on


dcide de contrler l'instanciation).
Une classe est une dclaration, alors qu'un objet
est contenu dans une variable, cr partir de
notre classe avec le mot cl new.
Un objet est une instance de ma classe.

# 49

Les bases de la POO

Exemple de cration d'objets

# 50

Les bases de la POO

Une classe et ses objets

# 51

Les bases de la POO

Composition d'une classe


La dclaration

Le 'moule' de la classe

Les proprits

Les 'variables' de la classe

Les mthodes

Les 'fonctions' de la classe

La classe mre, les interfaces

Elles font voluer les possibilits et les fonctionnalits de


la classe

# 52

Les bases de la POO

Exemple de classe (1/2)


Un exemple simple de classe
<?php
//Dclarationdelaclasse
classUser
{

//Uneproprit(variabledeclasse)
var$name;

//Unemthode(fonctiondeclasse)
functiongetName()
{
returnucfirst($this>name);
}

# 53

Les bases de la POO

Exemple de classe (2/2)


Un exemple simple de classe
//Crationd'unobjetpartirdelaclasse
$pierre=newUser();
//Modificationd'uneproprit
$pierre>name='pierre';
//Accsunemthode
echo$pierre>getName();
//Affiche'Pierre'

# 54

Les bases de la POO

Cration d'une classe


Crez un fichier 03_Rectangle_creation.php
Dans ce fichier, crez une classe 'Rectangle' (avec un
R majuscule) avec les proprits suivantes

$longueur
$largeur

Crez deux objets 'Rectangle' partir de cette classe

Remplissez leurs proprits ($longueur et $largeur)


Affichez-les avec la fonction print_r()

Cette classe est destine contenir des donnes formates qui


sont plus faciles manipuler sous forme d'objets que sous forme de
tableaux.
# 55

Les bases de la POO

Le constructeur
Comment marche un constructeur ?

Le constructeur est une mthode dite "magique" : elle est


appele automatiquement.
Le constructeur est appel lors de l'instanciation d'une classe,
c'est dire la cration d'un objet partir d'une classe.

A quoi a sert ?

On appelle souvent le constructeur pour charger des


proprits (par exemple une connexion la base de
donnes).

En PHP4, le constructeur est la mthode qui porte le nom de la


classe. Cette variante est encore valable en PHP5 bien que
dprcie.
# 56

Les bases de la POO

Le destructeur
Comment marche un destructeur ?

De la mme manire que le constructeur, le destructeur est


appel la fin de la vie d'un objet.
Le destructeur sert gnralement faire des nettoyages.

A quoi cela peut-il servir ?

Fermeture de la connexion la base de donnes.


Nettoyage du contexte d'un objet (suppression de fichiers
temporaires, vidage cache, etc.)

La fin de vie d'un objet peut subvenir la fin du script, lorsque l'on
supprime la variable qui contient l'objet (unset) ou lorsque l'on
remplace son contenu (affectation).
# 57

Les bases de la POO

Constructeur (1/2)
Crez un fichier 04_Rectangle_constructeur.php
Dans ce fichier, crez une classe 'Rectangle' (R

majuscule) avec les proprits $longueur et $largeur


Crez un constructeur qui prend en paramtre deux
variables $long et $larg

Vrifiez que les valeurs des paramtres sont bien numriques


(is_numeric())
Si c'est le cas, transfrez ces valeurs sur les proprits
$longueur et $largeur

Ici, l'utilisation d'un constructeur simplifie le remplissage des


proprits du rectangle.
# 58

Les bases de la POO

Constructeur (2/2)
Crez deux objets de type 'Rectangle' partir de
cette classe

Remplissez leurs proprits ($longueur et $largeur) au moment


de les crer
Affichez-les avec la fonction print_r()

La cration d'un objet et le remplissage des proprits sont


effectus par la mme instruction PHP.
# 59

Les bases de la POO

Exemple (construct, destruct)


Un constructeur et un destructeur
classDB
{
var$dbConnexion=null;
varfunction__construct()
{
//Connexionlabasededonnes
}
function__destruct()
{
//Dconnexionlabasededonnes
}
}

# 60

Les bases de la POO

La visibilit

Application

La visibilit s'applique une proprit ou une mthode

Priv (private)

N'est accessible que dans la classe courante.

Protg (protected)

Est accessible dans la classe courante et dans les


classes drives.

Publique (public)

Est accessible partout, mme l'extrieur de la classe.

# 61

Les bases de la POO

Visibilit (1/2)
Crez un fichier 05_Rectangle_visibilite.php
Dans ce fichier, crez une classe 'Rectangle' (avec un

R majuscule) avec les proprits prives $longueur et


$largeur
Puis crez :

Deux mthodes publiques getLongueur() et getLargeur() qui


retournent $this->longueur et $this->largeur
Deux mthodes publiques setLongueur() et setLargeur() qui
remplissent la longueur et la largeur
Les mthodes qui commencent par 'get' et 'set' sont appeles
'accesseurs' parce qu'elles permettent l'accs (filtr et scuris) aux
proprits d'un objet.
# 62

Les bases de la POO

Visibilit (2/2)
Crez un constructeur qui prend deux paramtres

optionnels $long et $larg qui font appel


setLongueur() et setLargeur()
Crez deux objets 'Rectangle' partir de cette classe

Remplissez leurs proprits avec les accesseurs 'set'


Affichez leurs proprits avec les accesseurs 'get'

La cration d'un objet et le remplissage des proprits sont


effectus par la mme instruction PHP.
# 63

Les bases de la POO

Diffrences entre PHP4 et PHP5


En PHP 5, les passages d'objets se font par dfaut
par rfrence. (cf clone)
En PHP 5, intervient la notion de visibilit.
L'objet PHP 4 est limit, PHP 5 permet de faire de
la POO digne de ce nom.

# 64

Les bases de la POO

L'hritage

L'hritage permet de hirarchiser les classes.


Les classes mres sont gnriques, elles mettent

en place des fonctionnalits communes une ou


plusieurs classes.
Les classes filles sont spcifiques, elles hritent des
fonctionnalits des classes mres.

# 65

Les bases de la POO

L'hritage (UML)

# 66

Les bases de la POO

Hritage (1/2)
Exemple d'hritage
<?php
classUser//UneclasseUtilisateur
{
private$name;

publicfunctionsetName($name)
{
$this>name=$name;
}

publicfunctiongetName()
{
returnucfirst($this>name);
}
}

# 67

Les bases de la POO

Hritage (2/2)
Exemple d'hritage
//Uneclasse'Administrator'quihritede'User'
classAdministratorextendsUser
{
private$level='administrator';
}
//AdministratorhritedeUserdonconpeut
//s'enservircommed'unUser
$admin=newAdministrator();
$admin>setName('jean');
echo$admin>getName();

# 68

Les bases de la POO

Hritage (1/3)
Crez un fichier 06_heritage_Rectangle.php
Dans ce fichier :

Crez une classe 'Rectangle' avec des proprits prives


'longueur' et 'largeur' et leurs accesseurs (set, get)
Des mthodes 'getPerimetre' et 'getAire' de la classe
'Rectangle' qui renvoient respectivement le primtre et l'aire
du rectangle.
Crez un constructeur __construct($long, $larg) destin
simplifier la cration de l'objet 'Rectangle'

Note : dans la plupart des conventions votre disposition, un fichier


ne contient qu'une classe et le nom du fichier porte le nom de la
classe.
# 69

Les bases de la POO

Hritage (2/3)
Crez un fichier 06_heritage_test.php

Dans ce fichier, incluez le prcdent


Crez un objet $rectangle et affichez son primtre et son
aire

Evitez de crer les objets dans le mme fichier que la classe. Cela
surcharge le fichier et impose l'instanciation d'un objet qui n'est pas
forcment utile.
# 70

Les bases de la POO

Hritage (3/3)
Crez un fichier 06_heritage_Carre.php
Dans ce fichier :

Crez une classe 'Carre' qui hrite de la classe 'Rectangle'


Surchargez le constructeur : dclarez un constructeur
__construct($cote) qui fait appel celui de rectangle grce
au mot cl parent::__construct($long, $larg)

Dans le fichier de test utilis pour 'Rectangle'

Crez un objet $carre et affichez son primtre et son aire. Ce


mcanisme doit fonctionner car 'Carre' hrite de 'Rectangle'

Rappel : dans la plupart des cas, la classe mre est gnrique et la


classe fille est spcifique.
# 71

Les bases de la POO

La srialisation
Principe

Les objets en tant que tel ne peuvent tre transmis d'un


programme l'autre via un rseau, car ils contiennent
des caractres non imprimables
Srialisation = transformation d'une donne complexe
(objet, tableau) en une chane de caractre
imprimable
Dsrialisation = transformation d'une chane srialise
en sa donne d'origine

Utilit

Transmission de donnes complexes


Stockage de ces donnes en base ou dans des fichiers
# 72

Les bases de la POO

Srialisation

Exemple de srialisation, dsrialisation


<?php
classUser
{
public$name;
}
$user=newUser();
$user>name="Seth";
$serializedUser=serialize($user);
echo$serializedUser."\n\n";
$user2=unserialize($serializedUser);
print_r($user2);

# 73

Les bases de la POO

Srialisation (affichage)
Rsultat du script prcdent
O:4:"User":1:{s:4:"name";s:4:"Seth";}
UserObject
(
[name]=>Seth
)

# 74

PDO

Copyright 2006, Zend Technologies Inc.

PDO

Introduction
PDO est une interface d'accs aux bases de

donnes.
PDO n'est pas un systme d'abstraction complet

Il ne manipule pas les requtes.


Il met disposition des classes et des fonctions
communes un ensemble de SGBD.
Si certains SGBD ne disposent pas de certaines
fonctionnalits (gestion des transactions, requtes
paramtres, etc.), il les simule.

# 76

PDO

Architecture / principe
PDO fonctionne avec un ensemble d'extensions

Une extension PDO de base qui dfinit l'interface


commune.
Une extension Driver PDO relative chaque SGBD que
l'on veut grer.

# 77

PDO

Architecture / principe

# 78

PDO

Les classes de l'extension


La classe PDO gre l'accs aux SGBD ainsi que les
fonctionnalits de base :

Connexions
Lancement des requtes

La classe PDOStatement gre une liste de

rsultats.
La classe PDOException est une classe
d'exception personnalise interne pour PDO.

# 79

PDO

Connexion simple PDO


Dclaration du DSN, connexion et requte
<?php
//DSNpourseconnecterMySQL
$dsn='mysql:host=localhost;dbname=mybase';
//Crationd'unobjetpourmanipulerdesrequtes
$dbh=newPDO($dsn,'login','pass');
//Executiond'unerequteSELECT
$result=$dbh>query('SELECT*fromFOO');
//Itrationsurlesrsultatsd'unerequte
foreach($resultas$row){
print_r($row);
}

# 80

PDO

Bases de PDO
Crez un fichier 07_pdo_connexion.php
Dans ce fichier

Crez une variable $dsn qui contient le dsn permettant de se


connecter la table 'produits' de la base 'magasin'
Connectez-vous en crant un objet $pdo
A l'aide de l'exemple prcdent, faites une requte SELECT sur
la table et affichez les donnes dans un tableau HTML

Pour changer de base de donnes ou de SGBD, il suffit de changer


le DSN.
# 81

PDO

Requtes prpares
Les requtes prpares sont un modle de

requte enregistr sur le serveur le temps de


l'excution du script (par opposition aux
procdures stockes qui sont stockes de
manire permanente).
Avec les requtes paramtres il n'est plus
ncessaire de se protger des attaques par
injection SQL car le serveur sait ce qu'il attend.

# 82

PDO

Requtes prpares
Exemple de requte prpare avec PDO
//Ondclarelarequteaveclamthodeprepare
$stmt=$dbh>prepare('insertintotttvalues(:name)');
//Puisonlielesparamtresdesvariables
$stmt>bindParam(':name',$func);
//Enfin,onappellelamthodeexecute
$funcs=get_extension_funcs('xml');
foreach($funcsas$func){
$stmt>execute();
}

# 83

PDO

Gestion des transactions


Gestion d'une transaction avec PDO
try{
$dbh=newPDO('mysql:host=localhost;dbname=mybase','root','',
array(PDO::ATTR_PERSISTENT=>true));
$dbh>setAttribute(PDO::ATTR_ERRMODE,PDO::ERRMODE_EXCEPTION);
$dbh>beginTransaction();
$dbh>exec("insertintostaff(id,first,last)values(23,
'Joe','Bloggs')");
$dbh>exec("insertintosalarychange(id,amount,changedate)
values(23,50000,NOW())");
$dbh>commit();
}catch(Exception$e){
$dbh>rollBack();
echo"chec:".$e>getMessage();
}

# 84

PDO

Cration classe d'accs (1/2)


Crez un fichier 08_Db.php
Crez une classe Db destine grer les accs la

base de donnes. Cette classe comporte une


mthode "execute" qui prend en paramtre une
requte et des paramtres, et retourne un rsultat sous
forme de tableau.
Si le paramtre est une requte, excutez la requte
et renvoyez le rsultat. S'il y a un ou plusieurs
paramtres, effectuez une requte prpare.
Vous pouvez dfinir plusieurs politiques de gestion d'erreurs avec
PDO : pas d'erreurs, exceptions ou erreurs PHP.
# 85

PDO

Cration classe d'accs (2/2)


Si le paramtre est un tableau, excutez les requtes

contenues dans ce tableau et renvoyez un tableau


plusieurs dimentions contenant les rsultats.
Si termin : crez une mthode 'getResult' qui renvoit
l'objet rsultat (PDOStatement) donn par la mthode
'query' de PDO

Pour augmenter les performances, vitez d'itrer plusieurs fois sur


des collections (tableau intermdiaire par exemple).
# 86

POO Avance

Copyright 2006, Zend Technologies Inc.

POO Avance

POO avance
Les types d'objets en UML

Entit, contrle, dialogue

Les interfaces
Les classes abstraites
Les mthodes et constantes magiques
Les motifs de conception (design patterns)

Singleton, fabrique, faade, observateur, MVC

# 88

POO Avance

Types d'objets
En UML, on peut diffrencier trois manires
diffrentes d'utiliser un objet :

Entit : contient des donnes


Contrle : renferme des fonctionnalits
Dialogue : propose une API simple utiliser

# 89

POO Avance

Une entite

# 90

POO Avance

Un contrle

# 91

POO Avance

Un dialogue

# 92

POO Avance

Les interfaces : en thorie


Un hritage permet de regrouper des objets de
manire verticale

Une classe mre regroupe plusieurs classes filles


Chaque classe fille hrite de fonctionnalits de la
classe mre

Une interface permet de regrouper des objets de


manire transversale

Un groupe d'objets peut implmenter une interface


Une interface impose la prsence de fonctionnalits
dans ces objets
Si une classe mre implmente une interface, ses
classes filles l'implmentent aussi par hritage
# 93

POO Avance

Les interfaces : en pratique


Une interface se dclare comme une classe,

avec le mot cl 'interface'


Une interface ne contient que des dclarations
de mthodes, sans contenu

Ces mthodes ainsi dclares doivent oblitagoirement


tre redclares dans les classes qui implmentent
l'interface

# 94

POO Avance

Exemple d'interface (1/3)


Dfinit un objet de type 'gomtrique'
<?php
//Uneinteface'Surface_Interface'quiimpose'getAire()'
interfaceSurface_Interface
{
publicfunctiongetAire();
}
classRectangleimplementsSurface_Interface
{
//...
publicfunctiongetAire()
{
//...
}
}

# 95

POO Avance

Exemple d'interface (2/3)


Dfinit un objet de type 'gomtrique'
//ImplmenteGeometric_Interfaceparhritage
//avecRectangle
classCarreextendsRectangle
{
//...
}
//Uneinterface'Volume'quiimpose'getVolume()'
interfaceVolume_Interface
{
publicfunctiongetVolume();
}

# 96

POO Avance

Exemple d'interface (3/3)


Dfinit un objet de type 'gomtrique'
//RectangleimplmenteGeometric_Interface
classCubeimplementsSurface_Interface,Volume_Interface
{
//...
publicfunctiongetAire()
{
//...
}

publicfunctiongetVolume()
{
//...
}

# 97

POO Avance

Interfaces
Crez un fichier 09_interfaces.php
Reprenez les interfaces et les classes de l'exemple

prcdent
Remplissez les blancs pour que les objets renvoient les
aires et volumes voulus
A la fin du fichier, crez un objet $rectangle et un
objet $carre, affichez leur aires et le volume du cube

L'utilisation d'interfaces ne permet pas l'implmentation de


fonctionnalits en soi. Cela permet juste de forcer le respect de
certaines contraintes.
# 98

POO Avance

Les classe abstraite


Une classe abstraite ne peut tre instancie

En d'autres termes : on ne peut pas crer un objet avec


une classe abstraite

Une classe abstraite est destine tre utilise

comme classe mre d'autres classes


La dclaration d'une classe abstraite se fait avec
le mot cl 'abstract'

abstract class Parallelogramme { ... }

# 99

POO Avance

Les mthodes magiques


Sont appeles automatiquement :

Quand un objet se cre : __construct()


Quand un objet meurt : __destruct()
Quand un objet est dupliqu : __clone()
Quand on appelle une mthode inconnue : __call()
Quand on affecte une proprit inconnue : __set()
Quand on veut la valeur d'une prop. inc. : __get()
Quand on met un 'echo' devant l'objet : __toString()
Quand on srialise un objet : __sleep()
Quand on dsrialise un objet : __wakeup()

# 100

POO Avance

Les constantes magiques


Donnent des informations sur :

Le chemin du fichier PHP courant : __FILE__


Le nom de la fonction courante : __FUNCTION__
Le nom de la classe courante : __CLASS__
Le numro de ligne dans le fichier PHP : __LINE__

# 101

POO Avance

Constantes magiques
Utilisation frquente de __FILE__
<?php
//TrouverlecheminverslefichierPHPcourant
$path=dirname(__FILE__);
//Pourviterd'appellerdirnamechaquefois,
//vouspouvezcrerunefonctionouunemthode
functiongetPath()
{
static$path=null;

if($path===null){
$path=dirname(__FILE__);
}
return$path;
}

# 102

POO Avance

Les motifs de conception


Origine

A force de programmer en objet, les dveloppeurs se


retrouvaient souvent avec les mmes constructions
Ils ont dcid de mettre un nom sur ces constructions
et de les rpertorier pour mieux les tudier

Implmentation avec PHP

La POO de PHP5 permet de construire toute sorte de


motif de conception
Mais PHP est un langage interprt, gare aux
multiplications d'objets !

# 103

POO Avance

Les motifs usuels (1/2)


Le singleton

Une classe qui ne peut tre instancie qu'une seule fois

La fabrique

Un objet qui 'fabrique' d'autres objets pour vous

Le proxy

Un objet qui contrle l'accs une ressource

La faade

Un objet qui fournit une interface simple pour accder


un systme complexe

# 104

POO Avance

Les motifs usuels (2/2)


L'observateur

Un objet qui associe des vnements des actions

M.V.C. (Modle, Vue, Contrleur)

Un motif qui gre l'interaction entre une application et


un utilisateur (trs utilis pour le web)

# 105

POO Avance

Construire un singleton
Crez un fichier 10_singleton.php

Dans ce fichier, crer une classe 'User_Singleton' contenant


une proprit prive 'name' et ses deux accesseurs

Transformation en singleton

En utilisant __construct, faites en sorte que l'on ne puisse pas


instancier la classe
En utilisant __clone, faites en sorte qu'on ne puisse pas cloner
l'objet
Dclarez une mthode publique 'getInstance()' qui renvoie
l'objet unique de la classe 'User_Singleton'
Cet exercice ncessite une rflexion pralable. Une bonne
utilisation des motifs de conception ncessite un bon niveau et une
pratique courante de la POO.
# 106

POO Avance

Introduction MVC
MVC est trs utilis dans les applications web
Il est dcompos en 3 parties

Le contrleur : qui gre la navigation


Le modle : qui gre la structuration et l'accs aux
donnes
La vue : qui gre la partie 'prsentation' (visible)

# 107

POO Avance

Principe de MVC

# 108

POO Avance

MVC et formulaires
La vue

Elle gre l'aspect du formulaire : son design

Le contrleur

Il rcupre les donnes du formulaire pour les traiter

Le modle

Il fait l'interface entre la base de donnes d'une part, le


contrleur et la vue d'autre part

Attention : certaines implmentations de MVC ne permettent pas


au modle d'accder aux donnes, c'est le contrleur qui le fait. Le
vritable rle du modle est de STRUCTURER les donnes.
# 109

POO Avance

Prcisions sur MVC


La plupart des frameworks PHP utilisent MVC

Zend Framework, Symfony, ...

MVC dfinit la structure globale de l'application


La partie MVC est spcifique l'application,

contrairement aux librairies


Les modles et les contrleurs sont gnralement
des classes
Les vues sont gnralement des templates HTML
ou PDF

# 110

La gestion des exceptions

Copyright 2006, Zend Technologies Inc.

La gestion des exceptions

Principe des exceptions


Les exceptions sont un moyen lgant de grer

les erreurs d'excution.


Une exception dfinit un espace dans lequel les
erreurs sont dtectes.
La gestion des erreurs peut tre capitalis dans
des processus communs l'ensemble des erreurs
ou des catgories d'erreurs.

# 112

La gestion des exceptions

Utilit

Les exceptions permettent de mieux organiser la

gestion des erreurs et des vnements.


Les exceptions contribuent augmenter la qualit
d'un code source.

# 113

La gestion des exceptions

Illustration

En bleu : on effectue les

traitements
En rouge : lors des traitements,
une erreur BD est apparue ?
On la traite.
En vert : lors des traitements,
une erreur inconnue est
apparue ? On la traite.

# 114

La gestion des exceptions

Implmentation des exceptions


Une implmentation classique en PHP5
<?php
try{
//traitement
}catch(PDOException$e){
//traitementd'uneerreurbasededonnes
}catch(Exception$e){
//Traitementd'uneerreurinconnue
}

# 115

La gestion des exceptions

Contexte d'une exception


Donnes disponibles travers une exception
object(Exception)[2]
protected'message'=>'Impossibledelirelestches.'(length=30)
private'string'=>''(length=0)
protected'code'=>0
protected'file'=>'/var/www/html/tools/zend/TaskManager.php'
(length=40)
protected'line'=>10
private'trace'=>
array
0=>
array
'file'=>'/var/www/html/tools/zend/functions.php'
(length=38)
'line'=>8
'function'=>'getTaskList'(length=11)
'class'=>'TaskManager'(length=11)

# 116

La gestion des exceptions

Contexte d'une exception (suite)


Donnes disponibles travers une exception
'type'=>'>'(length=2)
'args'=>
array
empty
1=>
array
'file'=>'/var/www/html/tools/zend/exception.php'
(length=38)
'line'=>6
'function'=>'getMyTaskList'(length=13)
'args'=>
array

# 117

La gestion des exceptions

Exceptions base (1/2)


Crez un fichier 11_display_exception.php
Dans ce fichier

Crez une fonction "display" qui prend en paramtre une


variable et l'affiche avec echo.
Faites en sorte que si la variable n'est pas une chane de
caractres, une exception soit lance (throw) avec un
message d'erreur.

Les exceptions sont une manire lgante de grer les erreurs de


manire globale.
# 118

La gestion des exceptions

Exceptions base (2/2)


Testez l'appel de display avec un mauvais paramtre.
Testez l'appel de display avec un mauvais paramtre
avec try et catch. Dtectez l'erreur et affichez un
message personnalis dans le bloc catch.

N'hsitez pas faire beaucoup de tests sur les exceptions et


regarder les exemples en ligne.
# 119

La gestion des exceptions

Exceptions personnalises
Une exception personnalise permet d'avoir la
main sur le traitement des erreurs ou des
vnements traits par les exceptions.
La premire tape consiste crer une classe
d'exception personnalise.
Dans un deuxime temps, on peut sparer la
gestion des exceptions dans des blocs "catch"
diffrents.

# 120

La gestion des exceptions

Implmentation

# 121

La gestion des exceptions

Sparer les traitements


Sparation l'aide de classes d'exceptions
try{
//...traitement...
}catch(TaskException$t){
echo$t;
}catch(DBException$db){
$db>closeConnexion();
echo$db>getMessage();
}catch(Exception$e){//ToujoursintercepterException
echo$e>getMessage();
}

# 122

La gestion des exceptions

Exceptions avanc (1/2)


Crez un fichier 12_display_exception_pers.php avec:

une classe 'Display_Exception' qui hrite de 'Exception'


une fonction "display" qui lance une exception
'Display_Exception' en cas d'erreur.

Testez display avec un bloc try et deux blocs catch

catch (Display_Exception $e) : rcupration des exceptions


personnalises
catch (Exception $e) : rcupration des autres exceptions

La cration d'exceptions personnalises permet de grer plus


finement les erreurs, c'est dire de les trier et de traiter diffrents
types d'erreurs sparment.
# 123

La gestion des exceptions

Exceptions avanc (2/2) (+)


Testez avec display et en lanant manuellement une

exception de type "Exception".


Imbriquez un bloc "try/catch" dans un bloc "try" de
manire ce que l'exception "Display_Exception"
gnre une exception "Exception".

Pour plus d'informations sur les exceptions, rendez-vous sur la


documentation en ligne :
http://fr.php.net/manual/fr/language.exceptions.php
# 124

InnoDB : Moteur transactionnel

Copyright 2006, Zend Technologies Inc.

Moteur transactionnel

Prsentation

Edit par Innobase Oy (Oracle)


Distribu sous licence GPL
Moteur transactionnel

Dbut transaction: START TRANSACTION


Fin transaction: COMMIT ou ROLLBACK

Support des cls trangres (FOREIGN KEY)


Support de l'intgrit rfrentielle
Ne supporte pas les index fulltext

# 126

Moteur transactionnel

Cl trangre
Permet de dclarer des relations entre les

colonnes dans diffrentes tables


L'intgrit est maintenue par l'interdiction
d'actions qui pourraient violer ces relations
Les INSERT, UPDATE ou DELETE qui violent l'intgrit
ne sont pas autorises
Syntaxe:

CONSTRAINT nom_cl_trangre FOREIGN KEY


(nom_colonne_enfant, ...) REFERENCES
nom_table_parent (nom_colonne_parent, ...)

# 127

Moteur transactionnel

Intgrit rfrentielle
Lors d'un DELETE ou d'un UPDATE dans la table

parente, l'intgrit est vrifie dans la table


enfant, grce aux clauses ON UPDATE/ON DELETE
Les valeurs possibles sont:

CASCADE: Le DELETE ou l'UPDATE aura lieu galement


dans la table enfant
SET NULL: Les enregistrements lis aux lignes parentes
prendront la valeur NULL
NO ACTION/RESTRICT: Le DELETE ou l'UPDATE ne sont
pas autoriss lorsqu'il existe des enregistrements
enfants. C'est la valeur par dfaut

# 128

Moteur transactionnel

Intgrit rfrentielle
Syntaxes:

[ON DELETE {RESTRICT | CASCADE | SET NULL | NO


ACTION}]
[ON UPDATE {RESTRICT | CASCADE | SET NULL | NO
ACTION}]

# 129

Moteur transactionnel

Relation entre deux tables

# 130

Moteur transactionnel

Cl trangre
Relation entre deux tables
CREATETABLEvendeur(
id_vendeurint(10)unsignedNOTNULLauto_increment,
nomvarchar(45)NOTNULLdefault'',
PRIMARYKEY(id_vendeur)
)ENGINE=InnoDB;
Latableclientestlievendeurparlechampid_vendeur:
CREATETABLEclient(
id_clientint(10)unsignedNOTNULLauto_increment,
nomvarchar(45)NOTNULLdefault'',
id_vendeurint(10)unsigneddefaultNULL,
PRIMARYKEY(id_client),
KEYFK_id_vendeur(id_vendeur),
CONSTRAINTFK_id_vendeurFOREIGNKEY(id_vendeur)
REFERENCESvendeur(id_vendeur)
ONDELETECASCADEONUPDATECASCADE
)ENGINE=InnoDB;

# 131

Moteur transactionnel

Cl trangre (1/3)
Si ce n'est pas dj fait, l'aide de phpMyAdmin

crez une base 'magasin'


Dans cette base, crez une table InnoDB 'produits'
avec 5 champs :

'id' de type 'INT', cl primaire, auto-incrment


'nom' de type VARCHAR(250)
'description' de type TEXT
'prix' de type DECIMAL
'image' de type BLOB
Si vous possdez dj cette table en MyISAM ou tout autre moteur
de stockage, vous pouvez effectuer le transfert en InnoDB
directement avec phpMyAdmin.
# 132

Moteur transactionnel

Cl trangre (2/3)
A l'aide de phpMyAdmin crez une base 'categories'
Dans la base 'magasin', crez une table 'categories'
avec 2 champs :

'id' de type 'INT', cl primaire, auto-incrment


'categorie' de type VARCHAR(250)

Ajoutez deux catgories (par exemple : livre, cd-rom)

Pour optimiser vos futures requtes, vous pouvez galement crer


un index sur 'categorie' et dfinir ce champ comme unique.
# 133

Moteur transactionnel

Cl trangre (3/3)
Dans la table 'produits', ajoutez un champ

'id_categorie' qui fait rfrence au champ 'id' de la


table 'categories'
Ajoutez plusieurs produits.
Tentez galement d'ajouter un produit sans catgorie
ou avec une catgorie inexistante.

La contrainte d'intgrit doit tre forte. En d'autres termes, le


remplissage d'un produit qui n'appartient pas une catgorie
connue doit tre impossible.
# 134

Moteur transactionnel

Les transactions
Groupe de requtes SQL rassembles en une
opration atomique
InnoDB supporte la norme ACID

Atomicit (toutes les requtes de la transaction sont


executes ou aucune ne l'est)
Cohrence (la cohrence de la base est prserve)
Isolation (les transactions sont isoles les unes des
autres)
Durable (mcanisme de rcupration automatique
des transactions valides en cas de crash)

# 135

Moteur transactionnel

Les transactions
Une transaction dbute avec START TRANSACTION
ou BEGIN
Elle se termine par :

COMMIT: validation de la transaction


ROLLBACK: annulation de la transaction
Ou alors elle est valide implicitement avec, par
exemple, une instruction DDL (create table,...)

InnoDB prend galement en charge les points de


sauvegarde (SAVEPOINT)

# 136

Moteur transactionnel

Transaction

Transaction valide
/*Dbutdelatransaction*/
STARTTRANSACTION;
/*suitedereqtes*/
UPDATEproduitSETqte=qte1WHEREid_produit=4126;
INSERTINTOlog(date,id)VALUES(now(),4126);
/*Validation:Findelatransaction*/
COMMIT;

# 137

Moteur transactionnel

Transaction

Transaction annule partiellement


STARTTRANSACTION;/*Dbutdelatransaction*/
INSERTINTOvendeur(nom)VALUES('Zend');
INSERTINTOvendeur(nom)VALUES('Steven');
SAVEPOINTS1;/*Pointdesauvegarde*/
INSERTINTOvendeur(nom)VALUES('Guillaume');
INSERTINTOvendeur(nom)VALUES('Olivier');
ROLLBACKTOSAVEPOINTS1;/*Annulationpartielledelatransaction
jusqu'aupointdesauvegarde*/
SELECTnomFROMvendeur;/*AfficheZend&Steven*/

# 138

Flux XML

Copyright 2006, Zend Technologies Inc.

Flux XML

Qu'est-ce que XML ?


XML est un standard permettant d'organiser /

stocker des donnes.


La plupart des structures de donnes peuvent tre
traduites en XML.

# 140

Flux XML

Exemple de fichier XML


Un fichier XML simple
<documentid="12">
<author>GuillaumePonon</author>
<title>BestpracticesPHP5</title>
<chapter>
<title>LesfluxXML</title>
<paragraphtype="introduction">...</paragraph>
</chapter>
</document>

# 141

Flux XML

Les extensions XML


Il existe 3 implmentations natives lies la
manipulation de documents XML en PHP
L'extension SimpleXML

Simple utiliser, permet la lecture, la modification et la


suppression de donnes.

L'extension DOMXML

Verbeux, permet la lecture, la modification et la


suppression de donnes.

Support XML natif : SAX

Permet la lecture rapide mais pas l'criture.

# 142

Flux XML

L'extension SimpleXML
SimpleXML est une extension de manipulation de

flux XML introduite dans PHP 5.


Elle est facile mettre en oeuvre et se base sur le
mme backend que DOMXML : le passage de
DOM SimpleXML et inversement n'a quasiment
aucun cot d'excution.
SimpleXML permet de manipuler un flux travers
des objets crs partir des noms de balises XML.

# 143

Flux XML

Avantages & inconvnients


Avantages

Simplicit d'utilisation
Permet toutes les oprations (lecture, criture,
suppression, cration, enregistrement).
Gre XPath et permet le passage DOM en une seule
instruction.

Inconvnients

Ncessit de charger le flux XML en entier avant de


l'diter.
Moins permissif que SAX (XML strict requis).

# 144

Flux XML

Exemple de lecture

# 145

Flux XML

Exemple de modification

# 146

Flux XML

Exemple avec Xpath

# 147

Flux XML

Exemple de lecture RSS

# 148

Flux XML

L'extension DOMXML
DOMXML est une extension stable et efficace qui
permet de grer la lecture, l'criture, la
suppression, l'enregistrement.
Cette extension est disponible dans PHP 4 et PHP
5. En revanche, elle a t stabilise dans PHP 5.
Gre les requtes XPath et les transformations
XSLT.
Son utilisation est verbeuse et pas toujours trs
intuitive au dbut.

# 149

Flux XML

DOMXML : lecture

# 150

Flux XML

DOMXML : criture

# 151

Flux XML

L'extension SAX
L'extension SAX permet la lecture partielle ou

totale d'un fichier.


SAX est le parseur le plus efficace en lecture :

Il consomme peu de ressources.


Il effectue une lecture linaire.

SAX est trs permissif, il est capable de lire des


fichiers HTML mal forms.
Il n'est pas possible d'enregistrer avec SAX,
moins de reproduire par programmation le
document partir d'un contenu lu avec les
fonctions de l'extension.

# 152

Flux XML

SAX : lecture
Transformation d'un flux XML en tableau
$parser=xml_parser_create('utf8');
xml_parse_into_struct($parser,$xml,$table);
unset($parser);
$level=0;
foreach($tableas$v){
$v['value']=utf8_decode($v['value']);
if($v['type']=='open')
echostr_repeat('',$level++).'['.$v['tag']."]\n";
if($v['type']=='close')
echostr_repeat('',$level).'[/'.$v['tag']."]\n";
if($v['type']=='complete'){
echostr_repeat('',$level+1).'['.$v['tag'];
echo']'.$v['value'].'[/'.$v['tag']."]\n";
}
}

# 153

Flux XML

SAX : lecture (rsultat)


Transformation d'un flux XML en tableau
[DOCUMENT]
[AUTHOR]GuillaumePonon[/AUTHOR]
[TITLE]BestpracticesPHP5[/TITLE]
[CHAPTER]
[TITLE]LesfluxXML[/TITLE]
[PARAGRAPH]paragraphe1[/PARAGRAPH]
[PARAGRAPH]paragraphe2[/PARAGRAPH]
[/CHAPTER]
[CHAPTER]
[TITLE]Lestableaux[/TITLE]
[PARAGRAPH]paragraphe3[/PARAGRAPH]
[/CHAPTER]
[/DOCUMENT]

# 154

Flux XML

SAX : lecture avec handlers


Un fichier XML peut tre parcouru via des

handlers, c'est dire des fonctions qui sont


automatiquement appeles au fur et mesure du
parsing :

une fonction lorsque le parseur rencontre une balise


ouvrante ;
une fonction lorsque le parseur rencontre une balise
fermante ;
une fonction lorsque le parseur dtecte des donnes.

Vous devez vous-mme dfinir les fonctions


appeles.

# 155

Flux XML

Cration d'une application (1/3)


Nous allons crer ici une petite application qui affiche

des informations sur les rsultats des matchs de foot


(ou toute autre information contenue dans un flux rss :
actualits, blog, etc.) en HTML
Proposer dans un premier temps une ide
d'architecture pour cette application

Classe(s) mettre en oeuvre ?


Fichiers crer ?

Les rgles respecter sont mentionnes en 2/3


Bien penser quels fichiers, quelles fonctions, quelles classes vont tre
crs avant de dvelopper est important.
# 156

Flux XML

Cration d'une application (2/3)


Les diffrentes parties de votre application seront les
suivantes

La partie 'mtier' s'occupera de rcuprer les donnes


traiter
La partie 'prsentation' s'occupera de formatter les donnes
dans du code HTML pour l'affichage
Pour la partie 'mtier', on utilisera SimpleXML dans un premier
temps
Pour la partie 'prsentation', on utilisera un fichier php qui
contient le HTML et trs peu de PHP
Tentez de sparer un maximum le code HTML du code PHP. Si vous
avez termin, vous pouvez essayer de faire la mme chose avec
SAX ou DOM.
# 157

Flux XML

Cration d'une app. (3/3) (+)


Partie avance

Crez une classe personnalise 'Rss_Exception' qui grera


toutes les erreurs. L'affichage du message de l'exception doit
se faire en HTML.
Remaniez votre partie 'mtier' dans une classe 'RssManager' si
ncessaire
Crez une classe 'RdfManager' qui fait la mme chose que
'RssManager' pour les flux Rdf
Crez une classe 'FeedBuilder' qui renvoit un objet
RdfManager ou RssManager en fonction des caractristiques
du flux pass en paramtre
SimpleXML permet de grer 95% des applications. Lorsque votre
fichier XML devient plus complexe (espaces de noms), l'utilisation de
DOMXML est recommande.
# 158

Optimisation SQL & Architecture

Copyright 2006, Zend Technologies Inc.

Optimisation SQL & Architecture

Optimisation

Plusieurs axes d'optimisation des performances

pour une base de donnes


Loptimisation des requtes sql offre souvent le
plus grand gain
Un gain apprciable est galement possible en
optimisant la structure de la base de donnes
Le plus souvent, les rponses ne sont pas
spcifiques MySQL

# 160

Optimisation SQL & Architecture

MySQL ne peut utiliser dindex


Clause LIKE qui commence par un joker

SELECT ville FROM client WHERE nom LIKE '%nd';

En n'utilisant pas la premire partie de lindex:

SELECT * FROM table WHERE idx_part2=123;

Si MySQL dcide que la lecture complte de la


table est plus rapide que lutilisation de lindex

# 161

Optimisation SQL & Architecture

MySQL ne peut utiliser dindex


Si la partie de gauche ne contient pas

dexpression et si la partie de droite est une


constante, lexcution sera plus rapide:

SELECT id FROM produit WHERE prix*1.5 > 1000; =>


n'utilise pas l'index
SELECT id FROM produit WHERE prix > 1000/1.5; => peut
utiliser l'index

# 162

Optimisation SQL & Architecture

Optimisation de l'index
Un index sur la colonne entire n'est pas toujours

ncessaire
Indexer le prfixe de la colonne: gain de place et
de performance

CREATE INDEX idx_nom ON client (nom(10)); /* index sur


les 10 premiers caractres */

Utiliser les premires colonnes des index composs

KEY(a,b) servira pour:


SELECT ... WHERE a='x' OR b='y'
SELECT ... WHERE a='z'

Index FULLTEXT pour la recherche textuelle


# 163

Optimisation SQL & Architecture

EXPLAIN: optimiser sa requte


EXPLAIN affiche le plan d'excution d'une requte
SELECT

Ordre de lecture des tables


Oprations de lecture effectues
Quels index auraient pu tre utiliss
Quels index sont utiliss
Rfrences entre les tables
Estimation du nombre de lignes rcupr par
l'optimiseur

# 164

Optimisation SQL & Architecture

EXPLAIN: optimiser sa requte

# 165

Optimisation SQL & Architecture

Influencer l'optimiseur
Forcer MySQL utiliser ou ignorer les index (si
possible)
SELECT ... FROM table_name [[USE|FORCE|
IGNORE] INDEX(nom_colonne_indexe)]

USE: essaye d'utiliser l'index


FORCE: force l'utilisation de l'index
IGNORE: ignore l'index

SELECT STRAIGHT_JOIN

Lors d'une jointure, force loptimiseur joindre les tables


dans lordre indiqu

# 166

Optimisation SQL & Architecture

Influencer l'optimiseur
SELECT SQL_BUFFER_RESULT

Le rsultat est stock dans une table temporaire (pour


des requtes couteuses en temps)

SELECT SQL_BIG_RESULT

Indique MySQL que la taille du rsultat sera


importante (s'utilise avec GROUP BY, DISTINCT)

# 167

Optimisation SQL & Architecture

Les requtes prpares


Valable seulement pour la session MySQL en cours
API natives disponibles pour PHP
(mysqli_stmt_prepare,... )

PREPARE stmt_client FROM 'SELECT nom, prenom FROM


client WHERE id_client = ? AND ville = ?';
SET @parm1 = 123, @param2 = 'Paris';
EXECUTE stmt_client USING @parm1, @param2;

# 168

Optimisation SQL & Architecture

Quelques conseils

Les rgles d'optimisation des index du SELECT

sappliquent aussi aux requtes dcritures(clause


WHERE
Utiliser lINSERT multi-lignes pour crire plusieurs
enregistrements la fois

INSERT INTO table (champ)VALUES


(valeur1),(valeur2),(valeur3);

Import massif de donnes texte avec la


commande LOAD DATA INFILE

plus rapide que des INSERT quivalents

# 169

Optimisation SQL & Architecture

Quelques conseils

En gnral les requtes ont toutes une clause

WHERE (rduit le nombre denregistrements)


Utiliser la clause LIMIT
Evitez la commande SELECT *
La cl primaire (PRIMARY KEY) doit tre la plus
petite possible

Utiliser auto_increment

Utiliser les requtes prpares

# 170

Optimisation SQL & Architecture

Optimisation du schma
Choisir les bons types de champs (PROCEDURE

ANALYSE())
Choisir la bonne longueur de champs
Attention particulire aux cls trangres
Normalisez votre base de donnes (3me forme
normale)
Choisir les moteurs de stockages adapts

# 171

Optimisation SQL & Architecture

PROCEDURE ANALYSE()
Procdure d'analyse de la structure de la table
Propose le type optimale de chaque champ
analys dans le SELECT

nom
valeur minimale
valeur maximlale
taille maximlale
nombre de valeur vides ou gales zro
nombre de valeur NULL
valeur ou taille moyenne
cart type
type optimal suggr pour le champ analys
# 172

Optimisation SQL & Architecture

EXPLAIN: optimiser sa requte

# 173

Optimisation SQL & Architecture

Longueur des champs


Bien dimensionner sa base
Pas de VARCHAR(255) quand VARCHAR(40) suffit
Pas de BIGINT quand INT suffit
UNSIGNED pour un champ positif
(auto_increment)
Pensez aux type ENUM & SET
vitez lutilisation de valeurs NULL (surtout pour les
index)

# 174

Optimisation SQL & Architecture

Normalisation

Organiser ses donnes pour

limiter les redondances


diviser une table en plusieurs et les relier entre elles

afin d'viter

les anomalies de mise jour


les redondances

# 175

Optimisation SQL & Architecture

Moteur de stockage
Pluggable storage engine architecture
Plusieurs moteurs de stockage peuvent tre utiliss
sur le mme serveur
Le moteur de stockage est dfini au niveau des
tables
Possibilit de changer de moteur

ALTER TABLE ma_table ENGINE = MyISAM


ALTER TABLE ma_table ENGINE = InnoDB

Chaque moteurs optimiss pour un besoin

# 176

Optimisation SQL & Architecture

Moteur de stockage
Caractristiques indpendentes du moteur de
stockage

les requtes sql


le plan d'excution
la scurit
les fonctions
les logs
...

# 177

Optimisation SQL & Architecture

Quel moteur de stockage ?


Dpend des besoins suivant les critres:

de vitesse
de transactions
frquence des critures
volume de donnes a stocker

Choisir moteur de stockage adapt est important

# 178

Optimisation SQL & Architecture

MyISAM

Trs rapide pour les applications exigeantes en

lecture
Prend en charge les index FULLTEXT
Prend en charge les types de donnes spatiales
(GIS)
Adapt pour le reporting ou le data warehouse
Cadre d'utilisation:

lectures frquentes
mises jour avec des index

# 179

Optimisation SQL & Architecture

InnoDB

Moteur de stockage transactionnel (norme ACID)


Prend en charge les cls trangres et lintgrit
rfrentielle
Cadre d'utilisation:

besoin transactionnel
besoin intgrit rfrentielle
tables avec un frquence leve de commandes
UPDATE et DELETE

# 180

Optimisation SQL & Architecture

MEMORY

Stocke les donnes uniquement en mmoire


Trs rapide en lecture et en criture
Non transactionnel
Les donnes sont perdues quand le serveur
s'arrete
La structure de la table est persistante
Pas de prise en charge de BLOB ni de TEXT
Cadre d'utilisation:

tables temporaires

# 181

Optimisation SQL & Architecture

ARCHIVE

Stocke de grandes quantits de donnes en les


compressant
Ne permet que les requtes INSERT et SELECT
Ne permet pas:

la clause ORDER BY
les colonnes BLOB

Cadre d'utilisation:

stocker de grandes quantites de donnes (archives,


logs)

# 182

Services Web

Copyright 2006, Zend Technologies Inc.

Services Web

Principe des Services Web


Les services web rpondent un besoin

d'introprabilit.
Ils permettent l'change d'informations et l'accs
des services dynamiques entre plusieurs
systmes htrognes.
Ils dfinissent un protocole commun et standard
pour cela.

# 184

Services Web

REST

REST signifie Representational State Transfer.


L'objectif de REST est de permettre la mise en

place de services lgers et faciles utiliser.


REST n'est pas un standard, mais une mthode.
Il existe de plus en plus de services REST
disponibles (yahoo, google, amazon, etc.). C'est
une solution trs utilise en B2C.
REST ne dfinit pas de protocole ni de format de
donnes, une documentation dveloppeur est
souvent ncessaire pour faire un client REST.

# 185

Services Web

Principe de REST
L'interrogation d'un service REST se fait via l'URL

(requte GET).
Le format du retour d'information peut prendre
plusieurs formes possibles :

Un flux XML
Une chane srialise

# 186

Services Web

REST : exemple de comportement


Appel du serveur REST
Appelduserveurvide:http://localhost/server.php
<responsetype="error">
<message>Requteincorrecte.</message>
</response>
Appeldel'opration'add'pourajouterdeslments:
http://localhost/server.php?operation=add&name=Guillaume&tel=4678
http://localhost/server.php?operation=add&name=Steven&tel=47859
<responsetype="info">
<operation>add</operation>
<message>Enregistrementajout.</message>
</response>

# 187

Services Web

REST : exemple de comportement


Appel du serveur REST
Appeldel'opration'list':
http://localhost/server.php?operation=list
<responsetype="info">
<operation>list</operation>
<content>
<item><name>Guillaume</name><tel>4678</tel></item>
<item><name>David</name><tel>47859</tel></item>
</content>
</response>

# 188

Services Web

Serveur REST (1/2)


Crez un fichier 13_rest_server.php
Dans ce fichier

Crez une classe 'MathServer' et une mthode


'getDouble($number)' qui renvoit le double d'un nombre.
L'utilisateur doit appeler votre serveur avec un paramtre
(GET) 'operation' qui vaut 'getDouble' et un paramtre
'number' qui contient un nombre
Le serveur affiche un flux XML comme dcrit dans les slides
prcdents. Une rponse de type 'erreur' doit tre renvoye si
les paramtres ne sont pas corrects
Libre vous d'utiliser ou non une extension tel que SimpleXML pour
gnrer votre flux XML.
# 189

Services Web

Client REST (2/2)


Crez un fichier 13_rest_client.php
Dans ce fichier

Crez une classe 'MathManager' avec une mthode '__call'


Le paramtre 'operation' est le nom de la mthode
demande et le paramtre 'number' le premier paramtre
pass la mthode
'__call' fait appel votre serveur rest, renvoit le rsultat si tout
s'est bien pass et lance une exception dans le cas contraire
Exemple d'utilisation : echo $mathManager->getDouble(3);

Pour le dveloppeur, l'utilisation de votre classe doit tre


transparente. Il n'y a pas besoin de savoir qu'il y a un service derrire
pour pouvoir s'en servir.
# 190

Services Web

REST par la srialisation


Il est possible de faire la mme chose en

envoyant des donnes srialises plutt que du


xml.

Avantage : les donnes srialises sont facile


manipuler avec un client PHP.
Inconvnient : seul un client PHP peut lire les donnes
srialises, ce qui rduit la couverture des clients
potentiels.

Les services Yahoo ! proposent des services REST


srialiss pour PHP.

# 191

Services Web

XMLRPC
XMLRPC est un protocole d'change encore
utilis.
Il permet l'change de donnes et la
manipulation de fonctions distance.
Ces services sont souvent remplacs par les
standards SOAP / WSDL

# 192

Services Web

SOAP & WSDL


SOAP et WSDL sont les standards les plus utiliss
pour mettre en place des services web.
SOAP

Est le protocole d'change de donnes : il assure la


mise en place d'un flux travers lequel les donnes et
leurs structures sont entirement conservs.

WSDL

Est le protocole de description du service. Il s'agit d'un


fichier XML "mode d'emploi" du service SOAP.

# 193

Services Web

SOAP et PHP
PHP permet de crer un serveur SOAP
PHP permet de crer un client SOAP
PHP ne permet pas (encore) de gnrer un

document WSDL.
L'extension SOAP pour PHP 5 est native, stable et
efficace.

# 194

Services Web

SOAP : implmentation du serveur


Un serveur qui exporte la fonction double
classmySoapService{
/**
*Obtenirlavaleurdouble
*
*@paraminteger$num
*@returninteger
*/
functiondouble($num){
return$num*2;
}
}
$soap=newSoapServer(dirname(__FILE__).'/soap_server.wsdl');
$soap>setClass('mySoapService');
$soap>handle();

# 195

Services Web

Gnrer le fichier WSDL


Avec Zend Studio

Aller dans outils -> gnrateur WSDL


Slectionner l'emplacement du fichier WSDL
Slectionner les classes qu'il faut intgrer au WSDL
Valider

Avec UML2PHP5

http://uml2php5.zpmag.com/SOAP_server.php

# 196

Services Web

Le client SOAP associ


Implmentation du client SOAP
$client=newSoapClient(dirname(__FILE__).'/soap_server.wsdl');
echo$client>double(4);

# 197

Services Web

Serveur SOAP (1/2)


Crez un fichier 14_soap_server.php
Dans ce fichier

Crez une classe 'MathServer' et une mthode


'getDouble($number)' qui renvoit le double d'un nombre.
N'oubliez pas de mentionner le type des paramtres et valeurs
de retours dans la phpdoc !
Gnrez le fichier WSDL de MathServer l'aide de Zend Studio
Le serveur propose l'utilisation de MathServer travers un
serveur SOAP

Avec PHP5, utilisez l'extension native SOAP qui est de loin la plus
efficace.
# 198

Services Web

Client SOAP (2/2)


Crez un fichier 14_soap_client.php
Dans ce fichier

Crez une classe 'MathManager' avec une mthode '__call'


Le paramtre 'operation' est le nom de la mthode
demande et le paramtre 'number' le premier paramtre
pass la mthode
'__call' fait appel votre serveur soap, renvoit le rsultat si tout
s'est bien pass et lance une exception dans le cas contraire
Exemple d'utilisation : echo $mathManager->getDouble(3);

Pour le dveloppeur, l'utilisation de votre classe doit tre


transparente. Il n'y a pas besoin de savoir qu'il y a un service derrire
pour pouvoir s'en servir.
# 199

Services Web

Cration d'un service SOAP (+)


Crez un fichier 15_soap_authentification.php
Crer un service qui 'exporte' une fonction

'authentificate'.
Cette fonction 'authentificate' prend en paramtre un
login et un mot de passe.

Mettez en dur dans la fonction 'authentificate' le login / mot


de passe valide.
Cette fonction est similaire la fonction 'double' de l'exemple
prcdent.

Implmentez le serveur et un client.


Aidez-vous de l'implmentation dcrite dans les slides pour mettre
en place votre service.
# 200

Services Web

Exemple de client Google


Service de recherche avec Google
$words=$_GET['query']?$_GET['query']:"afup";
array('namespace'=>'urn:GoogleSearch','trace'=>0);
try{
$client=newSoapClient(dirname(__FILE__).
"/GoogleSearch.wsdl",array(
'namespace'=>'urn:GoogleSearch'));
$key='<votreclici!>';
$result=$client>doGoogleSearch($key,$words,0,10,false,'',
false,'lang_fr','','');
var_dump($result);
}catch(Exception$e){
echo$e>getMessage();
}

# 201

Introduction la SPL

Copyright 2006, Zend Technologies Inc.

Introduction la SPL

Qu'est-ce que la SPL ?


La SPL est une extension contenant un ensemble
de classes implmentes nativement dans PHP.
Ces classes sont utilises par :

Les ressources natives de PHP


Le dveloppeur PHP, qui peut s'en servir pour ses
propres besoins.

La SPL est documente :

http://www.php.net/~helly/php/ext/spl/
http://www.php.net/spl

# 203

Introduction la SPL

Concepts / utilit
Les classes de la SPL permettent d'attribuer des

fonctionnalits complmentaires aux classes que


l'on manipule.
Elles permettent aussi d'obtenir un squelette pour
un pattern.
Elles grent de nombreuses fonctionnalits telles
que par exemple :

La gestion des exceptions


Les collections (facults d'itration)

# 204

Introduction la SPL

Hirarchie des classes


Les classes et interfaces de la SPL :

http://www.php.net/~helly/php/ext/spl/hierarchy.html

Quelques classes - racine

ArrayAccess
Coutable
Exception
SplFileInfo, SplObserver, SplSubject
Traversable

# 205

Introduction la SPL

Classes SPL Disponibles


Pour liste les classes SPL disponibles...
print_r(spl_classes());
Rsultat:
Array
(
[AppendIterator]=>AppendIterator
[ArrayIterator]=>ArrayIterator
(...)
[UnderflowException]=>UnderflowException
[UnexpectedValueException]=>UnexpectedValueException
)

# 206

Introduction la SPL

Les itrateurs (Traversable)


Un itrateur permet un objet de se comporter

comme une collection, c'est dire d'tre


parcouru.
Le parcours d'un objet qui implmente un
itrateur peut tre gr par l'instruction "foreach".
Il existe de nombreuses interfaces d'itration :

Dba, Directory, Append (simplexml), Caching, Filter,


Recursive, ArrayObject, etc.

# 207

Introduction la SPL

Parcours de rpertoire
Sans itrateur...
if($handle=opendir(".")){
while(false!==($file=readdir($handle))){
if($file!="."&&$file!=".."){
print"$file<br/>\n";
}
}
closedir($handle);
}

# 208

Introduction la SPL

Parcours de rpertoire
Avec itrateur...
$dir=newDirectoryIterator(".");
while($dir>valid()){
if(!$dir>isDot()){
print$dir>current()."<br/>\n";
}
$dir>next();
}

# 209

Introduction la SPL

Iterateur pour tableaux


Manipuler un tableau avec arrayObject
$array=array('1'=>'un',
'2'=>'deux',
'3'=>'trois');
$arrayobject=newArrayObject($array);
$iterator=$arrayobject>getIterator();
while($iterator>valid()){
echo$iterator>key().'=>'.
$iterator>current()."\n";
$iterator>next();
}

# 210

Introduction la SPL

Implmenter un itrateur
Vos propres classes peuvent implmenter un

itrateur afin d'tre parcourues via foreach ou


while !
Quelques exemples d'utilisation :

Parcourir le rsultat d'une requte SQL


Orienter le parcours d'un tableau ou simuler un
parcours rcursif travers un parcours simple.

# 211

Introduction la SPL

Itrateur : principe
Un intrateur possde des mthodes spciales
permettant son parcours :

rewind : lment prcdent


current : lment courant
key : cl de l'lment courant
next : lment suivant
valid : vrifie s'il y a d'autres lments

Le principe du parcours est le mme que celui du


tableau.

# 212

Introduction la SPL

Optimisation BD avec SPL (1/2) (+)


A l'aide de phpMyAdmin crez une base 'magasin'
Dans cette base, crez une table 'produits' avec 5
champs :

'id' de type 'INT', cl primaire, auto-incrment


'nom' de type VARCHAR(250)
'description' de type TEXT
'prix' de type DECIMAL
'image' de type BLOB

Ajoutez quelques enregistrements cette table


Vous pouvez aussi utiliser d'autres outils (Mysql Query Browser, SQL
Front, ...).
# 213

Introduction la SPL

Optimisation BD avec SPL (2/2) (+)


Crez un fichier 16_spl_speed_display.php
Dans ce fichier

Crez une classe 'Product_Iterator' qui implmente l'interface


native 'Iterator'
Le constructeur se connecte la base avec PDO et effectue
une requte SELECT
Implmentez les mthodes 'next', 'preview', 'current', ...
demandes par l'interface 'Iterator'
Crez un objet avec cette classe, que vous utiliserez pour
afficher les rsultats avec 'foreach'
Pour cet exercice, le formateur doit vous guider. Il s'agit d'une
optimisation lgante bien que pas ncessaire pour vos
dveloppements.
# 214

Merci de votre attention !

Copyright 2006, Zend Technologies Inc.

PHP Avanc

Avez-vous des questions ?


D'ordre gnral sur notre formation ?
Sur un point prcis qui pose problme ?
Sur un point prcis approfondir ?
Sur un tout autre sujet ?

# 216

PHP Avanc

Notes

_______________________________________________
_______________________________________________
_______________________________________________
_______________________________________________
_______________________________________________
_______________________________________________
_______________________________________________
_______________________________________________
Utilisez ce slide pour prendre des notes (1/3)

# 217

PHP Avanc

Notes

_______________________________________________
_______________________________________________
_______________________________________________
_______________________________________________
_______________________________________________
_______________________________________________
_______________________________________________
_______________________________________________
Utilisez ce slide pour prendre des notes (2/3)

# 218

PHP Avanc

Notes

_______________________________________________
_______________________________________________
_______________________________________________
_______________________________________________
_______________________________________________
_______________________________________________
_______________________________________________
_______________________________________________
Utilisez ce slide pour prendre des notes (3/3)

# 219

Vous aimerez peut-être aussi