Récupérer les données



Dans un premier temps, nous allons apprendre à lire des informations dans la base de données, puis nous verrons dans le chapitre suivant comment ajouter et modifier des données.

Pour travailler ici, il nous faut une base de données « toute prête » qui va nous servir de support. Je vous invite à télécharger la table que j'ai créée pour vous :

Télécharger la table

lien2



Rien qu'au nom, vous pouvez vous douter que cette table contient quelque chose en rapport avec des jeux vidéo. En effet, vous allez le voir, cette table contient une liste d'une cinquantaine de jeux.

Pour cet exemple, plusieurs amis ont voulu répertorier tous les jeux vidéo qu'ils possèdent. La base de données est pour eux un moyen très pratique de classer et d'organiser tout cela ; vous allez voir pourquoi.

Euh dis, qu'est-ce que je dois en faire de ce fichier jeux_video.sql ?



Inutile d'essayer de l'ouvrir, ça n'a pas d'intérêt. Il faut l'importer via l'onglet « Importer » de phpMyAdmin. Nous avons appris à le faire dans le chapitre précédent. Pensez à sélectionner votre base de données test au préalable.

Et voilà ! Vous devriez voir une nouvelle table apparaître à gauche : jeux_video (figure suivante). Vous pouvez vous amuser à regarder ce qu'elle contient, pour vous faire une idée.

La table jeux_video apparaît maintenant dans phpMyAdmin



Voici les cinq premières entrées qu'elle contient (il y en a une cinquantaine en tout !) :

ID

nom

possesseur

console

prix

nbre_joueurs_max

commentaires

1

Super Mario Bros

Florent

NES

4

1

Un jeu d'anthologie !

2

Sonic

Patrick

Megadrive

2

1

Pour moi, le meilleur jeu au monde !

3

Zelda : ocarina of time

Florent

Nintendo 64

15

1

Un jeu grand, beau et complet comme on en voit rarement de nos jours

4

Mario Kart 64

Florent

Nintendo 64

25

4

Un excellent jeu de kart !

5

Super Smash Bros Melee

Michel

GameCube

55

4

Un jeu de baston délirant !



Pour le moment, ne modifiez pas cette table. Notre objectif est de créer une page PHP qui va afficher ce que contient la table jeux_video.


Faire une requête



Maintenant arrive le grand moment que vous attendiez tous : on va parler à MySQL. Nous allons donc commencer à parler en SQL ! Pour cela, on va faire ce qu'on appelle une requête. On va demander poliment à MySQL de nous dire tout ce que contient la table jeux_video.

Pour récupérer des informations de la base de données, nous avons besoin de notre objet représentant la connexion à la base. Vous vous souvenez, il s'agit de $bdd. Nous allons effectuer la requête comme ceci :

Code : PHP 

1

$reponse = $bdd->query('Tapez votre requête SQL ici');



On demande ainsi à effectuer une requête sur la base de données.

query en anglais signifie « requête ».



On récupère ce que la base de données nous a renvoyé dans un autre objet que l'on a appelé ici $reponse.


Votre première requête SQL



Comme je vous l'ai dit, le SQL est un langage. C'est lui qui nous permet de communiquer avec MySQL.

Voici la première requête SQL que nous allons utiliser :

Code : PHP

1

SELECT * FROM jeux_video



Cela peut se traduire par : « Prendre tout ce qu'il y a dans la table jeux_video ».
Analysons chaque terme de cette requête.

  • SELECT : en langage SQL, le premier mot indique quel type d'opération doit effectuer MySQL. Dans ce chapitre, nous ne verrons que SELECT. Ce mot-clé demande à MySQL d'afficher ce que contient une table.
  • * : après le SELECT, on doit indiquer quels champs MySQL doit récupérer dans la table. Si on n'est intéressé que par les champs « nom » et « possesseur », il faudra taper :
    SELECT nom, possesseur FROM jeux_video

    Si vous voulez prendre tous les champs, tapez *. Cette petite étoile peut se traduire par « tout » : « Prendre tout ce qu'il y a… ».
  • FROM : c'est un mot de liaison qui se traduit par « dans ». FROM fait la liaison entre le nom des champs et le nom de la table.
  • jeux_video : c'est le nom de la table dans laquelle il faut aller piocher.

Effectuons la requête avec la méthode que l'on vient de découvrir :

Code : PHP 

1

2

3

<?php

$reponse = $bdd->query('SELECT * FROM jeux_video');

?>



$reponse contient maintenant la réponse de MySQL.


Afficher le résultat d'une requête



Le problème, c'est que $reponse contient quelque chose d'inexploitable. MySQL nous renvoie beaucoup d'informations qu'il faut organiser.

Vous imaginez toutes les informations qui s'y trouvent ? Si c'est une table à 10 champs, avec 200 entrées, cela représente plus de 2 000 informations ! Pour ne pas tout traiter d'un coup, on extrait cette réponse ligne par ligne, c'est-à-dire entrée par entrée.

Pour récupérer une entrée, on prend la réponse de MySQL et on y exécute fetch(), ce qui nous renvoie la première ligne.

Code : PHP 

1

2

3

<?php

$donnees = $reponse->fetch();

?>


fetch en anglais signifie « va chercher ».



