Aller au menu - Aller au contenu

[Plan du site] Vous êtes ici --- > Le Site du Zér0 > Les tutoriels > Officiels > Site Web > Lecture du tutoriel

Lire des données

Avatar
Auteur : M@teo21
Créé : le 16/08/2005 23:32:43
Modifié : Hier à 11:06:25
Noter et commenter ce tutoriel
Imprimer ce tutoriel
Fini de faire joujou, on retourne à nos pages PHP ;)

Dans ce chapitre, nous allons nous entraîner à lire des données dans une base de données. C'est un chapitre très important, un peu gros certes mais c'est parce que vous avez beaucoup à apprendre :p
Je pense sincèrement que ce sera un chapitre très enrichissant pour vous, alors lisez-le avec soin !
Sommaire du chapitre :
Chapitre précédent Sommaire Chapitre suivant

Connexion à la BDD

Pour pouvoir travailler avec la base de données, il faut d'abord s'y connecter.

Se connecter à la base de données...
Hein !? Quoi ?! Il est où le modem ?! Image utilisateur

Ne rigolez pas, c'est exactement ce que je me posais comme question quand on me disait "il faut te connecter à la base de données".
Alors vous vous aurez de la chance, vous ne resterez pas dans le flou comme moi ^^

Voici ce qu'il faut savoir :

Nous allons apprendre dans ce chapitre à lire des données dans une BDD. Or, je vous rappelle que PHP doit faire l'intermédiaire entre vous et MySQL.
Problème : PHP ne peut pas dire à MySQL dès le début "Récupère-moi ces valeurs". En effet, MySQL demande d'abord un nom d'utilisateur et un mot de passe. S'il ne faisait pas ça, tout le monde pourrait accéder à votre BDD et lire les informations qu'il y a dedans (parfois confidentielles !).

Il va donc falloir que PHP s'authentifie, on dit qu'il établit une connexion avec MySQL. Une fois que la connexion sera établie, vous pourrez faire n'importe quelle opération sur votre base de données :D

On va pour commencer apprendre 3 étapes :


La connexion



Pour vous connecter, vous utiliserez une fonction PHP : mysql_connect.
Cette fonction a besoin de 3 arguments qu'il vous faudra renseigner :

On va supposer que le nom de l'hôte est "localhost" (c'est valable dans la quasi-totalité des cas), que mon login est "mateo21" et que mon mot de passe est "cFrrI954".
Le code suivant permet d'établir une connexion à MySQL :

Code : PHP
1
2
3
<?php
mysql_connect("localhost", "mateo21", "cFrrI954");
?>


Si vous faites ça, c'est bon vous êtes connectés ! :D
Il vous faudra peut-être rechercher un peu votre login et votre mot de passe (demandez à votre hébergeur), mais il y a des chances que ce soient les mêmes que pour votre FTP.

Pour vous connecter à MySQL avec WAMP (si vous faites des tests sur votre propre ordinateur), vous devez mettre l'hôte "localhost", le login "root", et pas de mot de passe.
C'est-à-dire : mysql_connect("localhost", "root", "");


Le choix de la base



