• Aucun résultat trouvé

Initiation à PDO : connexion, query, destruction

L’extension du langage PHP appelée PHP Data Objects fournit une couche d’abstraction pour accéder à des données, à l’aide de différents drivers. Comme exemples de drivers, on peut citer

MySQL, Oracle, SQLite, PostgreSQL, MS SQL Sever, etc.

L’intérêt de PDO est de permettre d’utiliser tous ces drivers, qui accèdent à des bases de données différentes, avec les mêmes fonction : les méthodes de PDO.

8.2.1 Établir la Connexion à une Base de Données

La connexion à la base de données se fait avec le nom du driver (ici mysql), le nom d’hôte, le nom de la base de données, le nom d’utilisateur ayant les droits sur la base de données, et son mot de passe.

Une éventuelle exception issue du constructeur de PDO doit absolument être gérée avec try...catch (ou avec un handler), car sinon le message de l’exception s’affiche, révélant le nom et le mot de passe de l’utilisateur ayant les droits sur la base.

Code Source 8.1 : /pdo/ex01-testConnexionPDO.php (cf. Fig 8.6)

1 < ?php 2 $mySqlUser = ”remy” ; 3 $mySqlPassword = ” my_password ” ; 4 $dataBase = ” ExempleCompositionBD ” ; 5 6 $ d a t a E r r o r = array ( ) ; 7

Figure 8.6 : Illustration du code source 8.1

8 // ON DOIT ABSOLUMENT GÉRER CETTE EXCEPTION, FAUTE DE QUOI

9 // L ’UTILISATEUR DE LA BASE DE DONNÉES ET LE MOT DE PASSE

10 // APPARAÎSSENT EN CLAIR ! ! ! !

11 t r y {

12 // Cré a t i o n de l ’ i n s t a n c e de PDO ( d a t a b a s e h a n d l e r ) .

13 $dbh = new PDO( ’ mysql :h o s t=l o c a l h o s t ; dbname= ’ . $dataBase , $mySqlUser ,

14 $mySqlPassword ) ;

15 } c a t c h ( PDOException $e ) {

16 $ d a t a E r r o r [ ” c o n ne xi on ” ] = ” Erreur de c onn e x i o n à l a b a s e de donn é e s . ” 17 . ”Vous n ’ a v e z pas b e s o i n d ’ en s a v o i r p l u s . . . ” ; 18 require ( ” v u e E r r e u r . php ” ) ;

19 die ( ) ;

20 }

21 // Requ ê t e : cha î ne de c a r a c t è r e s c o n t e n a n t une r e q u ê t e v a l i d e en SQL 22 $ r e q u e t e = ’SELECT * from web_Adresse ’ ;

23 24 // Exé c u t i o n de l a r e q u ê t e e t mé m o r i s a t i o n du r é s u l t a t : 25 $ r e s u l t E x e c = $dbh−>exec ( $requete ) ; 26 27 i f ( $ r e s u l t E x e c === f a l s e ) { 28 $ d a t a E r r o r [ ” r e q u e t e ” ] = ” Problème d ’ ex é c u t i o n de l a r e q u ê t e . ” 29 . ” ( par exemple , un nom de champs e s t i n c o r r e c t , ”

30 . ” ou e n c o r e l a r e q u ê t e n ’ e s t pas v a l i d e s u r l a b a s e . . . ) ” ; 31 require ( ” v u e E r r e u r . php ” ) ;

32 } e l s e {

33 // Code de l a vue :

34 require ( ’ ex01−vueConnexionPDO . php ’ ) ;

35 }

36 // Fermeture de l a c o nnex i on ( co nnexion non p e r s i s t a n t e ) 37 $ r e s u l t E x e c = n u l l ;

38 $dbh = n u l l ; 39 ?>

