4. Interaction avec Mysql

Nous avons vu dans le cours sur les bases de données la manière de stocker des valeurs et d'y accéder sur une base MySQL. Nous allons voir dans ce chapitre la façon d'interagir avec la base de données depuis des pages écrites en PHP. En particulier, nous détaillerons les étapes suivantes :

  1. Connexion au serveur MySQL (authentification) : nous récupérons une ressource de connexion sur laquelle nous pourrons travailler.

  2. Sélection d'une base de données : le serveur MySQL pouvant héberger plusieurs base de données, nous sélectionnons la cible de nos traitements

  3. Passage de la requête : nous récupérons ici une ressource, qui contient (mais pas de manière immédiatement accessible) la réponse à notre requête.

  4. Vérification de la validité de la ressource récupérée : éventuellement des tests sur le nombre de lignes renvoyées par la requêtes, ou sur la bonne exécution de cette requête.

  5. Extraction des données à partir de la ressource : pour récupérer les informations dans un format exploitable par PHP.

  6. Fermeture de la connexion : indiquer au système de libérer les ressources monopolisées.

Les différentes fonctions que nous allons voir sont bien sûr détaillées dans la documentation de php, sur http://www.php.net.

4.1. Accès au serveur MySQL

L'accès à un serveur MySQL depuis une page PHP se fait via la fonction mysql_connect(serveur, login, password). Les informations à passer sont donc :

  • serveur : l'adresse IP ou le nom DNS du serveur hébergeant le SGBDR MySQL

  • login : un compte utilisateur de MySQL, ayant les droits nécessaires sur la base que vous souhaitez exploiter

  • password : le mot de passe du compte

Ces valeurs varient selon les cas : en local, elles dépendront de votre configuration, chez un hébergeur internet elles sont généralement fournies au moment de l'abonnement.

La fonction mysql_connect renvoie un identifant de ressource, qu'il est nécessaire de stocker dans une variable. C'est cette valeur qui permettra d'identifier le lien au serveur de la base de données pour les futures requêtes. En effet, rien n'interdit de se connecter simultanément à plusieurs serveurs !

Exemple 16. Connexion à un serveur MySQL



Exemple 1: 

$connexion = mysql_connect("localhost", "initll", "pass_initll");

Exemple 2 : 

$host = "localhost";
$user = "init_ll";
$password = "pass_initll";

if (!$connexion = mysql_connect($host,$user,$password))
{
    $message = mysql_error();
    echo "$message<br>";
    die();
}



Une fois la connexion avec le serveur établie, nous allons nous servir de ce lien pour sélectionner la base sur laquelle travailler. En effet, nous avons vu qu'il est possible d'héberger plusieurs bases de données sur un même serveur MySQL, mais nos futures requêtes à la base doivent s'appliquer à une seule base ! Pour cela, PHP dispose de la fonction mysql_selectdb("nom_bdd", connexion). Les paramètres à passer à la fonction sont les suivants :

  • nom_bdd : le nom de la base de données telle qu'il apparait sur le serveur MySQL

  • lien : l'identifiant de la ressource que l'on a récupéré à la suite de l'exécution de mysql_connect

Exemple 17. Sélection de la base de données


Exemple 1 :

$db= mysql_select_db("init_ll", $connexion) or die(mysql_error());

Exemple 2 : 

$database = "init_ll";
$db = mysql_select_db($database,$connexion)
      or die ("Problème de sélection de la base de données");


Dans cet exemple, on sélectionne la base de données init_ll sur le serveur auquel on se connecte via l'identifiant link. Dans le cas où la fonction échoue, la fonction mysql_error sera exécutée, fournissant les informations nécessaires au débugage.


Nous verrons dans le dernier chapitre la manière de globaliser ces opérations en les incluant dans des fichiers séparés des codes PHP. Dans le cas contraires, en cas de changement d'hébergement du site, il faut reprendre toutes les pages PHP contenant des connexions à la base de données, et les modifier pour faire apparaître les nouvelles informations ...

