• Aucun résultat trouvé

8.3.1 Principe des Requêtes Préparées

L’idée des requêtes préparées est la suivante :

1. On indique à PDO la requête SQL, sauf que les valeurs (attributs des tables...) ne sont pas précisées (ce sont des ?).

2. Cela permet déjà à PDO d’analyser une fois pour toute la requête, même si on doit exécuter la requête plusieurs fois avec des valeurs différentes. C’est ce qu’on appelle préparer la requête. Cela améliore généralement l’efficacité, réduisant la charge du serveur et les délais d’exécution des requêtes.

3. Avant d’exécuter la requête préparée, ou au moment de l’exécution de la requête pré- parée, on spécifie les valeurs (attributs des tables...) qui viennent remplace les ? dans la requête. Ces valeurs, qui peuvent correspondre à des inputs utilisateur, sont automatiquement filtrée, évitant tout risque d’injection SQL.

Le mécanisme des requêtes préparées repose sur un lien effectué (avec la méthode bindParam) entre une variable PHP (donnée par sa référence), et une valeur non fixée (?) dans la requête. Il peut y avoir plusieurs syntaxes pour les requêtes préparées.

8.3.2 Syntaxe avec des Points d’Interrogation (?)

Voyons déjà un exemple d’insertion d’une adresse dans une table. L’adresse est saisie dans un formulaire :

Code Source 8.8 : /pdo/ex05-testFormAdresse.php

1 < !doctype html> 2 <html l a n g=” f r ”> 3 <head> 4 <meta c h a r s e t=”UTF−8” /> 5 <l i n k r e l=” s t y l e s h e e t ” h r e f=” . / mySt yl e . c s s ” /> 6 < t i t l e >S a i s i e d ’ une Adresse </ t i t l e > 7 </head> 8 <body> 9 <h1>S a i s i e d ’ une a d r e s s e </h1>

10 <form method=” p o s t ” a c t i o n=” ex07−re quetesP reparee s . php”>

11 <p>

12 <l a b e l fo r=”numeroRue”>Numé ro </ l a b e l >

13 <i n p u t type=” t e x t ” name=”numeroRue” i d=”numeroRue” s i z e=”4”/><br/> 14 </p>

15 <p>

16 <l a b e l fo r=” rue ”>P l a c e /Rue*</ l a b e l >

17 <i n p u t type=” t e x t ” name=” rue ” i d=” rue ” s i z e=” 30 ”/> 18 </p>

19 20 <p>

21 <l a b e l fo r=” complementAddr ”>Complé ment d ’ a d r e s s e </ l a b e l >

22 <i n p u t t y p e =” t e x t ” name=”complementAddr ” i d =”complementAddr ” s i z e =”30”/>< b r/>

23 </p> 24 <p> 25 < l a b e l f o r =” c o d e P o s t a l ”>Code p o s t a l *</ l a b e l > 26 <i n p u t t y p e =” t e x t ” name=” c o d e P o s t a l ” i d =” c o d e P o s t a l ” s i z e =”10”/>< b r/> 27 </p> 28 <p> 29 < l a b e l f o r =” v i l l e ”> V i l l e *</ l a b e l > 30 <i n p u t t y p e =” t e x t ” name=” v i l l e ” i d =” v i l l e ” s i z e =”10”/>< b r/> 31 </p> 32 <p>

33 <i n p u t t y p e =”s u b m i t ” v a l u e =”Envoyer ” c l a s s=”s a n s L a b e l”></i n p u t >

34 </p>

35 </form> 36 </body> 37 </html>

Les valeurs saisies par l’utilisateur seront récupérées du tableau $_POST dans un fichier PHP, qui sera inclus par un require juste avant d’exécuter la requête de type INSERT :

Code Source 8.9 : /pdo/ex06-retrieveInputPosts.php

1 < ?php

2 $numeroRue=” ” ;

