Vous êtes sur la page 1sur 44

COURS

PHP5 Avanc
& MVC

DIFFUSION : tudiants Master Langages et technologies du Web

Table des matires


1
2
3
4
5
6

Pr requis ................................................................................................................................................... 3
Objectif du cours ....................................................................................................................................... 3
Le dveloppement d'applications web, un dveloppement complexe .................................................... 4
Dveloppement web ................................................................................................................................. 5
Modle-Vue-Contrleur (MVC) ................................................................................................................. 6
MVC et PHP : implmentation .................................................................................................................. 8
6.1 Architecture des dossiers.................................................................................................................... 8
6.2 Contrleur : ......................................................................................................................................... 9
6.3 Modle : ............................................................................................................................................ 10
6.4 Vue : .................................................................................................................................................. 10
7 Programmation oriente objet en PHP5 ................................................................................................. 11
7.1 Rappel ............................................................................................................................................... 11
7.2 Classe et instance. ............................................................................................................................. 12
7.3 Copie, Hritage, redfinition et subtilits. ....................................................................................... 14
7.3.1 Copie & rfrence ...................................................................................................................... 14
7.3.2 Hritage ..................................................................................................................................... 15
7.3.3 Surcharge ou redfinition .......................................................................................................... 17
7.3.4 Subtilits .................................................................................................................................... 18
8 Base de donnes via PDO ........................................................................................................................ 23
8.1 Driver et installation ......................................................................................................................... 25
8.2 Connexion et gestion d'erreur de la connexion ............................................................................... 26
8.2.1 Connexion .................................................................................................................................. 26
8.2.2 Erreurs de connexion................................................................................................................. 26
8.3 Requtes et traitements ................................................................................................................... 27
Date d'dition :

20/02/2012

Page :

1 / 44

8.3.1 Requtes .................................................................................................................................... 27


8.3.2 Traitements................................................................................................................................ 28
9 Template et Vue ...................................................................................................................................... 30
9.1 Principe du Template ........................................................................................................................ 30
9.2 Exemple fait maison : .................................................................................................................. 31
9.2.1 Fichier de prsentation ............................................................................................................. 31
9.2.2 Script de donnes ...................................................................................................................... 31
9.2.3 Moteur du Template ................................................................................................................. 31
9.2.4 Sortie HTML. .............................................................................................................................. 32
9.3 Smarty : Gestionnaire de Template .................................................................................................. 33
10 Gestion des Erreurs ................................................................................................................................. 34
10.1
Gestion d'erreurs Kit de survie ................................................................................................... 34
10.1.1 php.ini ........................................................................................................................................ 35
10.1.2 Dans vos script ........................................................................................................................... 36
10.2
Les assertions ................................................................................................................................ 37
10.3
Les Exceptionsk ............................................................................................................................. 38
10.3.1 Principe ...................................................................................................................................... 38
10.3.2 Usage ......................................................................................................................................... 39
11 Dveloppement et scurit ..................................................................................................................... 40
11.1
Les points cls................................................................................................................................ 40
11.2
Tout le monde ment ! ................................................................................................................... 40
11.2.1 Ne fait pas confiance au utilisateur........................................................................................... 40
11.2.2 Injection SQL .............................................................................................................................. 41
11.2.3 Session Cookies et scurit. ................................................................................................... 43
11.2.4 Vrifier vos logs ......................................................................................................................... 44

Historique des rvisions


Version Auteur
1
Frdric Thron

Date d'dition :

Commentaires
Cration du document

20/02/2012

Date
26/01/2012

Page :

2 / 44

1 Pr requis
- Cours PHP de Jacques Bandet
http://webu2.upmf-grenoble.fr/shs/master/wp-content/uploads/2011/11/04_php.pdf

-Cours HTML et XHTML de Jacques Bandet


http://webu2.upmf-grenoble.fr/shs/master/wp-content/uploads/2011/10/01_xhtml.pdf

2 Objectif du cours
L'objectif du cours est de vous donner une mthode de dveloppement web (MVC), et de prsenter des
fonctions avances en PHP5 pour une utilisation 'professionnelle'.

Date d'dition :

20/02/2012

Page :

3 / 44

3 Le dveloppement d'applications web, un dveloppement complexe

Le dveloppement d'applications web est complexe, on peut travailler pour des cibles multiples :
Cibles machines (serveur, station client, Smartphone, Tablet )
Cibles browsers (IE 6et+, Chrome, Firefox, Safari, Opra)
Le dveloppement d'applications web est complexe, on doit travailler avec de multiples langages :
Langages cot serveur web [ASP,PHP,Python,Perl ]
Langages cot client [Javascript,Vbscript]
Langages de balisage [HTML, CSS]
Le dveloppement d'applications web est complexe, on doit travailler pour de multiples publics:

Utilisateur dbutant
Utilisateur confirm
Gestionnaire des donnes
Administrateur de l'application

Le dveloppement d'applications web est complexe, car on est soumis des contraintes :
Contraintes de scurits
Contraintes d'intgrit des donnes.
Contraintes lgales

Date d'dition :

20/02/2012

Page :

4 / 44

4 Dveloppement web
Quand on dbute en dveloppement web, on mlange souvent les langages de script, de balisage, de CSS
dans un seul fichier :

On a dans ce bout de code, les erreurs majeures de programmation et de logique :

HTML, CSS, PHP dans un mme document.


Pas de commentaires
Pas de bloc logique d'indentation
Copier-coller incohrent
Formulaire pas comprhensible (Oui quoi ?)