4.2. Exécution de code SQL

Une fois la connexion au serveur de bases de données établie, et la base de données sélectionnée, il est alors possible de manipuler l'ensemble des données MySQL en écrivant les requêtes SQL, et en les faisant exécuter sur le serveur.

Note

L'ensemble des requêtes SQL disponible sous MySQL est à notre disposition, qu'il s'agisse de sélectionner des données, d'en ajouter, d'en supprimer ou encore d'en modifier. Ces requêtes ont été vues dans le cours MySQL, et nous n'allons pas les reprendre toutes. Rappelez vous cependant que si vous avez des soucis avec la rédaction des requêtes, il est possible de laisser à des outils tels que PhpMyAdmin le soin de les concevoir pour vous..

La première étape consiste à concevoir la requête, qui n'est pas forcément une requête statique : il peut être nécessaire de la construire en utilisant des données provenant du code PHP, par exemple issues d'un formulaire. Il est ainsi préférable de construire la requête en la stockant dans une chaîne de caractères avant de l'exécuter. Une fois la requête conçue, l'exécution se fait en appelant la fonction mysql_query($query,$connexion). $query contiendra la chaîne de caractère de la requête SQL, et $connexion l'identifiant obtenu à l'excéution de la fonction mysql_selectdb().

Exemple 18. Exécution d'un requête SQL


Exemple 1 : 

$query = "SELECT * FROM formateurs";
$result = mysql_query($query,$connexion)
     or    die ("Erreur d'exécution de la requête SQL !!");

Exemple 2 : 

$query = "SELECT * FROM formateurs WHERE FORM_NOM LIKE 'KURZWEG'";
$result = mysql_query($query,$connexion)
     or    die ("Erreur d'exécution de la requête SQL !!");

Exemple 3 : 

$query = sprintf("SELECT * FROM formateurs WHERE FORM_NOM LIKE '%s'",$_POST["nom"]);
$result = mysql_query($query,$connexion)
     or    die ("Erreur d'exécution de la requête SQL !!");


Vous remarquerez l'emploi des apostrophes à l'intérieur de la requête SQL, alors que ce sont des guillemets qui encadrent la chaîne PHP. Dans le troisième exemple, la requête est construite à partir d'informations récupérées depuis un formulaire, en utilisant la fonction sprintf() qui permet de formater une chaîne de caractères.