3 i f ( i s s e t ($_POST [ ’ numeroRue ’ ] ) ) {

4 $numeroRue = f i l t e r _ v a r ($_POST [ ’ numeroRue ’ ] , FILTER_SANITIZE_STRING) ;

5 }

6 $ r u e=” ” ;

7 i f ( i s s e t ($_POST [ ’ rue ’ ] ) ) {

8 $ r u e = f i l t e r _ v a r ($_POST [ ’ rue ’ ] , FILTER_SANITIZE_STRING) ;

9 }

10 $complementAddr=” ” ;

11 i f ( i s s e t ($_POST [ ’ complementAddr ’ ] ) ) {

12 $complementAddr = f i l t e r _ v a r ($_POST [ ’ complementAddr ’ ] ,

FILTER_SANITIZE_ENCODED, FILTER_FLAG_ENCODE_LOW|FILTER_FLAG_ENCODE_HIGH) ; 13 } 14 $ c o d e P o s t a l=” ” ; 15 i f ( i s s e t ($_POST [ ’ c o d e P o s t a l ’ ] ) ) { 16 $ c o d e P o s t a l = f i l t e r _ v a r ($_POST [ ’ c o d e P o s t a l ’ ] , FILTER_SANITIZE_STRING) ; 17 } 18 $ v i l l e=” ” ; 19 i f ( i s s e t ($_POST [ ’ v i l l e ’ ] ) ) { 20 $ v i l l e = f i l t e r _ v a r ($_POST [ ’ v i l l e ’ ] , FILTER_SANITIZE_STRING) ; 21 }

22 $pays=” France ” ;

23 i f ( i s s e t ($_POST [ ’ pays ’ ] ) && $_POST [ ’ pays ’ ] != ” ” ) {

24 $pays = f i l t e r _ v a r ($_POST [ ’ pays ’ ] , FILTER_SANITIZE_STRING) ;

25 }

26 ?>

Voici enfin l’exemple qui effectue :

1. La préparation de la requête de type INSERT (avec des ”?” à la place des attributs de l’adresse) ;

2. Définit (avec bindValue) le lien entre les ”?” et des variables PHP ; 3. Exécute la requête (en effectuant les tests d’erreur).

Code Source 8.10 : /pdo/ex07-requetesPreparees.php

1 < ?php

2 // Connexion à l a b a s e de donn é e s

3 r e q u i r e _ o n c e ( dirname (__FILE__) . ’ / ex03−connectToDatabasePDO . php ’ ) ;

4 $ r e q u e t e = ’INSERT INTO web_Adresse ( i d A d r e s s e , idPersonne , ’

5 . ’ numeroRue , rue , complementAddr , c o d e P o s t a l , v i l l e , pays )

6 . ’VALUES ( ? , ? , ? , ? , ? , ? , ? , ?) ’ ;

7 // Pr é p a r a t i o n de l a r e q u ê t e ( cha î ne r e p r é s e n t a n t une r e q u ê t e SQL 8 // s a u f que l e s v a l e u r s à i n s é r e r dont d e s ?)

9 $ s t a t e m e n t = $dbh−>prepare ( $requete ) ;

10 // Test en s u p p o s a n t l e mode de g e s t i o n d ’ e r r e u r s PDO : :ERRMODE_SILENT

11 // ( sinon , en mode PDO : :ERRMODE_EXCEPTION i l f a u d r a i t u t i l i s e r t r y . . . c a t c h ) 12 i f ( $ s t a t e m e n t === f a l s e ) {

13 $ d a t a E r r o r [ ’ p r e p a r a t i o n−query ’ ] = ” Problème de pr é paration de l a requ ê t e . ”

14 . ” ( par exemple , l a s y n t a x e de l a r e q u ê t e e s t i n v a l i d e ” 15 . ” pour l e d r i v e r u t i l i s é . . . ) ” ;

