Programmation PHP/Exemples/BD 1

Un livre de Wikilivres.
Sauter à la navigation Sauter à la recherche


Afficher le résultat d'une requête[modifier | modifier le wikicode]

Présentation[modifier | modifier le wikicode]

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.

Descriptif du site[modifier | modifier le wikicode]

  • La première page affiche 3 liens hypertextes :
    • un lien pour afficher la liste complète des employés,
    • un lien pour afficher la liste dans l'ordre alphabétique,
    • un lien pour afficher par salaire décroissant.
  • Sur chacune des pages, on affiche la liste et il y a un lien pour revenir à la première page.

Création de la base[modifier | modifier le wikicode]

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 :


IDNOMPRENOMSALAIRE
1DupondMarcel8000
2MartinXavier4000
3GogolHenri3000
4HugoVictor2000
5GaliDaniel6000
6MartinGeorges9000

Configuration de la base de données[modifier | modifier le wikicode]

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[modifier | modifier le wikicode]

  • Pour afficher la liste des employés, on utilisera la requête :

SELECT * FROM employe

  • Pour afficher la liste des employés par ordre alphabétique, on utilisera la requête :

SELECT * FROM employe ORDER BY NOM, PRENOM

  • Pour afficher la liste des employés par salaire décroissant, on utilisera la requête :

SELECT * FROM employe ORDER BY SALAIRE DESC

Comment accéder en php à une base mysql[modifier | modifier le wikicode]

Les différentes étapes à respecter seront les suivantes :

  1. récupérer les informations suivantes :
    1. le nom de la machine qui héberge le serveur de la base de données (ici localhost)
    2. le nom de la base de données (ici toto)
    3. le nom de l'utilisateur de la base de données (ici root)
    4. le mot de passe de cet utilisateur (ici le mot de passe est vide).
  2. se connecter au serveur de base de données
  3. sélectionner la base de données (ici toto) sur ce serveur.
  4. créer la requête dans une chaîne de caractères
  5. envoyer la requête à la base de données et récupérer le résultat
  6. fermer la connexion avec le serveur de base de données
  7. transformer le résultat de la requête en HTML.

Étape 1 : les paramètres spécifiques au site[modifier | modifier le wikicode]

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[modifier | modifier le wikicode]

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[modifier | modifier le wikicode]

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[modifier | modifier le wikicode]

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[modifier | modifier le wikicode]

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[modifier | modifier le wikicode]

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[modifier | modifier le wikicode]

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 echo à partir des différents champs des enregistrements.

Les pages du site (version 1)[modifier | modifier le wikicode]

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)[modifier | modifier le wikicode]

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.