YBET

Rue Albert 1er, 7

6810 Pin - Chiny

Route Arlon - Florenville

(/fax: 061/32.00.15

Formations Webmasters YBET: créer son propre site

Magasin YBET informatique Forum webmaster Créer son propre site

12. Base de donnée relationnelle MySQL

1 Introduction - 2. Petit exemple de départ - 3. La méthode Where - 4. La méthode Join

Avant de voire les requêtes spécifiques, voyons d'abord ce qu'est une base de donnée relationnelle. Il y a d'abord "relation", le terme devrait déjà aider mais voyons plutôt une petite explication plus concrète:

Supposons un module de facturation. Il reprend d'un coté des clients, de l'autre côté des factures. A chaque facture est attachée un client. Dès lors, plutôt que d'encoder à chaque fois les coordonnées du client pour chaque nouvelle livraison, on va créer deux tables MySQL, l'une reprend la facture en elle même, l'autre la fiche du client. L'astuce est de créer une liaison entre les deux. Elle se fait généralement via un champ commun, par exemple le code. Celui-ci est repris dans les deux tables, ce qui permet de relier les deux tables entre-elles lorsque c'est nécessaire. De même, on peut créer une relation entre les codes des produits et leur fiche.

Le gros avantage est lié non seulement au gain de temps lors de l'encodage, mais aussi au gain de place dans les tables ou même à la possibilité de changer l'adresse du client sans devoir retaper toutes les anciens documents. Par contre, la clé de la relation doit être unique, pas question que la même facture soit reliée à deux clients différents.

MySQL est nativement relationnel (au même titre qu'Access, DBase, ... ou même MsSQL de Microsoft) mais nous avons déjà vu que PHP et MySQL ne sont pas en fait liés. Le langage de programmation a simplement créer des fonctions spécifiques lui permettant d'exécuter des requêtes, une sorte de symbiose plus ou moins réussie entre deux logiciels du monde "libre".

Les relations étant relativement complexes, avec de nombreuses options, cette partie de la formation est volontairement épurée de bon nombre de cas spéciaux. Si elle ne sera pas tout à fait complète, elle devrait permettre de créer et d'utiliser rapidement des commandes et des tables relationnelles

2. Petit exemple de départ

Cette partie va reprendre deux tables à créer sous easyPhp (PhPMyadmin) ou dans la base de donnée fournie avec votre hébergement. En local, créez la base de donnée RELATION.

La première table reprend l'utilisateur:

Table USER

la deuxième reprend ses messages.

La relation ressemble à ceci. Remarquez que nous n'utilisons pas le champ message_user_id comme clé primaire mais comme index. Ceci n'est pas obligatoire mais va augmenter la vitesse de traitement puisque les index et clés primaires sont déjà pré-organisés par la base de donnée. Par contre, un index permet d'entrer la même valeur dans différents enregistrements.

Entrez manuellement quelques valeurs (3 minimum) dans les 2 champs et mettant au moins un nombre égal dans user_id et message_user_id.

L'entre d'un message par un utilisateur va donc remplir 3 champs dans la table MESSAGE, par contre l'affichage va permettre d'afficher également le nom de l'utilisateur. Le premier avantage, si l'utilisateur change de nom (ou de pseudo), ses messages lui seront toujours associés. Comme nous avons créé user_id comme clé primaire, nous savons déjà que la valeur de ce champ sera unique dans la table user.

L'ouverture de la base de donnée se fait par la liste de commandes ci-dessous, elle peut éventuellement être inscrite dans un fichier en include:

<?php

if(!mysql_connect('localhost','root')){
Echo'Connection Impossible';
exit();
} else{
// Echo'Connexion réussie';
}
Mysql_select_db('relation');

?>

Deux méthodes peuvent au départ être utilisée, la mauvaise (disons plutôt l'ancienne donc à éviter):

Select user_nom, message from user, message  where user.user_id=message.message_user_id

L'autre méthode va utiliser le JOIN et la requête va être de type

SELECT ...
FROM <table de gauche> LEFT JOIN <table de droite>
ON <Condition de liaison>

Par principe, mais surtout pour éviter des problèmes si des champs ont le même nom dans les différentes tables liées et pour augmenter la vitesse de traitement, sélectionnez les champs à utiliser et nom pas "SELECT *". 

3. La méthode Where

Cette méthode n'est pas la meilleure, notamment parce que la clause WHERE va mélanger des conditions de liaisons de tables et des conditions de valeurs des champs mais débutons par celle-ci. Elle ne doit plus être utilisée. Reprenons nos tables ci-dessus.

$requete="select user_nom,message_id,message_contenu from message,user where user.user_id=message.message_user_id";
$valeur=mysql_query($requete);
while ($tableau=mysql_fetch_array($valeur)){ 
echo$tableau['user_nom']."- numéro message: ".$tableau['message_id']." - contenu:".$tableau['message_contenu']."<br />";
}

La première partie est finalement le plus important, c'est la requête qui va afficher toutes les messages de la table message en affichant le nom de l'utilisateur repris dans la table user via la relation user.user_id=message.message_user_id. Remarquez que le pour délimiter les champs en fonction de leur table, nous avons ajouter le "nom de la table." devant. Ceci peut également être fait dans les noms des champs si deux noms de champs sont identiques dans les différentes tables.

Quoique intéressante, cette requête affiche toutes les valeurs. Supposons que nous voulons uniquement les messages de l'utilisateur numéro 1, la requête va reprendre une deuxième condition dans le where.

$requete="select user_nom,message_id,message_contenu from message,user where user.user_id=message.message_user_id && user.user_id=1";

C'est le gros problème de cette méthode au niveau lecture de la requête, les conditions de jointures sont complètement mélangées avec les conditions restrictives des valeurs, mais elle fonctionne.

4. La méthode JOIN

C'est la méthode la plus propre, elle va séparer les liaisons des conditions de valeurs. Plusieurs types de jointures existent, notamment LEFT JOIN (par la gauche), RIGHT JOIN (par la droite) et INNER JOIN. Avant de commencer, nous allons créer une troisième table:

Table renseignement

Elle reprend finalement des renseignements généraux sur l'utilisateur et est liée à la table user par le champ renseignement_nom. 

4.1. INNER JOIN

C'est la jointure par défaut qui compare deux tables et retourne tous les enregistrement comportant une concordance de liaison.

Reprenons notre exemple ci-dessus et remplaçons la requête par:

$requete = "select user_nom, message_id,message_contenu from message INNER JOIN user ON user.user_id = message.message_user_id";

Ceci est exactement équivalent à la méthode where sans conditions de champs. Si nous exécutons en plus une condition de valeur (par exemple, users_id=1, la requête SQL en PHP devient:

$requete = "select user_nom, message_id, message_contenu from message INNER JOIN user ON user.user_id = message.message_user_id where user.user_id=1";

Effectivement, la méthode INNER JOIN est finalement équivalente à la condition Where standard, si ce n'est la séparation des conditions de valeurs et de liaison.

Les deux méthodes suivantes vont nous permettre de peaufiner les requêtes en signalant les directions des jointures. Elles seront plus précises, mais plus complexes. Par contre, elles vont permettre de créer des liaisons entre 3 tables avec comme relations table1 <-> table2 <-> table3, avec aucune liaisons entre les tables 1 et 2.

4.2. LEFT JOIN

Pour une liaison par la gauche, nous allons utiliser la commande LEFT Join. En plus des concordances, la commande va afficher toutes les lignes de la table de gauche, même s'il n'y a pas de concordances. Dans notre cas, les utilisateurs sans messages seront donc également affichées.

$requete = "select user_nom, message_id, message_contenu from user LEFT JOIN message ON user.user_id = message.message_user_id";

Un petit exemple d'affichage donnerait:

users 1- numéro message: 1 - contenu:message 1
users 1- numéro message: 2 - contenu:message2 de 1
utilisateur 2- numéro message: 3 - contenu:message 3
users 3- numéro message: - contenu:

4.3. Left Join sur trois tables.

Nous allons cette fois compliquer un peu en utilisant les données de 3 tables.

Le principe est d'utiliser

SELECT * FROM message
LEFT JOIN user ON (instruction)
LEFT JOIN renseignement ON (instruction)

Message est la table principale (tout affiché à cause du Left Join), elle est reliée à la table user, elle même reliée à la table renseignement.

$requete ="select * from message 
LEFT JOIN user ON user.user_id = message.message_user_id
LEFT JOIN renseignement on user.user_nom=renseignement.renseignement_nom";

Pour une table de 3 utilisateurs (users1,2 et 3 avec 2 messages pour le premier et 1 pour l'utilisateur 2 (pas pour le troisième), ceci donne:

users 1- numéro message: 1 - contenu:message 1
users 1- numéro message: 2 - contenu:message2 de 1
users 2- numéro message: 3 - contenu:message 3

4.4. Mélange.

Pour cette partie, nous allons relier nos trois tables en utilisant les parties LEFT et RIGHT JOIN. Avant toute chose, des tables complétées ou non vont afficher des résultats tout à fait différents: le contenu des liaisons sont être complètement complété. En plus, inverser la commande RIGHT avec LEFT va aussi changer les résultats.

Sur le sujet: Base relationnnelle sous Access

28. > Introduction à la programmation POO

<11 . Gérer les tables en PHP

Mise en ligne: 27/03/2008