16 } e l s e {

17 // L i a i s o n de v a r i a b l e s a v e c l e s ” ?” de l a r e q u ê t e pr é par é e : 18 // Le pr e m i e r paramètre de bindParam e s t i c i l e numé ro du ” ?”

19 // en commenç ant par 1 .

20 // Lors de l ’ ex é c u t i o n de l a r e q u ê t e , chaque ” ?” s e r a remplac é par 21 // l e contenu de l a v a r i a b l e c o r r e s p o n d a n t e .

22 $statement−>bindParam (1 , $idAdresse ) ;

23 $statement−>bindParam (2 , $idPersonne ) ;

24 $statement−>bindParam (3 , $numeroRue ) ;

25 $statement−>bindParam (4 , $rue ) ;

26 $statement−>bindParam (5 , $complementAddr ) ;

27 $statement−>bindParam (6 , $codePostal ) ;

28 $statement−>bindParam (7 , $ v i l l e ) ;

29 $statement−>bindParam (8 , $pays ) ; 30

31 // Ré cup é r a t i o n d e s donn é e s du f o r m u l a i r e s e t a f f e c t a t i o n d e s v a r i a b l e s 32 // $numeroRue , $rue , $complementAddr , $ c o d e P o s t a l , $ v i l l e , $pays

33 // à p a r t i r d e s donn é e s u t i l i s a t e u r ( t a b l e a u $_POST)

34 require ( dirname (__FILE__) . ’ / ex06−r e t r i e v e I n p u t P o s t s . php ’ ) ;

35

36 // Géné r a t i o n d ’ un $ i d d i f f i c i l e à d e v i n e r .

37 $ i d A d r e s s e = hash ( ” sha512 ” , $numeroRue . $ r u e . $complementAddr . $ c o d e P o s t a l . $ v i l l e . $pays ) ;

38 $ i d A d r e s s e = substr ( $ i d A d r e s s e , 0 , 1 0 ) ; // r e s p e c t de l a forme d e s ID (10 c h i f f r e s hexa )

39 $ i d P e r s o n n e = ” 69 a1666c6c ” ;

40 // Exé c u t i o n de l a r e q u ê t e . ( Tous l e s ” ?” de l a r e q u ê t e ont é t é l i é s à d e s v a r i a b l e s )

41 i f ( $statement−>execute ( ) === f a l s e ) {

42 $ d a t a E r r o r [ ” e x e c u t e−query ” ] = ” Problème d ’ ex é cution de l a requ ê t e . ”

43 . ” ( par exemple , une l i g n e a v e c c e t t e c l é p r i m a i r e $ i d A d r e s s e e x i s t e d

é j à . . . ) ” ;

44 }

45 }

46

47 // Appel de l a vue ( ou vue d ’ e r r e u r ) 48 i f ( !empty( $ d a t a E r r o r ) ) {

49 require ( ” v ue Err e u r . php ” ) ;

50 } e l s e { // Code de l a vue : 51 require ( ” vueNormale . php ” ) ;

52 }

53 // Fermeture de l a c o nnex i on ( co nnexion non p e r s i s t a n t e ) 54 $ s t a t e m e n t = n u l l ;

55 $dbh = n u l l ; 56 ?>

Voici un autre exemple de requête préparée, avec une requête de type SELECT. Code Source 8.11 : /pdo/ex08-testRequetesPrepareesSelect.php

1 < ?php

2 // Connexion à l a b a s e de donn é e s :

3 r e q u i r e _ o n c e ( dirname (__FILE__) . ’ / ex03−connectToDatabasePDO . php ’ ) ;

4

5 // Pr é p a r a t i o n de l a r e q u ê t e ( cha î ne r e p r é s e n t a n t une r e q u ê t e SQL 6 // s a u f que l e s v a l e u r s à i n s é r e r dont d e s ?

7 $ s t a t e m e n t = $dbh−>prepare ( ’SELECT * FROM web_Adresse WHERE codePostal = ? ’ ) ; 8

9 // Test en s u p p o s a n t l e mode de g e s t i o n d e s e r r e u r s PDO : :ERRMODE_SILENT 10 // ( sinon , en mode PDO : :ERRMODE_EXCEPTION i l f a u d r a i t u t i l i s e r t r y . . . c a t c h ) 11 i f ( $ s t a t e m e n t === f a l s e ) {

