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 ?!

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
On va pour commencer apprendre 3 étapes :
- La connexion
- Le choix de la base
- La déconnexion
La connexion
Pour vous connecter, vous utiliserez une fonction PHP :
mysql_connect.
Cette fonction a besoin de 3 arguments qu'il vous faudra renseigner :
- Le nom de l'hôte : c'est l'IP de l'ordinateur où MySQL est installé. Le plus souvent, MySQL est installé sur le même ordinateur que PHP. Dans ce cas, mettez la valeur "localhost" et ça marchera

- Le login : ça permet de vous identifier. Renseignez-vous auprès de votre hébergeur pour le connaître. Le plus souvent (chez un hébergeur gratuit) c'est le même login que vous utilisez pour le FTP.
- Le mot de passe : là encore, il y a 99% de chances pour que le mot de passe soit le même que celui que vous utilisez pour accéder au FTP (ça ne vous coûte rien d'essayer :p)
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 : PHP1
2
3 | <?php
mysql_connect("localhost", "mateo21", "cFrrI954");
?>
|
Si vous faites ça, c'est bon vous êtes connectés !

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 : PHP1
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
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.
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 :
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 :
- Rendez-vous dans PhpMyAdmin
- 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.
- Cliquez ensuite sur l'onglet "Importer".
- Vous avez un bouton "Parcourir" : cliquez dessus.
- 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.
- Ne touchez pas au reste et cliquez sur "Exécuter".
Petit aperçu :
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 !) :
| 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.
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"
- Cette fonction prend un paramètre : ce que PHP doit aller dire à MySQL (en langage SQL).
- Cette fonction renvoie une valeur, il faut donc qu'une variable récupère ce que MySQL nous a répondu.
On fera tout le temps comme ça :
Code : PHP1
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
Ceci 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 faire MySQL. Dans ce chapitre, nous ne verrons que SELECT. Ca 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. Ca 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.
Et voilà le travail !
Maintenant, on n'a plus qu'à mettre cette requête en paramètre de
mysql_query :
Code : PHP1
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 !

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 ?

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

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 : PHP1
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.
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
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 : SQL1 | 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 : SQL1 | 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 : SQL1 | 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 : SQL1 | 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 : SQL1 | SELECT * FROM jeux_video LIMIT 0, 20
|

Mais ils veulent dire quoi ces deux nombres ?
Bonne question
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 ?
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
Voilà de quoi te triturer les méninges :
Code : SQL1 | 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
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 !