Trackin
php013
Maintenant que les tables de votre base de données sont créées, nous allons pouvoir voir comment faire pour pouvoir interroger cette base de données, et par conséquent afficher les résultats sur vos pages WEBAvant de plonger à l'inconnu dans le code PHP pour faire ces interrogations, nous allons voir comment s'effectuent ces interrogations par le biais de requêtes SQL.
Et pour ce faire, nous allons nous baser sur l'exemple que nous avons suivi lors du tutorial sur l'introduction aux bases de données.
Je vous rappelle que l'on avait alors deux tables qui peuvent être représentées ainsi :
La table liste_proprietaire :
N. du propriétaire | Propriétaire | N. tél |
1 | LA GLOBULE | 06-48-85-20-54 |
2 | Jeremy | 06-85-98-78-12 |
3 | Benoît | 06-47-01-59-36 |
La table liste_disque :
N. du propriétaire | Auteur | Titre |
1 | Cassius | Au rêve |
1 | Daft Punk | Discovery |
2 | Cassius | Au rêve |
2 | Télépopmusik | Genetic world |
3 | Clamaran | Release yourself |
2 | Bob Sinclar | Paradise |
Nous allons alors interroger la table pour connaître par exemple le numéro de téléphone de LA GLOBULE.
On aura alors (en SQL je vous le rappelle, on verra plus tard comment obtenir le même résultat dans une page WEB) :
FROM liste_proprietaire
WHERE nom="LA GLOBULE";
Etudions ce code :
- on sélectionne l'attribut que l'on désire obtenir (ici l'attribut telephone qui correspond effectivement au numéro de téléphone des propriétaires).
- on utilise la table liste_proprietaire pour faire notre sélection (en fait, on n'a besoin que de cette table pour faire notre sélection, on verra plus tard que la clause FROM peut contenir plusieurs tables, notamment dans le cas des jointures).
- on impose une condition, en effet, on veut le téléphone de qui ? De LA GLOBULE, donc en écrivant WHERE nom="LA GLOBULE", on impose au SGBD de ne sélectionner dans notre table que les tuples qui possèdent l'attribut nom qui est égal à LA GLOBULE. En revanche, en n'écrivant pas cette ligne, on aurai obtenu tous les numéros de téléphone de notre table (car dans ce cas, on n'aurait eu aucune condition quand au nom du propriétaire).
Etudions maintenant le cas ou l'on effectue une sélection lorsque l'on doit effectuer une jointure entre deux tables.
Interrogeons alors notre base de données pour connaître le nom des propriétaires de l'album Au rêve de Cassius.
On aura alors :
FROM liste_proprietaire, liste_disque
WHERE liste_disque.auteur = "Cassius"
AND liste_disque.titre = "Au rêve"
AND liste_proprietaire.numero = liste_disque.numero
ORDER BY liste_proprietaire.proprietaire ASC;
Etudions ce code :
- on sélectionne l'attribut proprietaire (ce que l'on veut obtenir) tout en indiquant que cet attribut faire partie de la table liste_proprietaire (ceci se fait grâce au . qui relie le nom de l'attibut à la table). En revanche, ici, il n'est pas vraiment nécessaire de préciser que l'on sélectionne l'attribut proprietaire de la table liste_proprietaire puisque cet attribut de table n'apparaît que dans une seule table (en l'occurrence la table liste_proprietaire).
En effet, si l'attribut proprietaire avait existe dans plusieurs tables, nous aurions dû préciser de quelle table il s'agit (le SGBD n'aurait pas su de quelle table l'attribut dont nous parlons fait partie). Toutefois, je vous recommande chaudement (sauf dans les cas extrêmement simple, de toujours préciser au SGBD à quelle table appartient l'attribut que vous sélectionnez).
- On utilise les tables liste_proprietaire et liste_disque pour faire notre requête.
- On fait notre recherche sur la liste de disque en ne retenant que les disques dont l'auteur est Cassius.
- Puis on retient les disques dont le titre est Au rêve.
- Ensuite (le plus important), on effectue une jointure entre les tables, en disant que l'attribut numero de la table liste_proprietaire correspond à l'attribut numero de la table liste_disque.
- Enfin, on impose au SGBD de nous fournir les résultats dans l'ordre alphabétique des noms de propriétaire (et ceci grâce à la clause ORDER BY).
Notes :
- Pour organiser les résultats suivant l'ordre inverse de l'ordre alphabétique, on aurait pu mettre en dernière condition, la condition ORDER BY liste_proprietaire.proprietaire DESC.
- La clause ORDER BY est également valable dans le cas d'attribut numérique. Dans ce cas, le SGBD organise les résultats suivant un ordre croissant (lorsque l'on met ASC à la fin) ou décroissant (lorsque l'on met DESC à la fin).
- Cette astuce fonctionne également dans le cas où l'attribut est de type date.
Remarque :
Nous avons que dans nos requêtes SQL nous pouvions imposer au SGBD de ne sélectionner que les tuples dont on impose la valeur de certains attributs (comme par exemple en imposant que l'attribut auteur soit égal à Cassius par le biais de la ligne WHERE liste_disque.auteur = "Cassius").
En revanche, nous pouvons également faire une recherche en n'imposant pas réellement la valeur de l'attribut mais plutôt en ne sélectionnant que les tuples dont l'attribut commence par une certaine chaîne de caractères ou bien même de ne sélectionner que les tuples dont l'attribut ne fait que contient une chaîne de caractères. Tout ceci se fera grâce à la clause LIKE.
Prenons l'exemple suivant :
FROM liste_proprietaire, liste_disque
WHERE liste_disque.auteur LIKE "C%"
AND liste_disque.titre = "Au rêve"
AND liste_proprietaire.numero = liste_disque.numero
ORDER BY liste_proprietaire.proprietaire ASC;
Dans ce cas, nous n'avons plus la ligne WHERE liste_disque.auteur = "Cassius" mais la ligne WHERE liste_disque.auteur LIKE "c%".
Ce changement implique que nous allons choisir non pas les disques dont l'auteur est Cassius mais les disques dont l'auteur commence par la lettre c.
On aurait également pu faire :
FROM liste_proprietaire, liste_disque
WHERE liste_disque.auteur LIKE "%s%"
AND liste_disque.titre = "Au rêve"
AND liste_proprietaire.numero = liste_disque.numero
ORDER BY liste_proprietaire.proprietaire ASC;
Et dans ce cas, nous aurions sélectionné les tuples dont l'attribut auteur de la table liste_disque contient la lettre s.
Remarque :
La clause LIKE n'est pas limitée à une seule lettre. En effet, on peut très bien faire un LIKE avec un mot complet.
Maintenant que vous connaissez tout de la sélection de tuples en langage SQL, nous allons voir comment intégrer ces requêtes SQL à vos pages PHP.
Créons une page PHP nous permettant de réaliser exactement la même requête que la première de ce tutorial, c'est-à-dire la sélection du numéro de téléphone de LA GLOBULE.
On a alors le code suivant :
exemple1
- <?php
- // on se connecte à notre base
- $base = mysql_connect ('serveur', 'login', 'pass');
- mysql_select_db ('ma_base', $base) ;
- ?>
- <html>
- <head>
- <title>Numéro de téléphone de LA GLOBULE</title>
- </head>
- <body>
- <?php
- // lancement de la requete
- $sql = 'SELECT telephone FROM liste_proprietaire WHERE nom = "LA GLOBULE"';
- // on lance la requête (mysql_query) et on impose un message d'erreur si la requête ne se passe pas bien (or die)
- $req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
- // on recupere le resultat sous forme d'un tableau
- $data = mysql_fetch_array($req);
- // on libère l'espace mémoire alloué pour cette interrogation de la base
- mysql_free_result ($req);
- mysql_close ();
- ?>
- Le numéro de téléphone de LA GLOBULE est :<br />
- <?php echo $data['telephone']; ?>
- </body>
- </html>
06-48-85-20-54
Mettons maintenant dans le cas où l'interrogation de la base de données ne retourne pas un, mais un certain nombre de tuples (nombre que l'on ne connaît pas).
En effet, recherchons tous les noms de propriétaires de disque, ainsi que leur numéro de téléphone.
On aura alors le code suivant :
exemple2
- <?php
- // on se connecte à notre base
- $base = mysql_connect ('serveur', 'login', 'pass');
- mysql_select_db ('ma_base', $base) ;
- ?>
- <html>
- <head>
- <title>Nom et tél des membres</title>
- </head>
- <body>
- <?php
- // lancement de la requête (on impose aucune condition puisque l'on désire obtenir la liste complète des propriétaires
- $sql = 'SELECT telephone, nom FROM liste_proprietaire';
- // on lance la requête (mysql_query) et on impose un message d'erreur si la requête ne se passe pas bien (or die)
- $req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
- // on va scanner tous les tuples un par un
- while ($data = mysql_fetch_array($req)) {
- // on affiche les résultats
- echo 'Nom : '.$data['nom'].'<br />';
- echo 'Son tél : '.$data['telephone'].'<br /><br />';
- }
- mysql_free_result ($req);
- mysql_close ();
- ?>
- </body>
- </html>
Et ainsi, grâce à la boucle while, nous pouvons parcourir tous les tuples obtenus par la requête SQL.
Pour finir, nous pouvons juste dire que lorsque l'on effectue une sélection qui contient une jointure, le principe reste exactement le même.
Que faire en plus ?
Afin d'améliorer vos sélections, vous pouvez faire dépendre vos sélections du résultat obtenu par un formulaire.
En effet, imaginons une première page avec un formulaire nous permettant de choisir le nom d'un propriétaire via un menu déroulant. Ensuite, dans la page où vous allez faire votre requête (qui donc être également la page contenue dans le champ action de votre formulaire), vous allez récupérer une variable, par exemple $_POST['nom_proprio'] (cf. le tutorial sur la récupération des données par le biais des formulaires).
De plus, imaginons que l'on désire retrouver le numéro de téléphone de ce propriétaire (celui choisi dans le menu-déroulant).
On aura alors (page pointée par le champ action du formulaire):
exemple3
- <?php
- // on se connecte à notre base
- $base = mysql_connect ('serveur', 'login', 'pass');
- mysql_select_db ('ma_base', $base) ;
- ?>
- <html>
- <head>
- <title>Numéro de téléphone du membre choisi</title>
- </head>
- <body>
- <?php
- // on teste si notre variable est déclarée
- if (isset($_POST['nom_proprio'])) {
- // lancement de la requête
- $sql = 'SELECT telephone FROM liste_proprietaire WHERE nom = "'.$_POST['nom_proprio'].'"';
- // on lance la requête (mysql_query) et on impose un message d'erreur si la requête ne se passe pas bien (or die)
- $req = mysql_query($sql) or die('Erreur SQL !<br />'.$sql.'<br />'.mysql_error());
- // on récupère le résultat sous forme d'un tableau
- $data = mysql_fetch_array($req);
- // on libère l'espace mémoire alloué pour cette interrogation de la base
- mysql_free_result ($req);
- mysql_close ();
- // on affiche le résultat
- echo 'Le numéro de téléphone est : '.$data['telephone'];
- }
- else {
- echo 'La variable nom_proprio n'est pas déclarée';
- }
- ?>
- </body>
- </html>
Ouf On a enfin fini ce tutorial primordial.