12 $ d a t a E r r o r [ ’ p r e p a r a t i o n−query ’ ] = ” Problème de pr é paration de l a requ ê t e . ”

13 . ” ( par exemple , l a s y n t a x e de l a r e q u ê t e e s t i n v a l i d e ” 14 . ” pour l e d r i v e r u t i l i s é . . . ) ” ;

15 } e l s e {

16 // L i a i s o n de l a v a r i a b l e $_GET[ ’ c o d e P o s t a l ’ ] a v e c l e ” ?” de l a r e q u ê t e : 17 // Le pr e m i e r paramètre de bindParam e s t i c i l e numé ro du ” ?” , à s a v o i r 1 18 $statement−>bindParam (1 , $_GET[ ’ codePostal ’ ] ) ;

19

20 // Test d ’ e r r e u r en s u p p o s a n t l e mode de g e s t i o n d e s e r r e u r s PDO : : ERRMODE_SILENT

21 // ( sinon , a v e c l e mode PDO : :ERRMODE_EXCEPTION i l f a u d r a i t u t i l i s e r a v e c t r y . . . c a t c h )

22 i f ( $statement−>execute ( ) === f a l s e ) { // Code de l a vue :

23 $ d a t a E r r o r [ ” e x e c u t e−query ” ] = ” Problème d ’ ex é cution de l a requ ê t e . ” ;

24 }

25 }

26 // Appel de l a vue ( ou vue d ’ e r r e u r ) 27 i f ( !empty( $ d a t a E r r o r ) ) {

29 } e l s e { // Code de l a vue :

30 require ( ” ex08−vueRequetesPrepareesSelect . php” ) ;

31 }

32 // Fermeture de l a c o nnex i on ( co nnexion non p e r s i s t a n t e ) 33 $ s t a t e m e n t = n u l l ;

34 $dbh = n u l l ; 35 ?>

Code Source 8.12 : /pdo/ex08-vueRequetesPrepareesSelect.php

1 < ?php

2 r e q u i r e _ o n c e ( ’ c l a s s e s / VueHtmlUtils . php ’ ) ;

3 echo CoursPHP\Vue\ VueHtmlUtils : :enTeteHTML5 ( ”Requ ê t e s Pr é par é e s ” ,

4 ’UTF−8 ’ , ’ myStyle . c ss ’ ) ;

5 echo ”<h1>Requ ê t e s Pr é par é e s ( 2 ) ( Donnez un Code P o s t a l )</h1>” ;

6 // A f f i c h a g e d e s r é s u l t a t s de l a r e q u ê t e 7 foreach ( $ s t a t e m e n t a s $row ) {

8 echo ”<p>” ;

9 echo $row [ ’ numeroRue ’ ] . ” , ” . $row [ ’ rue ’ ] . ” , ” ;

10 i f ( !empty( $row [ ’ complementAddr ’ ] ) )

11 echo $row [ ’ complementAddr ’ ] . ” , ” ;

12 echo $row [ ’ c o d e P o s t a l ’ ] . ” ” ;

13 echo $row [ ’ v i l l e ’ ] . ” ” ;

14 echo $row [ ’ pays ’ ] ;

15 echo ”</p>” ;

16 }

17 echo CoursPHP\Vue\ VueHtmlUtils : :finFichierHTML5 ( ) ;

18 ?>

8.3.3 Syntaxe avec des :name

Un autre syntaxe consiste à donner des noms aux variables à substituer, au lieu des points d’interrogation ”?” qui sont anonymes. La syntaxe avec les ”?” repose sur l’ordre des variables dans un tableau indexé, et il y a plus de risque de se mélanger les pinceaux. Dans la syntaxe avec des :name, chaque :quelqueChose dans la requête devra être liée (avec bindParam) à une variable (ou élément de tableau).