$donnees est un array qui contient champ par champ les valeurs de la première entrée. Par exemple, si vous vous intéressez au champ console, vous utiliserez l'array $donnees['console'].

Il faut faire une boucle pour parcourir les entrées une à une. Chaque fois que vous appelez $reponse->fetch(), vous passez à l'entrée suivante. La boucle est donc répétée autant de fois qu'il y a d'entrées dans votre table.

Ouf ! Cela fait beaucoup d'informations à la fois. Je vous propose de résumer tout ce qu'on vient d'apprendre, de la connexion via PDO à l'affichage du résultat de la requête :

Code : PHP 

 1

 2

 3

 4

 5

 6

 7

 8

 9

10

11

12

13

14

15

16

17

18

19

20

21

22

23

24

25

26

27

28

29

30

31

32

33

<?php

try

{

       // On se connecte à MySQL

       $bdd = new PDO('mysql:host=localhost;dbname=test', 'root', '');

}

catch(Exception $e)

{

       // En cas d'erreur, on affiche un message et on arrête tout

        die('Erreur : '.$e->getMessage());

}

        

// Si tout va bien, on peut continuer


// On récupère tout le contenu de la table jeux_video

$reponse = $bdd->query('SELECT * FROM jeux_video');


// On affiche chaque entrée une à une

while ($donnees = $reponse->fetch())

{

?>

    <p>

    <strong>Jeu</strong> : <?php echo $donnees['nom']; ?><br />

    Le possesseur de ce jeu est : <?php echo $donnees['possesseur']; ?>, et il le vend à <?php echo $donnees['prix']; ?> euros !<br />

    Ce jeu fonctionne sur <?php echo $donnees['console']; ?> et on peut y jouer à <?php echo $donnees['nbre_joueurs_max']; ?> au maximum<br />

    <?php echo $donnees['possesseur']; ?> a laissé ces commentaires sur <?php echo $donnees['nom']; ?> : <em><?php echo $donnees['commentaires']; ?></em>

   </p>

<?php

}

         

$reponse->closeCursor(); // Termine le traitement de la requête


?>



Alors, vous avez vu ? 
Ça en fait un paquet de texte ! Il faut dire que la table que je vous ai donnée contient une cinquantaine d'entrées, donc c'est normal que vous ayez beaucoup de résultats.

Concrètement, que se passe-t-il ? On fait une boucle pour chaque entrée de la table. On commence par l'entrée n°1, puis l'entrée n°2, etc. Chaque fois qu'on fait une nouvelle boucle, on passe en revue une autre entrée.

Quelle est la différence entre $reponse et $donnees ?



$reponse contenait toute la réponse de MySQL en vrac, sous forme d'objet.
$donnees est un array renvoyé par le fetch(). Chaque fois qu'on fait une boucle, fetch va chercher dans $reponse l'entrée suivante et organise les champs dans l'array $donnees.

Je ne comprends pas la ligne while ($donnees = $reponse->fetch())



En effet, c'est un peu curieux et nouveau pour vous. Cette ligne fait deux choses à la fois :

  • elle récupère une nouvelle entrée et place son contenu dans $donnees ;
  • elle vérifie si $donnees vaut vrai ou faux.

Le fetch renvoie faux (false) dans $donnees lorsqu'il est arrivé à la fin des données, c'est-à-dire que toutes les entrées ont été passées en revue. Dans ce cas, la condition du while vaut faux et la boucle s'arrête.

Vous noterez à la fin la présence de la ligne :

Code : PHP 

1

<?php $reponse->closeCursor(); ?>



Elle provoque la « fermeture du curseur d'analyse des résultats ». Cela signifie, en d'autres termes plus humains, que vous devez effectuer cet appel à closeCursor() chaque fois que vous avez fini de traiter le retour d'une requête, afin d'éviter d'avoir des problèmes à la requête suivante. Cela veut dire qu'on a terminé le travail sur la requête.


Afficher seulement le contenu de quelques champs



Avec ce que je vous ai appris, vous devriez être capables d'afficher ce que vous voulez.
Personne ne vous oblige à afficher tous les champs ! Par exemple, si j'avais juste voulu lister les noms des jeux, j'aurais utilisé la requête SQL suivante :

Code : PHP 

1

SELECT nom FROM jeux_video



Reprenons le code complet précédent et adaptons-le pour afficher un nom de jeu par ligne :

Code : PHP

 1

 2

 3

 4

 5

 6

 7

 8

 9

10

11

12

13

14

15

16

17

18

19

20

<?php

try

{

       $bdd = new PDO('mysql:host=localhost;dbname=test', 'root', '');

}

catch(Exception $e)

{

        die('Erreur : '.$e->getMessage());

}


$reponse = $bdd->query('SELECT nom FROM jeux_video');


while ($donnees = $reponse->fetch())

{

       echo $donnees['nom'] . '<br />';

}


$reponse->closeCursor();


?>




Ce code est très semblable au précédent, mais c'est l'occasion pour vous de vous familiariser avec MySQL et PDO. Retenez tout particulièrement les choses suivantes :

  • la connexion à la base de données n'a besoin d'être faite qu'une seule fois, au début de la page ;
  • il faut fermer les résultats de recherche avec closeCursor() après avoir traité chaque requête.

Créé avec HelpNDoc Personal Edition: Convertissez sans effort votre document Word en livre électronique : un guide étape par étape