OK, on est connecté, mais il faut maintenant sélectionner la base de données sur laquelle vous allez travailler.
Bien souvent, une seule base de données suffit, je vous le rappelle. D'ailleurs, la plupart des hébergeurs gratuits n'en propose qu'une seule, ce qui n'est pas bien grave.
Demandez à votre hébergeur le nom de la base qui a été créée (souvent c'est le même nom que votre login MySQL).

La fonction qui permet de sélectionner la BDD est : mysql_select_db
En temps normal, vous n'aurez besoin d'indiquer qu'un paramètre : le nom de la base.

Par exemple, si ma base s'appelle "mateo21", voici comment je dois procéder :

Code : PHP
1
2
3
4
<?php
mysql_connect("localhost", "mateo21", "cFrrI954"); // Connexion à MySQL
mysql_select_db("mateo21"); // Sélection de la base mateo21
?>


La déconnexion



Enfin, dernière chose (après ça c'est bon, promis ;) ).

Une fois que vous vous êtes connectés, que vous avez choisi votre base de données, vous pouvez commencer votre travail. Mais une fois que vous avez fini de travailler sur votre BDD, il faut vous déconnecter :p

Alors, pour se déconnecter, c'est tout bête : mysql_close
Et y'a même pas besoin de paramètre :)

En résumé, voici comment on fait pour se connecter et se déconnecter de MySQL :

Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
<?php
mysql_connect("localhost", "mateo21", "cFrrI954"); // Connexion à MySQL
mysql_select_db("mateo21"); // Sélection de la base mateo21

// On est connectés, on peut travailler sur la BDD
// ...
// ...

// On a fini de travailler, on ferme la connexion :
mysql_close(); // Déconnexion de MySQL
?>

C'est comme ça qu'on procède quand on utilise une BDD :)

Le code source précédent n'affiche rien à l'écran si tout se passe bien.
Si la connexion a échoué, vous aurez un message d'erreur. Dans ce cas c'est que votre login, mot de passe ou nom d'hôte n'est pas bon. Demandez plus d'infos à votre hébergeur.

Récupérer les données

Normalement, quand on crée un site, on doit d'abord mettre des données, puis après on les lit.
Mais moi, pour que vous appreniez en douceur, je vais d'abord vous apprendre à lire des données, et après je vous apprendrai à écrire des données dans la BDD.

Mais... il nous faudrait une base de données "toute prête" qui servirait de support pour travailler. Heureusement, c'est mon jour de bonté, je vais vous épargner tout ça ;)
Je vous invite à télécharger la table que j'ai créée pour vous :

Télécharger la table
Faites un clic droit / Enregistrer sous



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 vidéo.

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, j'en fais quoi moi de ton fichier jeux_video.sql ?

Inutile d'essayer de l'ouvrir, ça n'a pas d'intérêt. Il va falloir importer la table dans PHPMyAdmin (c'est le fichier que je vous ai donné).
Voici la procédure à suivre :
  1. Rendez-vous dans PhpMyAdmin
  2. Sélectionnez la base "test" dans le menu déroulant en haut à gauche, ou bien créez une nouvelle base de données intitulée "coursphp". Dans la suite du cours, je supposerai que votre base s'appelle coursphp.
  3. Cliquez ensuite sur l'onglet "Importer".
  4. Vous avez un bouton "Parcourir" : cliquez dessus.
  5. Dans la boîte de dialogue qui s'ouvre indiquez où se trouve le fichier jeux_video.sql que je vous ai fait télécharger.
  6. Ne touchez pas au reste et cliquez sur "Exécuter".

Petit aperçu :

Importation phpMyAdmin


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

Si vous n'êtes pas sûr de la marche à suivre, regardez comment je fais dans cette petite animation :



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

IDnompossesseurconsoleprixnbre_joueurs_maxcommentaires
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.

Bon, et maintenant qu'est-ce qu'on va en faire ?

Notre objectif, c'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 demander quelque chose à MySQL. On va donc commencer à parler en "SQL" !
Pour cela, on va faire ce qu'on appelle une requête. On va demander poliement à MySQL de nous dire tout ce que contient la table "jeux_video".

Nous allons nous servir de la fonction PHP : mysql_query

"query" en anglais veut dire "requête"


On fera tout le temps comme ça :

Code : PHP
1
2
3
<?php
$reponse = mysql_query("Tapez votre requête SQL ici");
?>

$reponse contiendra la réponse de MySQL.
Nous allons voir comment demander à MySQL tout ce qu'il y a dans la table "jeux_video".

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 votre première requête SQL :

Code : SQL
1
SELECT * FROM jeux_video


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

Et voilà le travail !
Maintenant, on n'a plus qu'à mettre cette requête en paramètre de mysql_query :

Code : PHP
1
2
3
<?php
$reponse = mysql_query("SELECT * FROM jeux_video");
?>

Notre variable $reponse contient maintenant la réponse de MySQL :)

Euh ouais, cool, et comment on affiche le résultat ?

Afficher le résultat d'une requête



Le problème, c'est que $reponse contient quelque chose d'inexploitable. MySQL nous renvoie un joyeux bazar pas bien organisé.

Vous imaginez toutes les informations qui sont dedans ? Si c'est une table à 10 champs, avec 200 entrées, ça fait plus de 2000 informations dans une variable !
Dur dur de tout caser... sauf... si on utilisait un array !

Bingo ! :D
PHP dispose d'une fonction toute prête, mysql_fetch_array, qui va créer un array à partir de $reponse. Ce sera un tableau associatif : vous mettrez entre crochets le nom du champ qui vous intéresse.
Par exemple, si vous vous intéressez au champ "console", vous utiliserez l'array $donnees['console'].

Il faudra faire une boucle pour parcourir chaque entrée une à une. A chaque fois que vous utilisez la fonction mysql_fetch_array, vous passez à l'entrée suivante. La boucle est donc répétée autant de fois qu'il n'y a d'entrées dans votre table.

Voici donc comment je fais pour afficher le 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
<?php
mysql_connect("localhost", "mateo21", "mot_de_passe"); // Connexion à MySQL
mysql_select_db("coursphp"); // Sélection de la base coursphp
 
$reponse = mysql_query("SELECT * FROM jeux_video"); // Requête SQL
 
 
// On fait une boucle pour lister tout ce que contient la table :
 
while ($donnees = mysql_fetch_array($reponse) )
{
?>
    <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
}
 
mysql_close(); // Déconnexion de MySQL
?>



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

Et ceci mis à part, qu'en pensez-vous ? C'est puissant non ?!
Amusez-vous à changer mon script, faites des tests, c'est super important (bien entendu n'oubliez pas d'adapter le login et le mot de passe :p).

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... A 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 la réponse de MySQL en vrac.
$donnees est un array renvoyé par la fonction mysql_fetch_array. A chaque fois qu'on fait une boucle, mysql_fetch_array va chercher dans $reponse l'entrée suivante et organise les champs dans $donnees.

"Fetch" en anglais signifie "va chercher".

Avec ce que je vous ai appris, vous devriez être capable d'afficher ce que vous voulez.
Personne ne vous oblige à afficher tous les champs ! Par exemple, si j'avais voulu lister juste les noms des jeux, j'aurais fait comme ça :

Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
<?php
mysql_connect("localhost", "mateo21", "mot_de_passe"); // Connexion à MySQL
mysql_select_db("coursphp"); // Sélection de la base coursphp
 
$reponse = mysql_query("SELECT nom FROM jeux_video"); // Requête SQL
 
 
// Avec cette boucle, on liste uniquement le nom des jeux :
 
while ($donnees = mysql_fetch_array($reponse) )
{
    echo $donnees['nom'];
    echo "<br />";
}
 
mysql_close(); // Déconnexion de MySQL
?>


Je sais pas vous, mais moi je trouve que là-dedans il y a quelque chose de merveilleux : ce code source est inintelligible pour Mr-tout-le-monde, et pourtant il permet d'afficher d'un coup d'un seul la liste d'une cinquantaine de jeux vidéo.
Et croyez-moi, vous n'êtes pas au bout de vos suprises avec PHP et MySQL :D


Traquer les erreurs



Lorsqu'une requête SQL "plante", bien souvent PHP vous dira qu'il y a eu une erreur à la ligne du mysql_fetch_array.
Ce n'est pas très précis, je pense que vous êtes d'accord avec moi :D Ce n'est pas la ligne du mysql_fetch_array qui est en cause : c'est souvent vous qui avez mal écrit votre requête quelques lignes plus haut.

Pour afficher des détails sur l'erreur, prenez l'habitude de rajouter le code or die(mysql_error()) sur la même ligne que vos mysql_query.

Si on reprend l'exemple de tout à l'heure, on doit donc écrire :

Code : PHP
1
2
3
<?php
$reponse = mysql_query("SELECT nom FROM jeux_video") or die(mysql_error());
?>


Ce code qu'on a rajouté ne fera rien s'il n'y a pas d'erreur.
S'il y a eu une erreur en revanche, il affichera des informations détaillées sur l'erreur qui vous permettront de comprendre ce qui ne va pas dans votre requête.

Vous trouverez plus d'infos à ce sujet dans l'annexe sur les erreurs si ça vous intéresse.

Lorsque vous avez un problème avec une requête et que vous voulez demander de l'aide sur les forums du site, donnez toujours l'erreur renvoyée par le or die(mysql_error()). Cela aidera énormément les gens à comprendre votre erreur.



Les critères de sélection

Ici, nous allons nous occuper uniquement des requêtes SQL.
Vous allez voir qu'en les modifiant, vous pouvez trier et ordonner différemment vos données très facilement :D

Nous allons nous intéresser aux éléments suivants :


WHERE



Grâce au mot-clé WHERE, vous allez pouvoir trier vos données !

Supposons par exemple que je veuille lister uniquement les jeux appartenant à Patrick. La requête au début sera la même qu'avant, mais je rajouterai à la fin "WHERE possesseur='Patrick'".
Ca nous donne la requête :

Code : SQL
1
SELECT * FROM jeux_video WHERE possesseur='Patrick'


Traduction : "Sélectionner tous les champs de la table jeux_video lorsque le champ possesseur est égal à Patrick".

Un petit code pour voir ce que ça donne ?

Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
<?php
mysql_connect("localhost", "mateo21", "mot_de_passe");
mysql_select_db("coursphp");

// Sélectionnons les champs nom et possesseur de la table "jeux_video", uniquement lorsque le jeu appartient à Patrick
$reponse = mysql_query("SELECT nom, possesseur FROM jeux_video WHERE possesseur='Patrick'");

while ($donnees = mysql_fetch_array($reponse) )
{
?>

<?php echo $donnees['nom']; ?> appartient à <?php echo $donnees['possesseur']; ?><br />

<?php
}

mysql_close();
?>



Si vous vous amusez à changer le nom du possesseur (par exemple "WHERE possesseur='Michel'), ça n'affichera que les jeux appartenant à Michel ! Essayez, vous verrez !

Il est par ailleurs possible de mettre deux conditions. Par exemple, si je veux lister les jeux de Patrick qu'il vend à moins de 20 euros, j'utiliserai cette requête SQL :

Code : SQL
1
SELECT * FROM jeux_video WHERE possesseur='Patrick' AND prix < 20


Traduction : "Sélectionner tous les champs de jeux_video lorsque le possesseur est Patrick ET lorsque le prix est inférieur à 20".

ORDER BY



ORDER BY nous permet d'ordonner nos résultats (histoire qu'ils ne soient pas trop en vrac...).
Nous pourrions classer les résultats en fonction de leur prix ! La requête SQL serait :

Code : SQL
1
SELECT * FROM jeux_video ORDER BY prix


Traduction : "Sélectionner tous les champs de jeux_video, et ordonner les résultats par prix croissant.".

Application :

Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
<?php
mysql_connect("localhost", "mateo21", "mot_de_passe");
mysql_select_db("coursphp");

// Sélectionner les champs "nom" et "prix" de jeux_video et ordonner les résultats par prix.
$reponse = mysql_query("SELECT nom, prix FROM jeux_video ORDER BY prix");

while ($donnees = mysql_fetch_array($reponse) )
{
?>

<?php echo $donnees['nom']; ?> coûte <?php echo $donnees['prix']; ?> EUR<br />

<?php
}

mysql_close(); // Déconnexion de MySQL
?>



Et si je veux classer par ordre décroissant ?

Facile : il suffit de rajouter le mot-clé DESC à la fin :

Code : SQL
1
SELECT * FROM jeux_video ORDER BY prix DESC


Traduction : "Sélectionner tous les champs de jeux_video, et ordonner les résultats par prix décroissant.".

A noter : si on avait utilisé ORDER BY sur un champ contenant du texte, le classement aurait été fait par ordre alphabétique.


LIMIT



Dernier mot-clé que nous apprendrons dans ce chapitre, LIMIT nous permet de ne prendre qu'une partie des résultats (par exemple les 20 premiers).

Il faut rajouter à la fin de la requête le mot clé LIMIT, suivi de 2 nombres séparés par une virgule. Par exemple :

Code : SQL
1
SELECT * FROM jeux_video LIMIT 0, 20


o_O Mais ils veulent dire quoi ces deux nombres ?

Bonne question :p

Donc, si on met :

LIMIT 0,20 : ça affiche les 20 premières entrées.
LIMIT 5,10 : ça affiche les entrées n°6 à 15.
LIMIT 10,2 : ça affiche les entrées n°11 et 12.

Compris ? :D

Allez un petit exemple ! Si on veut afficher les 10 premiers jeux de la table, on utilisera le code suivant :

Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
<?php
mysql_connect("localhost", "mateo21", "mot_de_passe");
mysql_select_db("coursphp");

// Sélectionner les 10 premières entrées de la table jeux_video
$reponse = mysql_query("SELECT nom FROM jeux_video LIMIT 0, 10");

echo "Voici les 10 premières entrées de la table jeux_video :<p>";

while ($donnees = mysql_fetch_array($reponse) )
{
?>

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

<?php
}

mysql_close(); // Déconnexion de MySQL
?>



Et voilà le travail ! :)