Code Source 8.13 : /pdo/ex09-testRequetesPrepareesV2.php

1 < ?php

2 // Connexion à l a b a s e de donn é e s

3 r e q u i r e _ o n c e ( dirname (__FILE__) . ’ / ex03−connectToDatabasePDO . php ’ ) ;

4

5 // Pr é p a r a t i o n de l a r e q u ê t e ( cha î ne r e p r é s e n t a n t une r e q u ê t e SQL 6 // s a u f que l e s v a l e u r s à i n s é r e r dont d e s ?)

7 $ s t a t e m e n t = $dbh−>prepare ( ’REPLACE INTO web_Adresse ( idAdresse , idPersonne , ’ 8 . ’ numeroRue , rue , complementAddr , c o d e P o s t a l , v i l l e ,

pays ) ’

9 . ’VALUES ( : i d A d r e s s e , :idPersonne , :numeroRue , :rue ,

10 . ’ :complementAddr , :c o d e P o s t a l , : v i l l e , :pays ) ’

11 ) ;

12

13 // Test en s u p p o s a n t l e mode de g e s t i o n d ’ e r r e u r s PDO : :ERRMODE_SILENT

15 i f ( $ s t a t e m e n t === f a l s e ) {

16 $ d a t a E r r o r [ ’ p r e p a r a t i o n−query ’ ] = ” Problème de pr é paration de l a requ ê t e . ”

17 . ” ( par exemple , l a s y n t a x e de l a r e q u ê t e e s t i n v a l i d e ” 18 . ” pour l e d r i v e r u t i l i s é . . . ) ” ; 19 } e l s e { 20 // Cré a t i o n d ’ un t a b l e a u a s s o c i a t i f a v e c l e s v a l e u r s : 21 $i n pu t A rr a y = array ( 22 ” i d A d r e s s e ” => ” 0123456788 ” , 23 ” i d P e r s o n n e ” => ” 69 a1666c6c ” , 24 ”numeroRue” => ”2 b i s ” ,

25 ” rue ” => ”Rue de l a Paix ” ,

26 ” complementAddr ” => ”Ré s i d . \” Les F l o t s \” ” ,

27 ” c o d e P o s t a l ” => ” 63000 ” ,

28 ” v i l l e ” => ” Clermont−Ferrand ” , 29 ” pays ” => ” France ” ) ;

30 // L i a i s o n de v a r i a b l e s ” : q u e l q u e C h o s e ” de l a r e q u ê t e pr é par é e :

31 // Lors de l ’ ex é c u t i o n de l a r e q u ê t e , chaque ” : q u e l q u e C h o s e ” s e r a remplac é par

32 // l e contenu de l a v a r i a b l e c o r r e s p o n d a n t e $ i n p u t A r r a y [ ” q u e l q u e C h o s e ” ] . 33 $statement−>bindParam ( ” :idAdresse ” , $inputArray [ ” idAdresse ” ] ) ;

34 $statement−>bindParam ( ” :idPersonne ” , $inputArray [ ” idPersonne ” ] ) ;

35 $statement−>bindParam ( ” :numeroRue” , $inputArray [ ”numeroRue” ] ) ;

36 $statement−>bindParam ( ” :rue ” , $inputArray [ ” rue ” ] ) ;

37 $statement−>bindParam ( ” :complementAddr” , $inputArray [ ”complementAddr” ] ) ;

38 $statement−>bindParam ( ” :codePostal ” , $inputArray [ ” codePostal ” ] ) ;

39 $statement−>bindParam ( ” : v i l l e ” , $inputArray [ ” v i l l e ” ] ) ;

40 $statement−>bindParam ( ” :pays ” , $inputArray [ ” pays ” ] ) ;

41

42 // Exé c u t i o n de l a r e q u ê t e .

43 // ( Tous l e s ” : q u e l q u e C h o s e ” de l a r e q u ê t e ont é t é l i é s à d e s v a r i a b l e s ) 44 i f ( $statement−>execute ( ) === f a l s e ) {