Code Source 8.2 : /pdo/ex01-vueConnexionPDO.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 ( ”Ma Première Connexion PDO” ,

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

5 echo ”<h1>I n i t i e r une Connexion <i >PDO</i ></h1>” ;

6 echo ”La r e q u ê t e a b i e n é t é ex é c u t é e . . . ” ;

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

Figure 8.7 : Illustration du code source 8.3

Code Source 8.3 : /pdo/vueErreur.php (cf. Fig 8.7)

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 ( ” Erreur BD” , ’UTF−8 ’ ,

4 ’ m y S t y l e . c s s ’ ) ;

5 echo ”<h1>Une e r r e u r s ’ e s t p r o d u i t e </h1>” ;

6 foreach ( $ d a t a E r r o r a s $errorMsg ) {

7 echo ”<p>” . $errorMsg . ”</p>” ;

8 }

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

10 ?>

Voici un exemple où l’exception générée par le constructeur de PDO n’est pas gérée. Les données d’authentification pour l’accès à la base de données apparaîssent en clair chez le client.

Figure 8.8 : Illustration du code source 8.4

Code Source 8.4 : /pdo/ex02-withNoTryCatchLeakProblem.php (cf. Fig 8.8)

1 < ?php

2 $mySqlUser = ”remy” ;

3 $mySqlPassword = ” my_password ” ;

4 $dataBase = ” ExampleMisSpelledDataBase ” ; 5

6 $dbh = new PDO( ’ mysql :h o s t=l o c a l h o s t ; dbname= ’ . $dataBase , $mySqlUser ,

7 $mySqlPassword ) ;

8

9 $ r e q u e t e = ’INSERT INTO web_Adresse ( id , numeroRue , rue , complementAddr , ’ 10 . ’ c o d e P o s t a l , v i l l e , pays ) ’

11 . ’VALUES (”0 f d a 5 a 8 0 a ” , ”11” , ” A l l é e d e s P i e s Jaunes ” , ’ 12 . ’ ”Bâ t i m e n t 2D” , ”63000” , ” Clermont−Ferrand ” , ” France ”) ’ ;

13 $dbh−>query ( $requete ) ;

14

15 // Code de l a vue :

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

17 echo CoursPHP\Vue\ VueHtmlUtils : :enTeteHTML5 ( ”Ma Première Connexion PDO” ,

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

19 // Code de l a vue :

20 foreach ( $dbh−>query ( ’SELECT * from Adresse ’ ) as $row ) {

21 print_r ( $row ) ;

22 }

23 $dbh = n u l l ;

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

25 ?>

Dans les exemples des deux parties suivantes, nous incluerons (par un require) le fichier suivant qui réalisera la connexion à la base de données :

Code Source 8.5 : /pdo/ex03-connectToDatabasePDO.php

1 < ?php

2 $mySqlUser = ”remy” ;

3 $mySqlPassword = ” my_password ” ; 4 $dataBase = ” ExempleCompositionBD ” ; 5

6 // ON DOIT ABSOLUMENT GÉRER CETTE EXCEPTION, FAUTE DE QUOI

7 // L ’UTILISATEUR DE LA BASE DE DONNÉES ET LE MOT DE PASSE

8 // APPARAÎSSENT EN CLAIR ! ! ! ! 9 t r y {

10 // Cré a t i o n de l ’ i n s t a n c e de PDO ( d a t a b a s e h a n d l e r ) .

11 $dbh = new PDO( ’ mysql :h o s t=l o c a l h o s t ; dbname= ’ . $dataBase , $mySqlUser , $mySqlPassword ) ;

12 } c a t c h ( PDOException $e ) {

13 $ d a t a E r r o r [ ’ connexion−bd ’ ] = ” Erreur de connexion à l a base de donné es . ” 14 . ”Vous n ’ a v e z pas b e s o i n d ’ en s a v o i r p l u s . . . ” ;

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

16 }

17 ?>

8.2.2 Parcourir les Résultats d’une Requête

Voici un exemple qui récupère les lignes des résultats d’une requête (de type SELECT) sous une forme associative. Les clés du tableau associatif, pour chaque ligne, sont les noms de colonnes du résultat de la requête.

Code Source 8.6 : /pdo/ex03-testQueryForeachModeAssoc.php (cf. Fig 8.9)

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 // S t o c k a g e d e s donn é e s r é s u l t a t de l a r e q u ê t e dans une v a r i a b l e 6 // De t y p e PDOStatement

7 $ s t a t e m e n t = $dbh−>query ( ’SELECT * from web_Adresse ’ ) ;

Figure 8.9 : Illustration du code source 8.6

9 $statement−>setFetchMode (PDO : :FETCH_ASSOC) ;

10

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

12 echo CoursPHP\Vue\ VueHtmlUtils : :enTeteHTML5 ( ” P a r c o u r i r l e s Ré s u l t a t s ” ,

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

14 echo ”<h1>P a r c o u r i r l e s Ré s u l t a t s d ’ une Requ ê t e </h1>” ;

15

16 echo ”<p>Le r é s u l t a t de l a r e q u ê t e a ” . $statement−>columnCount ( ) . ” colonnes .</ p>” ;

17

18 echo ”<p>” ;

19 echo ”<s t r o n g >U t i l i s a t i o n comme t a b l e a u a s s o c i a t i f :</s t r o n g >” ;

20 echo ”</p>” ;

21 foreach ( $ s t a t e m e n t a s $row ) {

22 echo ”<p>” ;

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

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

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

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

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

28 echo $row [ ’ pays ’ ] ;

29 echo ”</p>” ;

30 }

31

32 // Connexion non p e r s i s t a n t e : on ferme l a co n ne x i o n

33 // i l f a u t d é t r u i r e t o u s l e s o b j e c t s l i é s à l a co n ne xi o n SANS EN OUBLIER 34 // ( en l e s m e t t a n t à n u l l , pour que l a co n ne x i o n s e ferme ) .

35 $ s t a t e m e n t = n u l l ; 36 $dbh = n u l l ;

37

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

39 ?>

une forme soit associative, soit numérique. Les clés du tableau associatif, pour chaque ligne, sont les noms de colonnes du résultat de la requête. Les clés du tableau numérique, pour chaque ligne, sont les numéros de colonnes du résultat de la requête (commençant à 0).

Figure 8.10 : Illustration du code source 8.7

Code Source 8.7 : /pdo/ex04-testFetchAll-FetchModeBoth.php (cf. Fig 8.10)

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 // S t o c k a g e d e s donn é e s r é s u l t a t de l a r e q u ê t e dans une v a r i a b l e 6 // De t y p e PDOStatement

7 $ s t a t e m e n t = $dbh−>query ( ’SELECT * from web_Adresse ’ ) ;

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

9 $ d a t a E r r o r [ ” q u e r y ” ] = ” Problème d ’ ex é c u t i o n de l a r e q u ê t e . ”

10 . ” ( par exemple , l a con ne xi on n ’ e s t pas o u v e r t e ou l a t a b l e n ’ e x i s t e

pas . . . ) ” ;

11 die ( ) ;

12 }

13

14 $statement−>setFetchMode (PDO : :FETCH_BOTH) ;

15

17 // dans un grand t a b l e a u .

18 // Ça p e u t u t i l i s e r beaucoup de mé moire s ’ i l y a beaucoup de l i g n e s . . . 19 $ t a b R e s u l t a t s = $statement−>f e t c h A l l ( ) ;

20

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

22 echo CoursPHP\Vue\ VueHtmlUtils : :enTeteHTML5 ( ” P a r c o u r i r l e s Ré s u l t a t s d ’ une

Requ ê t e ” , ’UTF−8 ’ , ’ myStyle . c s s ’ ) ;

23 echo ”<h1>P a r c o u r i r l e s Ré s u l t a t s d ’ une Requ ê t e ( 2 )</h1>” ;

24 echo ”<p>” ;

25 echo ”<s t r o n g >A f f i c h a g e b r u t de chaque l i g n e </s t r o n g >” ;

26 echo ”</p>” ; 27 28 foreach ( $ t a b R e s u l t a t s a s $row ) { 29 echo ”<p>” ; 30 print_r ( $row ) . ”<b r/><b r/>” ; 31 echo ”</p>” ; 32 } 33 34 echo ”<p>” ;

35 echo ”<s t r o n g >U t i l i s a t i o n comme t a b l e a u a s s o c i a t i f :</s t r o n g >” ;

36 echo ”</p>” ;

37 foreach ( $ t a b R e s u l t a t s a s $row ) {

38 echo ”<p>” ;

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

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

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

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

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

44 echo $row [ ’ pays ’ ] ;

45 echo ”</p>” ;

46 }

47 echo ”</p>” ;

48

49 echo ”<p>” ;

50 echo ”<s t r o n g >U t i l i s a t i o n comme t a b l e a u numé r i q u e :</s t r o n g >” ;

51 echo ”</p>” ;

52 foreach ( $ t a b R e s u l t a t s a s $row ) {

53 echo ”<p>(” ;

54 f o r ( $ i = 1 ; $ i < $statement−>columnCount ( ) ; $ i++){

55 i f ( $ i >1){ 56 echo ” , ” ; 57 } 58 echo $row [ $ i ] ; 59 } 60 echo ” )</p>” ; 61 }

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

63

64 // Connexion non p e r s i s t a n t e : on ferme l a co n ne x i o n

65 // i l f a u t d é t r u i r e t o u s l e s o b j e c t s l i é s à l a co n ne xi o n SANS EN OUBLIER 66 // ( en l e s m e t t a n t à n u l l , pour que l a co n ne x i o n de ferme .

67 $ s t a t e m e n t = n u l l ; 68 $dbh = n u l l ;

69 ?>

requête) et fetchAll (renvoie toutes les lignes des résultats d’une requête) ont des options sur la structure des données retournées. Une liste (non exaustive !!!) de ces options est :

• PDO :: FETCH_ASSOC : lignes sous forme d’un tableau associatif indexé par le nom de la

colonne ;

• PDO :: FETCH_BOTH : lignes sous forme d’un tableau à la fois associatif indexé par le nom

de la colonne et numérique indexé par le numéro de la colonne ;

• PDO :: FETCH_OBJ : lignes sous la forme d’objets anonymes dont les propriétés sont les

noms de la colonne ;