Bonjour, je suis masochiste, et avant de terminer cette section je souhaiterais mélanger toutes les requêtes SQL que je viens d'apprendre en une seule. C'est possible ?

Mais bien entendu mon petit :diable:

Voilà de quoi te triturer les méninges :

Code : SQL
1
SELECT nom, possesseur, console, prix FROM jeux_video WHERE console='Xbox' OR console='PS2' ORDER BY prix DESC LIMIT 0,10


Il faut utiliser les mots-clés dans l'ordre que j'ai donné : WHERE puis ORDER BY puis LIMIT, sinon MySQL ne comprendra pas votre requête.

Essayez donc de traduire ça en français déjà, pour voir si vous avez compris, puis après testez cette requête chez vous pour voir si c'est bien ce à quoi vous vous attendiez.

Pfiouuu ! Eh bah, si avec ça vous devenez pas des pros du SQL :lol:

Compter le nombre d'entrées

Avant de terminer ce chapitre, on va apprendre à faire quelque chose qui nous sera parfois très utile : demander à mysql le nombre d'entrées dans une table. Cela vous permettra de dire par exemple : Il y a 23 jeux vidéo en vente actuellement !

Pour ce faire, on va utiliser la requête suivante :

Code : PHP
 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
<?php
mysql_connect("localhost", "mateo21", "mot_de_passe");
mysql_select_db("coursphp");