45 $ d a t a E r r o r [ ” e x e c u t e−query ” ] = ” Problème d ’ ex é cution de l a requ ê t e . ”

46 . ” ( par exemple , une l i g n e a v e c c e t t e c l é p r i m a i r e ” 47 . $ i n p u t A rr a y [ ” i d A d r e s s e ” ] . ” e x i s t e d é j à . . . ) ” ;

48 }

49 }

50 // Appel de l a vue ( ou vue d ’ e r r e u r ) 51 i f ( !empty( $ d a t a E r r o r ) ) {

52 require ( ” v u e E r r e u r . php ” ) ;

53 } e l s e { // Code de l a vue : 54 require ( ” vueNormale . php ” ) ;

55 }

56 // Fermeture de l a c o nnex i on ( co nnexion non p e r s i s t a n t e ) 57 $ s t a t e m e n t = n u l l ;

58 $dbh = n u l l ; 59 ?>

L’un des avantages de la syntaxe avec des :name est de permettre une automatisation aisée de la préparation et de l’exécution de la requête à partir d’un tableau associatif contenant les valeurs. Dans l’exemple suivant le tableau associatif contient les attributs d’une Adresse. On pourrait aussi lier et exécuter automatiquement la requête à partir d’un tableau $_REQUEST directement issu d’un formulaire.

Code Source 8.14 : /pdo/ex10-testRequetesPrepareesV3.php

1 < ?php

3 r e q u i r e _ o n c e ( dirname (__FILE__) . ’ / ex03−connectToDatabasePDO . php ’ ) ;

4

5 // La r e q u ê t e à pr é p a r e r a v e c d e s ” : q u e l q u e C h o s e ” à l a p l a c e d e s v a l e u r s 6 $ r e q u e t e = ’REPLACE INTO web_Adresse ( i d A d r e s s e , idPersonne , ’

7 . ’ numeroRue , rue , complementAddr , c o d e P o s t a l , v i l l e ,

pays ) ’

8 . ’VALUES ( : i d A d r e s s e , :idPersonne , :numeroRue , :rue ,

9 . ’ :complementAddr , :c o d e P o s t a l , : v i l l e , :pays ) ’ ; 10 11 // Pr é p a r a t i o n de l a r e q u ê t e ( cha î ne r e p r é s e n t a n t une r e q u ê t e SQL 12 // s a u f que l e s v a l e u r s à i n s é r e r dont d e s ?) 13 $ s t a t e m e n t = $dbh−>prepare ( $requete ) ; 14

15 // Test en s u p p o s a n t l e mode de g e s t i o n d ’ e r r e u r s PDO : :ERRMODE_SILENT

16 // ( sinon , en mode PDO : :ERRMODE_EXCEPTION i l f a u d r a i t u t i l i s e r t r y . . . c a t c h ) 17 i f ( $ s t a t e m e n t === f a l s e ) {

18 $ d a t a E r r o r [ ’ p r e p a r a t i o n−query ’ ] = ” Problème de pr é paration de l a requ ê t e . ” ;

19 } e l s e {

20 // Cré a t i o n d ’ un t a b l e a u a s s o c i a t i f a v e c l e s v a l e u r s : 21 $i nput A rra y = array (

22 ” i d A d r e s s e ” => ” 9876543211 ” ,

23 ” i d P e r s o n n e ” => ” 69 a1666c6c ” ,

24 ”numeroRue” => ”2 Ter ” ,

25 ” rue ” => ”Rue de l a Sé r é n i t é ” ,

26 ” complementAddr ” => ”Compl é ment u t i l e ” ,

27 ” c o d e P o s t a l ” => ” 63001 ” ,

28 ” v i l l e ” => ” Clermont−Ferrand ” ,

29 ” pays ” => ” France ” ) ;

30 // L i a i s o n de v a r i a b l e s ” : q u e l q u e C h o s e ” de l a r e q u ê t e pr é par é e :