Q : Comment maintenir ce code ?


Date d'dition :

20/02/2012

Page :

5 / 44

5 Modle-Vue-Contrleur (MVC)
En dveloppement logiciel, il existe des architectures de dveloppement (architectural pattern) dont le
but est d'isoler le domaine logique de la partie IHM.

Une architecture de dveloppement Modle conceptuel


Architecture de dveloppement => Organisation logicielle de l'application. [Modle programmeur]
Modle conceptuel => Organisation des fonctionnalits de l'application. [Modle utilisateur]
On trouve MVC dans des travaux datant de 1979 par un groupe de travail Xerox Parc.
Les ingnieurs ont thoris MVC pour le langage Smalltalk (langage objet, de haut niveau d'abstraction).
http://heim.ifi.uio.no/~trygver/themes/mvc/mvc-index.html
Le but de MVC est la sparation de l'application en trois couches :
Le Modle dcrit les actions, les traitements mtiers de l'application (connexion aux donnes,
algo de rsolution, vrification, scurit).
La Vue est la partie restitution des donnes aux utilisateurs de l'application (HTML, PDF, XML)
Le Contrleur est une interface entre la vue et le modle. [Le mot interface ici ne doit pas tre
confondu avec l'interface utilisateur ou interface de classe]
Reprsentation MVC pour une application WEB.

Date d'dition :

20/02/2012

Page :

6 / 44

MVC et MVC2 :
Dans une architecture MVC, il peut exister plusieurs vues, plusieurs modles mais aussi plusieurs
contrleurs.
Dans une architecture MVC2, il n'existe plus qu'un seul et unique contrleur rceptionnant toutes les
requtes clientes.

Avantages et inconvnients de ce type de modle.


Avantage :

Modularits.
Maintenance.
Gestion multi-dveloppeurs.
L'isolation

Inconvnients :
Complexit de communication entre composants.
Apprentissage notamment dans le cadre d'un Framework.

Date d'dition :

20/02/2012

Page :

7 / 44

6 MVC et PHP : implmentation


L'implmentation dans une application web est simple ds lors que l'on a bien prpar l'analyse de
l'application.

6.1 Architecture des dossiers


La mise en place d'une structure de dossier permet d'apprhender plus facilement l'implmentation du
MVC.
On voit le principe d'une page de distribution/dispatch (index.php)
Pour utiliser proprement le modle MVC, on peut utiliser un
dispatcher, une page o toutes les requtes arrivent et sont
aiguilles.
Exemple :
http://www.monsite.com/index.php?do=connexion => Paramtre
d'aiguillage dans l'URL (GET)

Sur une application importante, on risque d'avoir un norme


Switch ce qui n'est ni lgant, ni pertinent.
On peut travailler avec un dispatcher gnrique qui appel
directement le contrleur.
On peut aussi avoir un appel un unique contrleur avec
l'action en paramtre.

Date d'dition :

20/02/2012

Page :

8 / 44

6.2 Contrleur :
Le contrleur reoit les requtes de l'utilisateur et fait l'intermdiaire entre le modle et la vue pour
rpondre aux requtes.
Scnario :
On a une demande de validation de connexion une application avec Login et Password.
On va faire une demande au contrleur pour grer cette connexion.
Le contrleur va appeler le modle de gestion des utilisateurs et retourner une information indiquant si la
personne peut ou ne pas se connecter. Il appelle la vue avec le retour indiqu par le modle pour la
prsentation l'utilisateur.

Page web
Lors de la validation :
http://www.monsite.com/index.php?do=connexion

Page index.php (dispatcher)


On inclut le contrleur et selon la demande, on
appel la fonction du contrleur.
A Savoir :
Mme si le contrleur peut tre de type
fonction dans la majorit des cas, ce sera une
classe.

Page controller.php
On voit bien l'interface avec le modle
et avec la vue.
Il y a bien isolation entre le modle et
la vue.

Date d'dition :

20/02/2012

Page :

9 / 44

6.3

Modle :

On parle de Modle pour la partie mtier de l'application.


On a les scripts d'actions de l'application : creation_data.php, verif_utilisateur.php
On doit avoir dans le modle, les classes, les fonctions, les fichiers de paramtres

On n'a pas et on ne doit pas avoir d'lment visuel dans le modle


sauf lors du dveloppement, pour le debug.
6.4

Vue :

La vue est un ou plusieurs composants grant la prsentation. Ce peut tre directement des fichiers HTML,
mais aussi des fichiers textes, ou d'autres formats XML, PDF
Le principe MVC est de dissocier les donnes et la prsentation. La vue doit reprsenter un visuel
(graphisme de l'application Web) et les donnes traites par le modle.
On a deux possibilits pour rsoudre ce problme :
Crer des pages HTML avec du PHP.

Si on code avec ce systme, on ne doit jamais utiliser de fonctions PHP pour crer la donne.
Les seules fonctions acceptables sont : echo(); print();
Utiliser un systme de Template.
On verra le systme de Template, plus longuement dans le chapitre 9
Quand on dveloppe pour le web, on utilise souvent du JavaScript ou de l'AJAX. La question est de savoir
ou mettre proprement les appels AJAX ?

Date d'dition :

20/02/2012

Page :

10 / 44

7 Programmation oriente objet en PHP5


7.1 Rappel
La programmation par objets ou par procdures classiques sont deux paradigmes du dveloppement.
La programmation oriente objet comporte les avantages suivants :

un code rutilisable.
un code modulaire.
un code comprhensible.
Un code conceptuel.

Qu'est-ce qu'une classe ?


Une classe est un modle de dfinitions pour la cration d'objets.
Une classe dfinit les attributs de l'objet (des champs) et des mthodes (des fonctions).
Par analogie : le plan d'une maison n'est pas une maison mais c'est le moyen de crer une ou plusieurs
maison(s).
Qu'est-ce qu'un objet ?
Concrtement, un objet est une instance d'une classe.
Par analogie : La maison est une instance faite partir du plan de la maison.

CLASSE OBJET

Date d'dition :

20/02/2012

Page :

11 / 44

7.2 Classe et instance.


Dclaration d'une classe :

Instanciation d'un objet :

La suret de l'application :
public : L'accessibilit la mthode ou l'attribut est possible de toute l'application.
Par dfaut si aucun type d'accs n'est indiqu c'est un accs public.
protected : L'accessibilit la mthode ou l'attribut est possible la classe qui l'a dfini
mais aussi ses classes hrites.
private : L'accessibilit la mthode ou l'attribut est possible uniquement la classe.

Constructeur et Destructeur :
PHP propose un moyen d'initialisation d'un objet au moment de sa cration grce : __construct (){}
Lors de l'instanciation par le mot cl NEW si dans la class la mthode __construct existe, elle va tre
appele.
PHP propose un moyen de supprimer un objet grce __destruct(){}. Cette mthode est
automatiquement appele quand lobjet est dtruit, soit par delete() ou unset(), soit la fin du script.
Un destructeur est pratique pour fermer les ressources ouvertes : fichiers, connexions vers des serveurs de
bases de donnes, etc.

Date d'dition :

20/02/2012

Page :

12 / 44

Exemple
Dfinition de la classe :

Usage de la classe :

$this: (comme en Java)


Il est souvent utile de pouvoir faire rfrence lobjet en cours dans une mthode. Cest par exemple le
cas pour accder un attribut ou lancer une autre mthode. La mta variable $this est une rfrence
permanente vers lobjet courant.
Accs au mthode et attribut ( JAVA):
En java pour accder une mthode ou un attribut, on utilise nom_objet
En PHP, pour accder une mthode ou un attribut, on utilise $nom_objet

.
->

nom_attribut
nom_attribut

Il n'y a pas $ devant nom_attribut

Date d'dition :

20/02/2012

Page :

13 / 44

7.3 Copie, Hritage, redfinition et subtilits.

7.3.1

Copie & rfrence

Il faut dfinir la diffrence entre deux objets qui sont identiques et deux objets qui sont les
mmes .
Ex : 2 DVD du mme film dans la mme collection sont identiques mais ne sont pas les mmes.
La classe

Le script

Sortie web :

Par dfaut en PHP5, l'assignation est une rfrence.


$obj1 = $obj2 // on ne copie pas l'objet on crait une rfrence (le & est implicite)
(rappel contraire Jacques Bandet. PHP4-PHP5)
Si on veut rellement crer une copie de l'objet, on utilise la fonction clone() qui copie l'objet.

Date d'dition :

20/02/2012

Page :

14 / 44

7.3.2

Hritage

L'hritage est la cration de classe partir d'une autre classe.


Ex : mon objet ma_ferrari provient de la class voiture qui est hrite de la class vhicule_a_moteur.

PHP5 ne supporte pas l'hritage multiple (JAVA)


Prototype de l'hritage en PHP5:
Class nom_new_classe extends nom_classe_herit {
}
L'hritage dans PHP5 est un hritage strict.

Paramtre obligatoire

Pre
w

Paramtre optionnel

Fils
x < w condition de crer des
valeurs par dfaut.
z>y

Les mthodes de la classe fils doivent avoir des prototypes compatibles avec ceux de la classe pre.
Il est possible dajouter des paramtres supplmentaires, condition quils soient facultatifs. Il est aussi
possible de rendre facultatifs des paramtres en leur donnant une valeur par dfaut.
Pour rsumer, le nombre de paramtres obligatoires de la mthode fille doit tre infrieur ou gal au
nombre de paramtres possibles de la mthode mre ; le nombre de paramtres possibles de la mthode
fille doit quant lui tre suprieur ou gal au nombre de paramtres possibles de la mthode mre.
Par exemple, une mthode qui a trois paramtres obligatoires sur cinq peut tre remplace par une
mthode qui a un paramtre obligatoire (nombre infrieur) et cinq facultatifs (donc six au total, ce qui est
suprieur aux cinq initiaux).
Seuls les constructeurs ne sont pas soumis cette rgle car la notion de constructeur gnrique na pas
vraiment de sens.

Date d'dition :

20/02/2012

Page :

15 / 44

On crait une classe hrite de la classe compte vue


prcedement.
On crait une classe bourse qui tend les attributs et les
mthodes de notre classe compte.

On va utiliser cette classe :

La sortie web :

Date d'dition :

20/02/2012

Page :

16 / 44

7.3.3

Surcharge ou redfinition

Dans la dfinition de l'hritage strict, on parle implicitement de la surcharge de mthode ou d'attribut.


On peut dans la classe fille, redfinir une mthode ou un attribut. Dans ce cas, par dfaut, c'est la dernire
dfinition qui est utilise.
Cependant, on peut vouloir accder aux mthodes parentes, on utilise alors la notation statique:
Parent::methode()
A savoir : L'accs statique est possible dans un script, attention si la mthode a besoin d'un objet ($this)
alors une erreur est dclenche.
Class Fille

Class Parent

Script :

Date d'dition :

Sortie Web :

20/02/2012

Page :

17 / 44

7.3.4

Subtilits

Hritage et redfinition des contrles d'accs.


Si vous redfinissez une mthode ou un attribut, vous pouvez changer alors sa scurit d'accs.
Le principe est simple, vous ne pouvez restreindre un contrle d'accs.
Tableau des comportements d'hritages :

Attributs ou mthodes

Classe pre
Public
Protected
Private

Classe fils
Public
Protected , public
Private, Protected , public

Attention :
On ne peut pas redfinir une mthode prive. Si on le faisait, on crerait en ralit une nouvelle
mthode. Si vous redfinissez une mthode prive, PHP5 considrera quil a deux mthodes de
mme nom simultanment dans la classe. Si cest une mthode de la classe mre qui y fait appel,
elle accdera la mthode prive initiale. Si inversement cest une mthode de la classe fille qui y
fait appel, elle accdera la nouvelle implmentation.

Il est dconseill de redfinir une mthode prive


Classe abstraites et interfaces
Une classe abstraite c'est une implmentation minimale d'une classe.
Elle dfinit les mthodes qui devront tre obligatoire pour la classe qui hrite de la classe abstraite.
Les interfaces (Attention : on parle ici d'interface au sens dveloppement) permettent de crer du
code qui spcifie quelles mthodes une classe doit implmenter. Toutes les mthodes dclares
dans une interface doivent tre publiques.
Intrt :
Les interfaces peuvent tre vues comme des contrles de qualit (vrifier que les objets
correspondent bien aux spcifications) et les classes abstraites comme des implmentations
incompltes, finir.
Date d'dition :

20/02/2012

Page :

18 / 44

Dclaration class abstraite

Dclaration interface

Implmentation de classe abstraite

Implmentation d'une interface

A savoir
o Une classe peut implmenter plusieurs interfaces en mme temps.

o Une classe ne peut pas avoir d'hritage multiple classe abstraite ou pas.
o On ne peut pas surcharger une interface ou une mthode abstraite (intrt mme de ces
systmes)

Il est dconseill d'utiliser classe abstraite et interface. On


utilise soit l'une ou l'autre des mthodes.
Fonction finales
Le concept de mthodes finales est simple, on indique PHP5 qu'aucune classe drive n'a le droit
de modifier l'implmentation d'une mthode.
Ex : On gre une collection de mdia, on a une classe media duquel on drive pour crer la classe
DVD, BD, CD
Si dans la class mdia, on crait une mthode
perdu($ref_media); on ne veut pas pouvoir
surcharger cette mthode.

On peut aussi dclarer une classe comme final, mais alors on ne pourra plus hriter d'elle.
L'intrt est l plus limit.

Date d'dition :

20/02/2012

Page :

19 / 44

Fonctions particulires
Fonction de clonage :
On a vu le principe du clonage, on peut crer
manuellement une fonction de clonage qui viendra
s'ajouter au principe natif de PHP5

Fonction d'appel une mthode (utile pour le dbug) :


Cette mthode intercepte tous les appels des mthodes qui n'existent pas.

Fonction d'information
La fonction get_class retourne une chaine donnant le nom de
la classe de l'objet.
Classe d'information
Il existe une classe ReflectionClass("Nom_classe") ayant des mthodes d'information sur la classe.
Ex : Avec la classe bourse

La sortie web donne

Date d'dition :

20/02/2012

Page :

20 / 44

On peut aussi avoir la vue de la classe

On aura en sortie web :

Date d'dition :

20/02/2012

Page :

21 / 44

Chargement de classe
Comme dans tout langage objet, on doit charger les classes que l'on va utiliser.

Les fichiers sont inclus suivant le chemin du fichier fourni.


Si aucun n'est fourni, l'include_path sera vrifi.
Si le fichier n'est pas trouv dans l' include_path alors include() vrifiera dans le dossier du script
appelant et dans le dossier de travail courant avant d'chouer.
Si l'instruction et _once, PHP vrifie si le fichier a dj t inclus et si c'est le cas, ne l'inclut
pas une deuxime fois.

L'instruction include() enverra une erreur de type warning si elle ne peut trouver le fichier; ce
comportement est diffrent de require(), qui enverra une erreur de type fatal.
Pour ne pas chaque fois utiliser l'adresse exacte du fichier inclure, on peut utiliser la variable
magique __FILE__.

On utilise require() quand on gre des classes

Date d'dition :

20/02/2012

Page :

22 / 44

8 Base de donnes via PDO


L'extension PHP Data Object (PDO) dfinit une interface pour accder une base de donnes depuis PHP.
PDO fournit une interface d'abstraction l'accs de donnes, ce qui signifie que vous utilisez les mmes
fonctions pour excuter des requtes ou rcuprer les donnes quelle que soit la base de donnes utilise.
PDO ne fournit pas une abstraction de base de donnes : il ne rcrit pas le SQL, n'mule pas des
fonctionnalits manquantes. Vous devriez utiliser une interface d'abstraction complte si vous avez besoin
de cela.
PDO n'est disponible qu'avec PHP5 car PDO utilisent les notions OO de PHP5.

Date d'dition :

20/02/2012

Page :

23 / 44

PHP5.1

PDO
Driver
MySQL

Driver
Oracle

Driver
SQL Server

Driver
PostGreSQL

Base de
donnes
MYSQL

Date d'dition :

20/02/2012

Page :

24 / 44

8.1 Driver et installation


Tableau des drivers et des bases de donnes (php.net) :
Nom du driver

Bases de donnes supportes

PDO_CUBRID

Cubrid

PDO_DBLIB

FreeTDS / Microsoft SQL Server / Sybase

PDO_FIREBIRD

Firebird/Interbase 6

PDO_IBM

IBM DB2

PDO_INFORMI
X

IBM Informix Dynamic Server

PDO_MYSQL

MySQL 3.x/4.x/5.x

PDO_OCI

Oracle Call Interface

PDO_ODBC

ODBC v3 (IBM DB2, unixODBC et win32


ODBC)

PDO_PGSQL

PostgreSQL

PDO_SQLITE

SQLite 3 et SQLite 2

PDO_SQLSRV

Microsoft SQL Server / SQL Azure

PDO_4D

4D

Pour installer un driver :


On modifie le fichier php.ini (fichier de paramtre existant sous Windows et linux), ou on utilise la fonction
dl()pour les charger au moment de l'excution.
Sous windows:
;extension=php_pdo_mssql.dll
extension=php_pdo_mysql.dll
;extension=php_pdo_oci.dll
;extension=php_pdo_oci8.dll
extension=php_pdo_odbc.dll
;extension=php_pdo_pgsql.dll
extension=php_pdo_sqlite.dll

Sous linux les extensions sont des .so


Date d'dition :

20/02/2012

Page :

25 / 44

8.2 Connexion et gestion d'erreur de la connexion

8.2.1

Connexion

Pour se connecter une base de donnes, il faut tout d'abord crer une instance de la classe PDO.
Le constructeur PDO besoin de 3 paramtres :
123-

DSN (Data Source Name).


Le nom dutilisateur.
Le mot de passe.

Le DSN dpend du driver de la base de donnes.


Le Data Source Name (DSN) de PDO_MYSQL est compos des lments suivants :
host : adresse du serveur distant (nom ou adresse IP, localhost pour un serveur local) ;
dbname : nom de la base de donnes utiliser ;
port : donne facultative indiquant le port TCP/IP utilis pour la connexion ;
unix_socket : donne facultative indiquant ladresse du socket unix pour la connexion locale.

A Savoir :
Pour travailler proprement, on cre un script de paramtrage et de connexion.

8.2.2

Erreurs de connexion

Les erreurs de connexion peuvent provenir de plusieurs facteurs :


Le pilote n'a pas t charg
La base de donnes n'a pas t trouve
Le login et mot de passe ne sont pas corrects.

Date d'dition :

20/02/2012

Page :

26 / 44

La classe PDO gre les exceptions et donc lvera automatiquement une exception.
Comme en JAVA, la structure de gestion des exceptions est :

Implmentation pour les erreurs de connexions :

8.3 Requtes et traitements


8.3.1

Requtes

Pour envoyer des requtes au serveur, on a deux mthodes de l'objet PDO :


Exec() utiliser pour les requtes INSERT, UPDATE, DELETE.
Cette mthode renvoie le nombre de lignes modifis.

Query() uiliser pour les requtes SELECT, SHOW, DESC, EXPLAIN.


Cette mthode renvoie un objet PDOStatement comprenant les rsultats de la
requte.

Date d'dition :

20/02/2012

Page :

27 / 44

Par Exemple :

8.3.2

Traitements

La mthode query() renvoi un objet de type PDOStatement.


Il faut donc utiliser sur le rsultat, des mthodes pour rcuprer les donnes :
fetch()

Permet d'accder aux rsultats squentiellement (on utilise while par exemple).

mixed PDOStatement::fetch ([ int $fetch_style [, int $cursor_orientation =


PDO::FETCH_ORI_NEXT [, int $cursor_offset = 0 ]]] )

fetchAll() retourne l'ensemble des donnes dans un tableau.


array PDOStatement::fetchAll ([ int $fetch_style [, mixed $fetch_argument [, array $c
tor_args = array() ]]] )

Dans ces mthodes, il est important de qualifier la faon dont on veut le retour des donnes grce
fetch_style qui contrle comment la prochaine ligne sera retourne l'appelant.
Tableau de l'attribut fetch_style (Il existe d'autres attributs cf doc) :
PDO::FETCH_ASSOC
PDO::FETCH_BOTH

PDO::FETCH_OBJ:

Date d'dition :

retourne un tableau index par le nom de la colonne comme retourn dans


le jeu de rsultats
(dfaut): retourne un tableau index par les noms de colonnes et aussi par
les numros de colonnes, commenant l'index 0, comme retourns dans
le jeu de rsultats
retourne un objet anonyme avec les noms de proprits qui correspondent
aux noms des colonnes retourns dans le jeu de rsultats

20/02/2012

Page :

28 / 44

Script :

Sortie :

A Savoir FetchAll vs Fetch


Lusage de fetchAll est souvent prfr fecth, si dans la plupart des cas cela ne pose pas de problme
cela peut avoir des incidences sur une requte ayant une lourde volumtrie car les tableaux en PHP ont
des limites (notamment lies la mmoire disponible).
Ex : rsultat
100 000 denreg pour 10 ko=> 1000 000 Ko =>900Mo on ne peut pas utiliser un tableau

Date d'dition :

20/02/2012

Page :

29 / 44

9 Template et Vue
9.1 Principe du Template

Dans le point 6.3 du document, jindique que pour grer la vue de la partie MVC, il existe deux
mthodologies dont lune est le Template de prsentation.
Le dveloppeur pourrait saffranchir de la partie reprsentation, il pourrait dvelopper la partie Modle,
passer le rsultat soit au contrleur soit la vue sans savoir comment les donnes vont tre affiches
(web, PDF, XML )
Le principe dun systme de Template est dans la sparation entre le contenu de linformation et la forme
de sa reprsentation.

Template de prsentation

Avantage
Clart dans le dveloppement
Facilit de dveloppement plusieurs
(dev, graphiste)
Productivit de dveloppement.

Inconvnient
Apprentissage du systme de
Template.
Si pas de gestionnaire de cache,
solution peu ralentir la cration des
pages web.

.tpl

.php

.php

Fichier de
prsentation

Script
Dexpression
rgulire.

Script de
donnes

.htm
Rsultat
de sortie

Date d'dition :

20/02/2012

Page :

30 / 44

9.2 Exemple fait maison :


On veut crer une page web affichant le rsultat dune requte nous retournant quun enregistrement.

9.2.1

Fichier de prsentation

Fichier Template :
Ce fichier comporte la page HTML avec des balises
que lon devra remplacer par les donnes
provenant du rsultat dun script PHP.
On voit bien ici, que lon peut donner cette page
crer un webdesigner. Il ny a pas de
programmation.

9.2.2

Script de donnes

On utilisera la requte du script de la page 28.


$req= "select * from user limit 0,1";

9.2.3

Moteur du Template

Le but est d'analyser le fichier de Template et remplacer les balises par les donnes en provenance du
script de donnes.
On peut utiliser plusieurs mthodes pour arriver ce but :
Crer des tableaux : array(valeur_chercher) , array(valeur_remplacement) et matcher
On peut utiliser des gestionnaires de chaines.
On peut utiliser le remplacement via des fonctions d'expressions rgulires

Pour l'exemple, on va utiliser les fonctions d'expressions rgulires.


Date d'dition :

20/02/2012

Page :

31 / 44

On n'utilise pas ce systme avec un site forte volumtrie.


9.2.4

Sortie HTML.

Au final :

Date d'dition :

20/02/2012

Page :

32 / 44

9.3 Smarty : Gestionnaire de Template


Smarty est un gestionnaire de Template professionnel.
http://www.smarty.net/
Quelques caractristiques de Smarty :
Il est efficace, le parser PHP s'occupe du sale travail.
Pas d'analyse de Template coteuse, une seule compilation.
Il sait recompiler uniquement les fichiers de Template qui ont t modifis.
Syntaxe des Templates configurable, vous pouvez utiliser {}, {{}}, <!--{}-->, etc. comme
dlimiteurs tag.
Les instructions if/elseif/else/endif sont passes au parser PHP.
Support de cache intgr.

Ce Template est OO.


Pour l'utiliser, on inclut le moteur de Template "setup_smarty", on cre un objet et on utilise un pseudo
langage pour les Templates.
Exemple de ce gestionnaire
Fichier de prsentation
header.tpl
Error.tpl

Date d'dition :

20/02/2012

Page :

33 / 44

Script d'usage :

10 Gestion des Erreurs


Lors d'un dveloppement professionnel, on doit apporter un soin particulier la gestion d'erreurs.
Une erreur est tout comportement inattendu par rapport ce que le dveloppeur voulait avoir.
Attention, on ne parle pas ici d'erreurs de conception.
On peut faire la distinction entre les erreurs lors du dveloppement et les erreurs lors de la production de
l'application.
Une erreur peut provenir :

Erreur de syntaxe.
Erreur de comportement.
Erreur de parcours.
Erreur du serveur ...

L'ide importante est de pouvoir reprer l'erreur, l'intercepter et/ou l'enregistrer. On veut un moyen pour
connaitre l'erreur afin d'y remdier (ce n'est pas toujours vident).

10.1 Gestion d'erreurs Kit de survie

Date d'dition :

20/02/2012

Page :

34 / 44

10.1.1 php.ini

Le moteur de PHP sait grer des erreurs mais encore faut-il qu'il soit bien paramtr.
Dans le fichier php.ini, on a une directive indiquant le niveau de remonte des erreurs par PHP.
Tableau niveaux d'erreurs
E_ALL

Toutes les erreurs et les warnings (E_ALL n'inclut pas


tous les niveaux d'alerte)
Erreur de syntaxe
Erreur critique
Suggestions de PHP pour assurer une meilleure
interoprabilit et compatibilit du code.
Notice pour les lments dprcis dans le futur

E_PARSE
E_ERROR
E_STRICT
E_DEPRECATED

Il existe plusieurs niveaux d'erreurs (+10) avec des combinaisons entre eux.
Les combinaisons sont crites simplement :
error_reporting= E_ALL & ~E_PARSE [on reporte les erreurs E_ALL et pas celles remontes par E_PARSE ]
error_reporting= E_ALL | E_STRICT [on reporte les erreurs remontes par E_ALL ou par E_STRICT ]
Si vous ne pouvez pas modifier le fichier.ini, vous pouvez utilisez en dbut de script la fonction :
error_reporting( E_ERROR | E_WARNING | E_PARSE);
La directive d'affichage
La directive display_errors (On/Off) permet d'afficher ou pas les erreurs.
La directive de log
La directive log_errors (On/Off) permet d'indiquer si on peut logger les erreurs.
La directive error_log = "c:/wamp/logs/php_error.log" indique o.
Logger les erreurs pour pouvoir les analyser et trs important notamment lorsqu'une application est en
production car on ne peut pas afficher les erreurs PHP aux utilisateurs.

Date d'dition :

20/02/2012

Page :

35 / 44

10.1.2 Dans vos script

Utiliser @ devant une fonction pour qu'elle n'affiche pas d'erreur ou warning condition que vous
griez l'erreur.
Tester les retours des fonctions. Vous pouvez utilisez If/Else mais rend le code illisible.
Utiliser la mthode 'OR'. Intressant pour substituer les If/Else
Dclencher une erreur avec trigger_error(); Trs Propre mais apprentissage.
Ex de script :

La fonction trigger_error () :
bool trigger_error ( string $error_msg [, int $error_type = E_USER_NOTICE ] )
Les erreurs que l'on peut indiquer sont de 3 types :
E_USER_ERROR
E_USER_WARNING
E_USER_NOTICE

= E_ERROR
Le script s'arrte
=E_WARNING Le script continue
=E_NOTICE
Le script continue

L'utilisation de la fonction die ou exit() n'est pas un systme de


gestion d'erreur.
Date d'dition :

20/02/2012

Page :

36 / 44

10.2 Les assertions


Les assertions sont des mcanismes pour tester la logique des donnes.
Ex : le dveloppeur veut s'assurer qu'un nombre d'adhrents ne peut tre ngatif.
Attention : Les assertions ne doivent pas tre utilises pour grer la logique de l'application.
La logique applicative est faite par des structures de contrle If/Else/Elseif
En rgle gnrale, les assertions sont utilises pendant le dveloppement et on doit pouvoir supprimer
toutes les assertions lors de la mise en production de l'application.
Pour utiliser les assertions, il faut les activer :
On peut aussi les activer dans php.ini via la directive assert.active.
Utilisation des assertions :
Ex : On a une application qui doit grer des prix. On rcupre les prix via une requte, un calcul, ou dans
un fichier par exemple. On sait que les prix des articles ne peuvent pas tre <= 0. On va utiliser une
assertion pour vrifier cela lors du dveloppement.

On peut dduire que la donne de prix rcupre n'est pas bonne, problme de requte, du calcul, de
lecture du fichier...
L'assertion est un moyen rapide et simple de tester des informations.
Astuce :
On peut dans mettre un commentaire dans le message d'assert(), ce qui permet de donner des
indications lors du dveloppement.
On peut aussi crer une fonction permettant de grer l'assertion avec
assert_options(ASSERT_CALLBACK,'nom_fct_gestion_assertion')
Date d'dition :

20/02/2012

Page :

37 / 44

10.3 Les Exceptions


10.3.1 Principe

On a vu plus haut l'usage de la leve d'exceptions lors d'une connexion la base de donnes, ce
mcanisme est trs utile, pour le dveloppeur car c'est lui qui dtermine les problmes qu'il veut
remonter.
Les Exceptions permettent la gestion logique de l'application.

Comme en JAVA, la structure de gestion des


exceptions est

Quand vous dveloppez, pensez lever (throw) et attraper (catch) les exceptions, autrement dit c'est au
dveloppeur de savoir ce qu'il estime tre une Exception.
PHP a par dfaut 2 classes pour les exceptions :
Classe Exception
Classe ErrorException extends Exception
Avec ces classes ont a des mthodes pour travailler sur l'exception leve :

getMessage()
getCode ()
getFile()
getLine()

Rcupre le message de l'exception


Rcupre le code de l'exception
Rcupre le fichier dans lequel l'exception est survenue
Rcupre la ligne dans laquelle l'exception est survenue

A Savoir :
Le moteur PHP ne lve pas d'exception pour ses erreurs.
Ainsi, si vous faites une erreur de syntaxe E_PARSE n'envoit pas d'exception mais une erreur
classique, c'est le cas pour tout les types d'erreurs PHP.

Date d'dition :

20/02/2012

Page :

38 / 44

10.3.2 Usage

Ex : On imagine une application de calcul de prix TTC partir du HT. On doit avoir un prix suprieur 0 au
niveau du prix HT sinon l'application n'a pas d'usage.
Script test_exception :

Affichage :

Ce qui est important c'est l'usage de throw qui lve


rellement l'exception.
On peut utiliser la fonction :
error_log ( string $message [, int $message_type =
0 [, string $destination [, string $extra_headers ]]] )
pour logger l'erreur ce qui est vivement conseill.

On peut crer sa propre classe d'exception en drivant d'une classe exception.


Cela peut tre utile notamment si vous dveloppez des applications qui travaillent avec des ressources
spcifiques (URL, Fichier, Base de donnes)
Cration d'une classe d'exception pour des ressources URL :

Date d'dition :

20/02/2012

Page :

39 / 44

11 Dveloppement et scurit
11.1 Les points cls
Pour une application web, le dveloppeur est en face d'au moins 4 problmatiques :

Disponibilit de l'application Le dveloppeur doit s'assurer de la monte en charge.


Intgrit des donnes Le dveloppeur est le garant des donnes.
Intgrit du site Le dveloppeur doit s'assurer du dtournement de l'application.
Scurit des donnes Le dveloppeur doit veiller la non divulgation des donnes.

La scurit est une proccupation du dveloppeur mais ne doit pas tre une obsession.

11.2 Tout le monde ment !


11.2.1 Ne fait pas confiance au utilisateur.

Vrifier que la donne est de la forme que vous attendez.


Pour la vrification, les expressions rgulires et la fonction preg_match() sont redoutables.
Exemple :
Dans un formulaire, on demande le nom d'une personne.
On peut veut vrifier que le nom soit forcement entre 3 et 10 caractres alphabtiques majuscule ou
minuscule.
Expression rgulire : /^[a-z]{3,10}$/i
Informations sur les expressions rgulires :
http://www.siteduzero.com/tutoriel-3-14608-les-expressions-regulieres-partie-1-2.html
http://www.expreg.com/presentation.php

La fonction preg_match($_REGEX,$_DONNEE) renvoit 0 si le REGEX n'a pas t trouv ou 1, on peut donc


l'utiliser pour valider des donnes.
Date d'dition :

20/02/2012

Page :

40 / 44

11.2.2 Injection SQL

L'injection SQL est un moyen de dtourner l'utilisation des requtes de l'application.


Pour faire de l'injection SQL, il faut connatre un minimum le langage SQL et PHP.
Ex : Dans de nombreuses applications, l'utilisateur doit s'authentifier pour accder son compte.
Une fois les donnes saisies, on lance une requte pour vrifier que la personne un compte et qu'il est
valide.
Page securite.htm

Page securite.php
On rcupre le login et le password et on
construit une requte SQL que l'on va
ensuite passer notre base de donnes.

Sortie SQL et rsultat :


Login =fred et le password jkjklj

C'est Normal. Mais imaginons que je suis mal intentionn, et que je veux passer.
Login =theronf'
Password ="vide"

Pourquoi, le systme m'authentifie ?


Mon injection SQL a fonctionne.
En SQL -- indique un commentaire, du coup la requte pour le systme a t :

Date d'dition :

20/02/2012

Page :

41 / 44

La requte crite par le dveloppeur n'a mme pas t jou.


Comment se prvenir de ce type de problme : Tout le monde ment ! Donc vrifier les donnes. (11.2.1)
Avec PDO, vous pouvez crer des requets prpares et utiliser la fonction PDO quote() pour grer les
problmes de SQL.
Sinon utiliser une fonction spcifique votre base de donnes :
pour MySql : mysql_real_escape_string()],
Pour PostGres : pg_escape_string
Ou utiliser addslashes(). Cette fonction n'est pas efficace sur tous les problmes d'injection SQL
Avec PDO :

A Savoir :
Il existe dans php.ini, une variable magic_quotes_gpc qui fixe le mode magic_quotes pour les oprations
GPC (Get/Post/Cookie). Lorsque magic_quotes est activ, tous les caractres ' (guillemets simples), "
(guillemets doubles), \ (antislash) et NUL sont chapps avec un antislash.
Avertissement : Cette fonctionnalit est OBSOLETE depuis PHP 5.3.0.

Date d'dition :

20/02/2012

Page :

42 / 44

11.2.3 Session Cookies et scurit.

Le protocole HTTP est dit "stateless", ou autrement dit sans tat. Pour un serveur, chaque requte qu'il
reoit est indpendante de la prcdente par consquent, il nous faut un mcanisme pour conserver les
donnes de l'utilisateur, pour ce faire on peut utiliser les sessions et/ou les cookies.
Cookies :
Un cookie est gnr et envoye par un serveur HTTP un client http qui le conserve (soit dans sa
mmoire, soit dans un fichier texte), et ce dernier le retourne lors de chaque interrogation du mme
serveur HTTP.
Gnrer un cookie :

Le cookie doit etre la premire chose cre dans une page php.
Lire un cookie :

Session :
La session est un mcanisme qui permet PHP de garder "en mmoire" du ct du serveur un nombre
illimit de valeurs entre plusieurs requtes d'un mme utilisateur. Une session est identifie par un Id
unique.
Crer une session :
Dans chaque page de l'application o on doit utiliser les sessions, il faut
appeler cette fonction qui initialise la session.

Affecter une valeur la session.

Du bon usage de la session et du cookie :


Ne pas utiliser les cookies pour l'authentification (mot de passe). Fichier texte
Stocker dans le cookie des informations non essentielles l'usage du site. Le cookie peut tre
supprim. ( ex : panier d'articles d'un site marchand)
Date d'dition :

20/02/2012

Page :

43 / 44

Lors de l'authentification dans la session, noter une information telle que l'adresse IP rend le vol de
sessions plus compliqu, condition de vrifier l'adresse IP dans le script.
Pour rendre le vol de session, plus compliqu encore lier des donnes de la session avec des
donnes du cookie et vrifier les deux donnes chaque script.
Utiliser des fonctions de cryptage pour des donnes sensibles. [md5(), mcrypt()]

11.2.4 Vrifier vos logs

Dans une application, les dveloppeurs ngligent souvent l'analyse des logs de production, c'est une
erreur.
Dans le fichier php.ini, on peut indiquer o sont les logs mais si on ne les analyse pas rgulirement, on se
prive d'informations importantes, mais il faut aussi analyser les logs du serveur web aussi qui donne de
bonnes informations.
Log d'accs Apache (Log automatique):

Log d'erreur Apache (Log automatique):

Log d'Erreur PHP (Log cr cf. 10.3.2) :

Date d'dition :

20/02/2012

Page :

44 / 44

Vous aimerez peut-être aussi