// Combien d'entrées dans jeux_vidéo ?
$retour = mysql_query("SELECT COUNT(*) AS nbre_entrees FROM jeux_video");
$donnees = mysql_fetch_array($retour);


?>

Il y a <?php echo $donnees['nbre_entrees']; ?> jeux vidéo en vente !

<?php
mysql_close(); // Déconnexion de MySQL
?>



Comme vous pouvez le voir, la requête est un peu différente. Le mot-clé COUNT demande à MySQL de compter le nombre d'entrées, et de renvoyer le résultat dans l'array $donnees['nbre_entrees'].
On ne fait pas de boucle, il n'y en a pas besoin. MySQL a juste renvoyé le nombre de jeux vidéo inscrits dans la table.

Et n'oubliez pas que vous pouvez rajouter à la fin de la requête un WHERE, par exemple pour avoir juste le nombre de jeux vidéo appartenant à Florent !
A vous de jouer ! ;)

Q.C.M.

Quelle fonction permet de choisir la base de données à utiliser ?
Comment traduiriez-vous la requête suivante :
Code : SQL
1
SELECT utilisateur FROM liste_users
Quelles entrées récupère-t-on avec ce code ?Code : SQL
1
LIMIT 3, 10
Que récupère cette requête SQL ?Code : SQL
1
SELECT * FROM ma_table WHERE prix = 15
Que renvoie cette requête ?Code : SQL
1
SELECT * FROM abonnes WHERE ville='Avignon' LIMIT 0, 15 ORDER BY nom DESC


Vous êtes arrivés vivants jusqu'au bout ? Bravo ! :D

Vous venez d'apprendre une quantité de choses impressionnantes dans ce chapitre ! Une fois que vous aurez lu le chapitre suivant, vous serez même capables de créer des scripts de news, de livre d'or, un forum etc etc...
Vu que ce chapitre était d'une importance capitale, n'hésitez pas à le relire (après vous être reposés :p), car il faut vraiment que vous maîtrisiez les requêtes SQL et leur affichage avec PHP !
Chapitre précédent Sommaire Chapitre suivant
Auteur : M@teo21
Noter et commenter ce tutoriel
Imprimer ce tutoriel

Changer de design | En savoir plus | Plan du site | Politique d'accessibilité | Règles | Fil RSS | XHTML 1.0 | CSS 2.0
Édité par Simple IT SARL : Nous contacter | Revue de presse | Publicité

Y'a plus rien à lire, faut remonter maintenant !

Hébergement web - Correction de tutoriels - Créer un site
Vous souhaitez apparaître ici ? Contactez-nous.

Nombre de connectés 391 Zéros connectés | Requêtes SQL 10 requêtes | Temps de génération de la page : Total (SQL) 0.0707s (0.057s)