La variable $result utilisée dans les exemples suivants possède un comportement différent selon que :

  • la requête SQL renvoie un résultat (une requête de sélection) : $result identifie le tableau qui contiendra toutes les informations issues de la requête

  • la requête SQL ne renvoie pas de résultat (insertion, modification, suppression d'enregistrement ) : $result est alors un booléen qui contiendra FALSE ou TRUE selon que la requête se soit bien passée ou non.

4.3. Traitement des résultats

4.3.1.  Traitement des résultats d'une requête de type SELECT

Les fonctions MySQL permettent d'extraire les résultats d'une requête sous différentes formes, mais la plus commune est le tableau. Ce tableau extrait un enregistrement et un seul, chaque cellule du tableau étant identifié par le nom du champ de la table. Parcourir tous les résultats de la requête nécessite ainsi de recharger le tableau pour chacune des lignes. Un méthode commune est l'emploi d'une boucle while. La fonction mysql_fetch_array stocke une ligne résultat de la requête dans un tableau, et pointe sur la ligne suivante. Quand tous les résultats sont traités, la fonction renvoie FALSE.

Exemple 19. Traitement des résultats d'une requête




$query = "SELECT * FROM stagiaires";
$result = mysql_query($query,$connexion)
     or    die ("Erreur d'exécution de la requête SQL !!");

echo "<ul>";
while ($ligne = mysql_fetch_array($result)) {
  echo "<li>" . $ligne['STAG_NUM'] . " : " 
              . $ligne['STAG_NOM'] . " - " 
              . $ligne['STAG_PRENOM'] . "</li>" ;
  echo "<br />";
}
echo "</ul>

Cet exemple va sélectionner tous les champs de toutes les lignes dans la table stagiaires. Ensuite, la fonction mysql_fetch_array va stocker ligne par ligne les enregistrements. La boucle PHP va afficher une liste à puces, chaque item contenant le numéro, le nom et le prénom du stagiaire.


4.3.2. Test des résultats d'une requête de type SELECT

Dans certains cas, il peut être nécessaire de connaître des informations sur les résultats de la requête. La plus courante est le nombre de lignes renvoyées par la requête, ou encore le nombre de champs, respectivement connus via les fonctions mysql_num_row($result) et mysql_num_fields($esult).

Exemple 20. Test des résultats d'une requête



$prenom = "ivan";
$query = sprintf("SELECT * FROM stagiaires WHERE STAG_PRENOM LIKE '%s'", $prenom;
$result = mysql_query($query,$connexion)
     or    die ("Erreur d'exécution de la requête SQL !!");

if (mysql_num_rows($result) == 0)
{
	echo "<p>Pas de stagiaires avec $prenom comme prenom !</p>";
}
else
{
	echo "<ul>";
	while ($ligne = mysql_fetch_array($result)) {
  		echo "<li>" . $ligne['STAG_NUM'] . " : " 
                            .  $ligne['STAG_NOM'] . " - " 
                            . $ligne['STAG_PRENOM'] . "</li>" ;
  		echo "<br />";
	}
	echo "</ul>
}

Dans cet exemple, on vérifie que la requête a renvoyé au moins une ligne avant d'afficher les résultats. Si elle n'a rien retourné, on affiche un message d'avertissement.


4.4. Fermeture de connexion à la base MySQL

Il existe des configurations particulières pour lesquelles les connexions à la base de données initiées dans une page PHP peuvent être laissées ouvertes, mais dans la grande majorité des cas, il est largement préférable de fermer la connexion au serveur de base de données, juste après les traitements. Ainsi, même si de nombreux utilisateurs sont connectés sur le site simultanément, le risque d'arriver au maximum des utilisateurs accèdant à MySQL s'en trouve réduit. Il faut donc penser à tout le temps fermer la connexion à MySQL en fin de page PHP en utlisant la fonction mysql_close($connexion)

Exemple 21. Exemple de traitement complet



$host = "localhost";
$user = "init_ll";
$password = "pass_initll";

if (!$connexion = mysql_connect($host,$user,$password))
{
    $message = mysql_error();
    echo "$message<br>";
    die();
}

$prenom = "ivan";
$query = sprintf("SELECT * FROM stagiaires WHERE STAG_PRENOM LIKE '%s'", $prenom;
$result = mysql_query($query,$connexion)
     or    die ("Erreur d'exécution de la requête SQL !!");

if (mysql_num_rows($result) == 0)
{
	echo "<p>Pas de stagiaires avec $prenom comme prenom !</p>";
}
else
{
	echo "<ul>";
	while ($ligne = mysql_fetch_array($result)) {
  		echo "<li>" . $ligne['STAG_NUM'] 
                            . " : " .  $ligne['STAG_NOM'] 
                            . " - " . $ligne['STAG_PRENOM'] . "</li>" ;
  		echo "<br />";
	}
	echo "</ul>
	}

mysql_close($connexion);



4.5. Exercices d'applications

Travailler à partir de la base stagiaires. Faire une page où s'affiche la liste des stagiares (Nom, prenom, date de naissance) sous forme de liste ordonnée, la liste des formateurs, la liste des modules.

Travailler à partir de la base ordinateurs. Modifier la pages PHP "index.html", de manière à indiquer dans la première le nombre total d'ordinateurs dans la base et le nombre d'ordinateurs dans chaque catégorie.Modifier ensuite la page portable de manière à en obtenir la liste depuis la base de données.

Skins :
Transparence
Simple
Page Accueil
Formation