31 // Lors de l ’ ex é c u t i o n de l a r e q u ê t e , chaque ” : q u e l q u e C h o s e ” s e r a remplac é par

32 // l e contenu de l a v a r i a b l e c o r r e s p o n d a n t e $ i n p u t A r r a y [ ” q u e l q u e C h o s e ” ] . 33

34 // 1) On r e c h e r c h e dans l a r e q u e t e l e s cha î nes de l a forme ” : q u e l q u e C h o s e ” 35 preg_match_all ( ” /\ :[ a−zA−Z ] [ a−zA−Z0−9]+/” , $requete ,

36 $ k e y C o l l e c t i o n , PREG_PATTERN_ORDER) ;

37 // On p a r c o u r s l e s arguments de l a r e q u ê t e 38 foreach ( $ k e y C o l l e c t i o n [ 0 ] a s $key ) {

39 $ a s s o c i a t i v e K e y = substr ( $key , 1 ) ; // c l é dans l e t a b l e a u $ a r g s 40 $statement−>bindParam ( $key , $inputArray [ $ a s s o c i a t i v e K e y ] ) ;

41 }

42

43 // Exé c u t i o n de l a r e q u ê t e .

44 // ( Tous l e s ” : q u e l q u e C h o s e ” de l a r e q u ê t e ont é t é l i é s à d e s v a r i a b l e s ) 45 i f ( $statement−>execute ( ) === f a l s e ) {

46 $ d a t a E r r o r [ ” e x e c u t e−query ” ] = ” Problème d ’ ex é cution de l a requ ê t e . ”

47 . ” ( par exemple , une l i g n e a v e c c e t t e c l é p r i m a i r e ” . 48 $i n p u t A rr a y [ ’ i d A d r e s s e ’ ] . ” e x i s t e d é j à . . . ) ” ;

49 }

50 }

51 // Appel de l a vue ( ou vue d ’ e r r e u r ) 52 i f ( !empty( $ d a t a E r r o r ) ) {

53 require ( ” v ue Err e u r . php ” ) ;

54 } e l s e { // Code de l a vue : 55 require ( ” vueNormale . php ” ) ;

56 }

57 // Fermeture de l a c o nnex i on ( co nnexion non p e r s i s t a n t e ) 58 $ s t a t e m e n t = n u l l ;

59 $dbh = n u l l ; 60 ?>

Couche d’Accès aux données (DAL)

9.1 Diagrammes de Conception

Data Access Layer et pkg Auth

Persistance Metier

Auth

AdresseFabrique

+ getValidInstance(out dataError : string 0..*, inputArray : array&, policy : const int) : Adresse + validateInstance(out dataError : string 0..*,

inOut adresse : Adresse) : void

«Singleton»

DataBaseManager

- instance : DataBaseManager

+ getInstance() : DataBaseManager {throws Exception} + prepareAndExecuteQuery(requete : string, args : array&=null

) : array()|boolean {throws Exception} + prepareAndExecuteQueryAssoc(requete : string, args : array&=null

) : array()|boolean {throws Exception}

- getAuthData(Out db_host, Out db_name, Out db_user, Out db_password) : void - DataBaseManager() {throws Exception}

«POPO»

Adresse AdresseGateway

+ getAdresseById(inOut dataError : string 0..*,

idAdresse : string) : Adresse {throws Exception}

+ getAdresseAll(inOut dataError : string 0..*) : Adresse 0..* {throws Exception} + createAdresse(Out dataError : string 0..*,

inputArray : array&) : Adresse {throws Exception} + updateAdresse(Out dataError : string 0..*,

inputArray : array&) : Adresse {throws Exception} + deleteAdresse(inOut dataError : string 0..*

idAdresse : string) : Adresse {throws Exception}

SessionUtils

+ createSession(email : string, role : string=”visitor”) : void + generateSessionId() : string

AuthUtils

+ isStrongPassword(wouldBePassword : string) : boolean

PDO PDOStatement uses uses uses dbh 1 uses uses