Programmation PHP/Exemples/BD 1
Afficher le résultat d'une requête.
Présentation.
Dans cet exemple, on va créer une application qui extrait des données à partir d'une base de données et qui affiche le résultat à l'écran. Notre programme va afficher une liste d'employés d'une entreprise imaginaire : chaque employé est défini par un nom, un prénom et un salaire. La base de données utilisée sera une base mysql. Les données seront dans une table nommée "employe". La table employé possède des champs NOM, PRENOM et SALAIRE. La table employé possède de plus un identifiant nommé ID qui est un entier (BIGINT) autoincrémenté et qui est une clé primaire de la table.
Nous étudierons une première version du programme et dans un second temps nous améliorerons le programme en utilisant la méthode GET lors d'une deuxième version.
Création de la base.
Les requêtes suivantes permettent la création et l'initialisation des données dans notre table :
Fichier BD.sql : 
CREATE TABLE `employe` (
 `ID` BIGINT NOT NULL AUTO_INCREMENT ,
 `NOM` VARCHAR( 20 ) ,
 `PRENOM` VARCHAR( 20 ) ,
 `SALAIRE` DOUBLE DEFAULT '0',
 PRIMARY KEY ( `ID` ) 
INSERT INTO `employe` ( `ID` , `NOM` , `PRENOM` , `SALAIRE` ) 
 VALUES (
 ", 'Dupond', 'Marcel', '8000'
INSERT INTO `employe` ( `ID` , `NOM` , `PRENOM` , `SALAIRE` ) 
 VALUES (
 ", 'Martin', 'Xavier', '4000'
INSERT INTO `employe` ( `ID` , `NOM` , `PRENOM` , `SALAIRE` ) 
 VALUES (
 ", 'Gogol', 'Henri', '3000'
INSERT INTO `employe` ( `ID` , `NOM` , `PRENOM` , `SALAIRE` ) 
 VALUES (
 ", 'Hugo', 'Victor', '2000'
INSERT INTO `employe` ( `ID` , `NOM` , `PRENOM` , `SALAIRE` ) 
 VALUES (
 ", 'Gali', 'Daniel', '6000'
INSERT INTO `employe` ( `ID` , `NOM` , `PRENOM` , `SALAIRE` ) 
 VALUES (
 ", 'Martin', 'Georges', '9000'
La table créée par ces requêtes est la suivante :
Configuration de la base de données.
La table "employe" appartient à la base de données "toto". L'administrateur de cette base est root. Il n'a pas de mot de passe. Attention ceci est une configuration type utilisée par défaut pour la plateforme de développement EasyPHP : il est vivement recommandé de mettre un vrai mot de passe pour une plateforme en exploitation.
Les requêtes utilisées.
"SELECT * FROM employe"
"SELECT * FROM employe ORDER BY NOM, PRENOM"
"SELECT * FROM employe ORDER BY SALAIRE DESC"
Comment accéder en php à une base mysql.
Les différentes étapes à respecter seront les suivantes :
Étape 1 : les paramètres spécifiques au site.
Pour réaliser la première étape nous allons créer un fichier params.php qui contient 4 variables $host (le nom de la machine qui héberge la base de données, $user (le nom de l'utilisateur de la base de données), $password (le mot de passe de cet utilisateur) et $base le nom de la base de données. Ces paramètres changent en fonction de la plateforme que vous utilisez. Il est intéressant d'isoler ces paramètres dans un fichier séparé, que ce soit au niveau de la sécurité ou pour porter l'application sur une autre plateforme. Il faut se renseigner au niveau de l'hébergeur sur les caractéristiques de la plateforme utilisée. Les paramètres suivants sont ceux par défaut si on utilise EasyPHP. On a juste créé une base de données appelée "toto".
<?php
$host='localhost';
$user='root';
$password=";
$base='toto';
Pour récupérer, ces paramètres il suffit d'inclure ce fichier en utilisant le mot clé require.
On écrira "require'params.php' ". Le fichier sera alors inclus dans le programme en php et le programmeur utilisera les 4 variables.
Étape 2 : connexion à la base de données.
La fonction mysql_connect($host,$user,$password) permet de se connecter au serveur de base de données mysql situé sur la machine nommée "$host" en utilisant le nom d'utilisateur "$user" ayant comme mot de passe "$password". Cette fonction renvoie le booléen true si la connexion est établie et false sinon.
Étape 3 : sélectionner la base de données.
Un serveur de base de données peut héberger plusieurs bases de données (une base de données est un ensemble de tables). La fonction mysql_select_db($base) permet de sélectionner la base de données à laquelle on va envoyer les requêtes. Cette fonction renvoie true si tout s'est bien passé et false sinon.
Étape 4 : création de la requête.
Il faut ensuite créer la requête dans une chaîne de caractères. Ici la requête va être simple, par exemple "$query='SELECT * FROM employe';" : on met la requête dans la variable $query. Parfois, il faudra concaténer des chaînes de caractères pour construire la requête--.
Étape 5 : envoyer la requête et récupérer le résultat.
Pour envoyer la requête au serveur, il faut utiliser la fonction "$r=mysql_query($query);" qui envoie la requête "$query" et récupère le résultat dans "$r".
Étape 6 : fermer la connexion avec le serveur de base de données.
Pour fermer la connexion avec le serveur de base de données, il suffit d'appeler la fonction "mysql_close();".
Étape 7 : générer du HTML à partir du résultat de la requête.
Supposons que le résultat d'une requête soit contenu dans la variable $r. Il est souvent intéressant de parcourir un à un tous les enregistrements contenus dans $r. L'appel de fonction "$a=mysql_fetch_object($r)" permet de récupérer un à un tous les enregistrements dans la variable $a. Lors du premier appel, on récupère le premier enregistrement dans $a, lors du second appel, on récupère le second enregistrement et ainsi de suite jusqu'au dernier enregistrement. Si on appelle alors une nouvelle fois cette fonction, elle va renvoyer le booléen false. Ceci permet donc de traiter un à un tous les enregistrements en écrivant
while ($a=mysql_fetch_object($r)) {
Lors de l'exécution de ce while $a va prendre toutes les valeurs des différents enregistrements contenus dans $r, du premier au dernier. À partir de l'objet $a, on pourra récupérer le champs NOM de cet enregistrement en écrivant "$a->NOM". On peut ainsi récupérer la valeur de chaque champ d'un enregistrement.
Il suffit donc maintennant de parcourir chaque enregistrement et d'afficher du HTML en utilisant la commande codice_1 à partir des différents champs des enregistrements.
Les pages du site (version 1).
Fichier index.html
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
 <head>
 <title>Afficher le résultat d'une requête</title>
 </head>
 <body>
<h1> Choisissez dans le menu ci-dessous</h1>
<a href="liste1.php">Afficher la liste des employés</a><br/>
<a href="liste2.php">Afficher la liste des employés par ordre alphabétique</a><br/>
<a href="liste3.php">Afficher la liste des employés par salaire décroissant</a><br/>
 </body>
</html>
Fichier params.php
<?php
$host='localhost';
$user='root';
$password=";
$base='toto';
Fichier liste1.php
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
 <head>
 <title>Afficher la liste des employés</title>
 </head>
 <body>
<h1>Afficher la liste des employés</h1>
<?php
 require 'params.php';
 mysql_connect($host,$user,$password) or die('Erreur de connexion au SGBD.');
 mysql_select_db($base) or die('La base de données n\'existe pas');
 $query='SELECT * FROM employe';
 $r=mysql_query($query);
 mysql_close();
 echo'<table><tr><td>NOM</td><td>PRENOM</td><td>SALAIRE</td></tr>';
 while ($a=mysql_fetch_object($r)) {
 $nom=$a->NOM;
 $prenom=$a->PRENOM;
 $salaire=$a->SALAIRE;
 echo"<tr><td>$nom</td><td>$prenom</td><td>$salaire</td></tr>";
 echo '</table>';
<br/>
<br/>
<a href="index.html">Retour à la page d'accueil</a>
 </body>
</html>
Fichier liste2.php
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
 <head>
 <title>Afficher la liste des employés par ordre alphabétique</title>
 </head>
 <body>
<h1>Afficher la liste des employés par ordre alphabétique</h1>
 <?php
 require 'params.php';
 mysql_connect($host,$user,$password) or die('Erreur le connexion au SGBD.');
 mysql_select_db($base) or die('La base de données n\'existe pas');
 $query='SELECT * FROM employe ORDER BY NOM, PRENOM';
 $r=mysql_query($query);
 mysql_close();
 echo'<table><tr><td>NOM</td><td>PRENOM</td><td>SALAIRE</td></tr>';
 while ($a=mysql_fetch_object($r)) {
 $nom=$a->NOM;
 $prenom=$a->PRENOM;
 $salaire=$a->SALAIRE;
 echo"<tr><td>$nom</td><td>$prenom</td><td>$salaire</td></tr>";
 echo '</table>';
<br/>
<br/>
<a href="index.html">Retour à la page d'accueil</a>
 </body>
</html>
Fichier liste3.php
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
 <head>
 <title>Afficher la liste des employés par salaire décroissant</title>
 </head>
 <body>
<h1>Afficher la liste des employés par ordre alphabétique</h1>
 <?php
 require 'params.php';
 mysql_connect($host,$user,$password) or die('Erreur le connexion au SGBD.');
 mysql_select_db($base) or die('La base de données n\'existe pas');
 $query='SELECT * FROM employe ORDER BY SALAIRE DESC';
 $r=mysql_query($query);
 mysql_close();
 echo'<table><tr><td>NOM</td><td>PRENOM</td><td>SALAIRE</td></tr>';
 while ($a=mysql_fetch_object($r)) {
 $nom=$a->NOM;
 $prenom=$a->PRENOM;
 $salaire=$a->SALAIRE;
 echo"<tr><td>$nom</td><td>$prenom</td><td>$salaire</td></tr>";
 echo '</table>';
<br/>
<br/>
<a href="index.html">Retour à la page d'accueil</a>
 </body>
</html>
Les pages du site (version 2).
Lorsqu'on étudie les fichiers liste1.php, liste2.php et liste3.php, on s'aperçoit qu'ils sont extrêmement proches : on va donc réécrire l'application en écrivant un seul fichier liste.php et en le paramétrant grâce à la méthode GET.
Le nouveau fichier index.html devient donc :
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
 <head>
 <title>Afficher le résultat d'un requête</title>
 </head>
 <body>
<h1> Choisissez dans le menu ci-dessous</h1>
<a href="liste.php?l=1">Afficher la liste des employés</a><br/>
<a href="liste.php?l=2">Afficher la liste des employés par ordre alphabétique</a><br/>
<a href="liste.php?l=3">Afficher la liste des employés par salaire décroissant</a><br/>
 </body>
</html>
On constate donc que les liens hypertextes, par exemple "liste.php?l=1" appelle le même fichier liste.php en lui donnant un paramètre par la méthode GET, ici l=1, ce qui permet de paramétrer le fichier.
Remarque importante : lorsqu'on utilise ce genre de liens hypertextes, il faut toujours se poser la question : que se passe-t-il si l'utilisateur accède à la page liste.php sans passer de paramètres ou alors en écrivant "liste.php?l=4" ? Le programmeur doit garantir que dans un tel cas, le site reste cohérent et que ceci n'engendre pas de failles de sécurité.
Le fichier liste.php devient :
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN"
 "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html>
 <head>
 <title>Afficher la liste des employés</title>
 </head>
 <body>
<h1>Afficher la liste des employés</h1>
 <?php
 require 'params.php';
 mysql_connect($host,$user,$password) or die('Erreur le connexion au SGBD.');
 mysql_select_db($base) or die('La base de données n\'existe pas');
 if(isset($_GET['l']))
 $l=$_GET['l'];
 else $l=1;
 if($l==1)$query='SELECT * FROM employe';
 else if($l==2)$query='SELECT * FROM employe ORDER BY NOM, PRENOM';
 else $query='SELECT * FROM employe ORDER BY SALAIRE DESC';
 $r=mysql_query($query);
 mysql_close();
 echo'<table><tr><td>NOM</td><td>PRENOM</td><td>SALAIRE</td></tr>';
 while ($a=mysql_fetch_object($r)) {
 $nom=$a->NOM;
 $prenom=$a->PRENOM;
 $salaire=$a->SALAIRE;
 echo"<tr><td>$nom</td><td>$prenom</td><td>$salaire</td></tr>";
 echo '</table>';
<br/>
<br/>
<a href="index.html">Retour à la page d'accueil</a>
 </body>
</html>
Le programmeur teste en utilisant "isset($_GET['l'])" pour savoir si la variable l a été passée par la méthode GET et il récupère sa valeur dans la variable $l. Si ce paramètre n'existe pas, $l est fixé à la valeur 1. On construit ensuite la requête $query en fonction de la valeur de $l. Cette version du programme est plus simple mais îil faut toutefois faire très attention à la sécurité dans un tel cas.