Effectuer des requêtes sur la base de données MySQL
Fonctionnement : cas de la clause SELECT
Une fois que nous sommes connectés à MySQL et à une base de données, nous pouvons effectuer des tâches classiques dans un SGBD : ajouter une table, supprimer un enregistrement, mettre à jour un enregistrement, afficher le résultat d'une requête...
Toutes ces actions sont directement effectuées en SQL via une requête appropriée et l'utilisation de la fonction PHP
mysql_query (). Il est donc indispensable d'avoir au préalable une bonne connaissance du langage SQL...
Admettons que nous soyons connectés à notre base de données
comme vu précedemment.
Nous souhaitons par exemple afficher tous les enregistrements de la table nommée 'table' pour lesquels le champ intitulé 'champ_id' est égal à 'notre-planete.info' :
$requete = "SELECT * FROM table WHERE champ_id = 'notre-planete.info'";
$resultat = mysql_query ($requete);
Cet exemple suffit pour comprendre comment PHP s'interface avec MySQL : une requête SQL est passée en argument de la fonction
mysql_query (), cette requête est ici déclarée avant dans une variable de type chaîne de caractères.
De la même façon, on pourrait effectuer une requête de suppression, d'ajout...
Récupérer un enregistrement avec la clause SELECT
Notons que le résultat de la requête se trouve dans la variable nommée
$res. Ce résultat peut ensuite être exploité comme en témoigne l'exemple ci-dessous :
$ligne = mysql_fetch_assoc($resultat);
echo 'le premier enregistrement a pour id '.$ligne["id"].' et pour type '.$ligne["type"];
Ce qui donnera :
le premier enregistrement a pour id notre-planete.info et pour type site Internet
Pour récupérer les valeurs des champs d'un enregistrement, on utilise donc la fonction
mysql_fetch_assoc() qui retourne l'enregistrement en cours sous la forme d'un tableau associatif.
Exploiter plusiquers enregistrements avec la clause SELECT
En effet, si notre requête retourne plusieurs enregistrements, il suffit d'effectuer une boucle
while qui lira tous les enregistrements jusqu'au dernier pour affichage, exploitation...
Nous prendrons ici l'exemple de l'affichage des 4 premières actualités du portail
notre-planete.info présentes en
page d'accueil du site. Voici le code utilisé (en admettant que nous sommes déjà connectés à notre base)
$requete = "SELECT * FROM table_actualites ORDER BY champ_date DESC LIMIT 4"; // on limite à 4 le nombre d'enregistrements souhaité
// envoi de la requête
$resultat = mysql_query($requete) or die ('Erreur '.$requete.' '.mysql_error());
// tant qu'il y a un enregistrement, les instructions dans la boucle s'exécutent
while ($ligne = mysql_fetch_assoc($resultat)) {
$date = date( "d/m", strtotime($ligne['champ_date'])); // on convertit la date dans un format lisible
$news .= '<br /><font color="#0000ff"><b>'.$date.'</b></font> <a href="http://www.notre-planete.info/actualites/actualites/actu_'.$ligne['champ_numero'].'.php">'.$ligne['champ_actu'].'</a>'; // mise en place d'un lien sur le titre et ajout dans la variable $news
}
echo $news; // affichage de la variable $news qui s'est enrichie à chaque passage dans la boucle d'une actualité
Nous constatons que la fonction
mysql_fetch_assoc() permet de récupérer les valeurs de l'enregistrement en cours tout en passant au suivant une fois la fonction appelée. C'est à dire qu'il n'est pas utile (comme en ASP par exemple) d'indiquer que l'on souhaite maintenant lire le prochain enregistrement, ils sont lus séquentiellement.
Notons qu'il n'est pas possible de "revenir en arrière", au premier enregistrement à lire avec cette méthode.
Le résultat sera le suivant :
04/02 De l'électricité à partir de la pression atmosphérique
03/02 L’effet de serre à la lumière de l’histoire géologique
02/02 Journée mondiale des zones humides
01/02 Les poissons de la Baltique trop toxiques pour être vendus en Europe
Avec ces quelques fonctions, nous sommes donc capables d'interfacer facilement PHP avec MySQL, les limites étant celles de vos connaissances en algo et en MySQL ;-)
Les principales fonctions MySQL en PHP
| Fonction | Description |
| mysql_close() | ferme la connexion MySQL |
| mysql_connect() | ouvre une connexion à un serveur MySQL |
| mysql_error() | renvoie l'erreur MySQL rencontrée |
| mysql_fetch_array() | retourne une ligne de résultat sous la forme d'un tableau associatif |
| mysql_fetch_assoc() | lit une ligne de résultat dans un tableau associatif |
| mysql_fetch_row() | découpe une ligne de résultat en un tableau |
| mysql_free_result() | libère la mémoire du résultat de la dernière requête |
| mysql_num_rows() | renvoie le nombre d'enregistrements résultants d'une requête de type SELECT |
| mysql_query() | envoie une requête SQL |
| mysql_select_db() | sélectionne une base de données MySQL |
les fonctions ci-dessus ont été sélectionnées pour leur emploi courant dans les requêtes aux bases MySQL. Vous trouverez plus de détails sur leurs fonctionnalités sur le site officiel
PHP Hypertext Preprocessor où toutes les fonctions PHP sont expliquées et commentées en français :-)
Détaillons quelque peu la fonction
mysql_num_rows() qui permet de compter le nombre d'enregistrements retournés par une requête de sélection pour mentionner par exemple le nombre de
photos de phénomènes naturels disponibles sur le portail
notre-planete.info
$requete = "SELECT * FROM table_photos WHERE champ_categorie='phenomenes_naturels'";
$resultat = mysql_query($requete) or die ('Erreur '.$requete.' '.mysql_error());
$nombre = mysql_num_rows($resultat);
echo $nombre.' photos de phénomènes naturels disponibles !';
Ce qui nous donnera :
105 photos de phénomènes naturels disponibles !
Récapitulons : se connecter et effectuer une requête
Prenons l'exemple d'une visualisation de toutes les actualités en environnement de l'année en cours sur le portail
notre-planete.info
Nous choisirons ici de privilégier l'inclusion du fichier contenant les identifiants pour se connecter à la base de données, pour les raisons évoquées
précedemment
Contenu du fichier id_connect.inc.php :
$serveur = "mysql.netalya.com";
$nom_base = "coursPHP";
$login = "cours";
$motdepasse = "php";
mysql_connect ($serveur,$login,$pwd) or die ('ERREUR '.mysql_error());
Inclusion et requête :
echo '<table>'; //les actualités seront mises dans un tableau
// on récupère les identifiants de connexion à la base de données via l'inclusion du fichier id_connect.inc.php
include ($_SERVER["DOCUMENT_ROOT"]."/inc/id_connect.inc.php");
$annee = 2005; //annee souhaitée
$rubrique = "environnement"; //rubrique affichée
//requête de sélection
$requete = "SELECT * FROM champ_actualites WHERE categorie='$rubrique' AND YEAR(date)=$annee ORDER BY date DESC";
$resultat = mysql_query($requete) or die ('Erreur '.$requete.' '.mysql_error());
$n = mysql_num_rows($resultat);
for($i=0;$i<$n;$i++) {
$ligne = mysql_fetch_row($resultat);
$date = date("d/m", strtotime($ligne[2]));
$liste .= '<tr><td';
if ($i%2==0)
$liste .= ' bgcolor="#eeeeee"';
$liste .= '><font color="#00216A"><b>'.$date.'</b></font> - <a href="actu_'.$ligne[0].'.php">'.$ligne[4].'</a></td></tr>';
}
echo $liste.'</table>';
Cet exemple complet introduit de nouveaux éléments :
- on peut directement insérer des variables PHP dans la requête ce qui nous donne plus de souplesse avec des requêtes dynamiques qui peuvent par exemple prendre en compte une préférence utilisateur via un formulaire
- l'utilisation de la fonction mysql_fetch_row retourne les valeurs de l'enregistrement en cours sous forme d'un tableau indexé avec des nombres. A ce titre, si dans la structure de notre table le premier champ est le "numéro" de l'actualité, on le récupérera via la variable "$ligne[0]" (les indices commencant à 0)
Enfin, voyons comment s'effectuent d'autres types de requêtes sur une base de données : effacement, mise à jour...
Nous vous informons que ce cours constitue une œuvre protégée en France
par le Code de la Propriété Intellectuelle, et à l’étranger par les
conventions internationales en vigueur sur le droit d’auteur. La
violation de l’un des droits d’auteur de l’œuvre est un délit de
contrefaçon.
Il est donc interdit, à titre privé ou public, de reproduire, copier,
vendre, revendre ou exploiter, que ce soit dans un but commercial ou
purement gratuit, ce cours, sauf accord exprès et préalable de son
auteur.