Proposé par Nadine
Dans les bases de données un peu complexe, il est souvent nécessaire de faire des jointures de table quand on se retrouve avec une relation de 1 à n. Ce système permet de relier plusieurs tables par leurs id afin d’éviter d’alourdir inutilement la base de données.
Nous allons voir comment Dreamweaver permet de créer une jointure de tables très facilement, pratiquement sans taper de code.
Principe des jointures de tables
Prenons le cas d’un catalogue de livres où l’on veut rentrer les renseignements suivants : titre du livre, nom et prénom de l’auteur, collection à laquelle appartient le livre
Le premier réflexe quand on ne connait pas les bases de données serait de créer une seule table contenant toutes ces informations :
| id_livre | titre_livre | nom_auteur | prenom_auteur | collection |
| 1 | Les fourmis | Werber | Bernard | Le livre de poche |
| 2 | Mercure | Nothomb | Amélie | Le livre de poche |
| 3 | Robert des noms propres | Nothomb | Amélie | Albin Michel |
| 4 | Sans feu ni lieu | Vargas | Fred | J’ai lu |
| 5 | Debout les morts | Vargas | Fred | J’ai lu |
| 6 | Le jour des fourmis | Werber | Bernard | Albin Michel |
CE N’EST PAS LA BONNE SOLUTION !
En effet, on voit que les informations concernant les auteurs et la collection sont dupliquées et alourdissent inutilement la base. Pour 5 livres du même auteur, on rentre 5 fois les informations concernant son nom et son prénom, avec tous les risques de faute de frappe que cela représente…
Avec la méthode Merise, on crée 3 tables :
- une table pour les collections,
- une table pour les auteurs,
- une table livres dans laquelle on ajoute seulement l’identifiant correspondant à l’auteur et celui correspondant à la collection.
TABLE AUTEURS
| id_auteur | nom_auteur | prenom_auteur |
| 1 | Werber | Bernard |
| 2 | Nothomb | Amélie |
| 3 | Vargas | Fred |
TABLE COLLECTIONS
| id_collection | collection |
| 1 | Le livre de poche |
| 2 | Albin Michel |
| 3 | J’ai lu |
TABLE LIVRES
| id_livre | titre_livre | id_auteur | id_collection |
| 1 | Les fourmis | 1 | 1 |
| 2 | Mercure | 2 | 1 |
| 3 | Robert des noms propres | 2 | 2 |
| 4 | Sans feu ni lieu | 3 | 3 |
| 5 | Debout les morts | 3 | 3 |
| 6 | Le jour des fourmis | 1 | 2 |
Création des tables
On crée une base « bouquins » et on crée la structure de ces 3 tables avec phpMyAdmin.
#
# Structure de la table `auteurs`
#
CREATE TABLE auteurs (
id_auteur int(11) NOT NULL auto_increment,
nom_auteur varchar(255) NOT NULL default »,
prenom_auteur varchar(255) NOT NULL default »,
PRIMARY KEY (id_auteur)
) TYPE=MyISAM;
# ——————————————————–
#
# Structure de la table `collections`
#
CREATE TABLE collections (
id_collection int(11) NOT NULL auto_increment,
collection varchar(255) NOT NULL default »,
PRIMARY KEY (id_collection)
) TYPE=MyISAM;
# ——————————————————–
#
# Structure de la table `livres`
#
CREATE TABLE livres (
id_livre int(11) NOT NULL auto_increment,
titre_livre varchar(255) NOT NULL default »,
id_auteur int(11) NOT NULL default ’0′,
id_collection int(11) NOT NULL default ’0′,
PRIMARY KEY (id_livre)
) TYPE=MyISAM;
On insère les noms et prénoms de nos trois auteurs et les noms des collections dans leurs tables respectives (On verra ensuite comment utiliser un formulaire d’insertion pour insérer d’autres enregistrements).
Par contre, on laisse la table livres totalement vide. On remplira cette table directement avec un formulaire d’insertion.{mospagebreak }
Formulaires d’insertion
Après avoir créé la structure des tables, on revient dans Dreamweaver MX. On définit un site, on configure le serveur d’évaluation, puis on crée une page insertion_livres.php et on établit une connexion MySQL avec la base de données (voir le tutorial Application dynamique avec Dreamweaver MX).
On crée deux jeux d’enregistrements : jeu_auteurs et jeu_collections qui sélectionnent tous les enregistrements triés par ordre alphabétique par rapport au nom des auteurs et à l’intitulé des collections.


Dans la page insertion_livre.php, on insère ensuite un formulaire d’insertion d’enregistrement un peu particulier, comme suit :
On met le champ id_livre en champ masqué sans indiquer de valeur puisqu’il s’auto-incrémente (on aurait pu d’ailleurs le supprimer tout simplement, cela revient au même).
On laisse le champ titre_livre en champ de texte.
Pour le champ id_auteur, on demande Afficher en tant que menu et on clique sur Propriétés.

On coche Charger les éléments du menu depuis la base de données, et on précise les options ci-dessous :

On procède de même avec le champ id_collection. (On demande Afficher en tant que menu, on clique sur Propriétés, Charger les éléments du menu depuis la base de données, et on demande d’afficher le nom de la collection dans l’étiquette et l’id de la collection dans les valeurs).
On déplace ensuite le champ titre_livre en dernière position avec la flèche noire Déplacer l’élément vers le bas de la liste.

Tester la page. On doit voir dans les menus déroulants la liste des auteurs et la liste des collections.
Insérer le nom des 6 livres de la table. Vérifier en affichant ensuite la table dans phpMyAdmin qu’elle correspond à ce qui était indiqué dans la rubrique « Principe des jointures de table ».
Il nous reste à régler le cas où l’auteur ou la collection n’existe pas encore dans la table correspondante. La solution la plus simple est de créer deux pages « insertion_auteur.php » et « insertion_collection.php » dans lesquelles on va insérer des formulaires d’insertion simples avec un retour sur la page « insertion_livre.php ».

Ensuite dans la page insertion_livre.php, on crée deux liens hypertextes vers ces deux pages à côté des deux menus déroulants.

Changer le texte HTML généré automatiquement par Dreamweaver (id_auteur, id_collection et titre_livre) par des appellations plus lisibles. Par exemple, renommer « id_auteur » en « auteur », « id_collection » en « collection » et « titre_livre » en » titre du livre ».
Tester en ajoutant un livre avec un nouvel auteur et une nouvelle collection (ex : Un merveilleux malheur de Boris Cyrulnik aux éditions odile jacob).{mospagebreak }
Création d’un jeu d’enregistrement « avancé »
Il va falloir maintenant créer une page affichant un tableau avec la liste des livres, leurs auteurs et leur collection (page « liste_livres.php »).
Pour cela, il faut créer un jeu d’enregistrements en utilisant l’option Avancé, pour lancer une requête SQL faisant la jointure des 3 tables.
pour créer la ligne « FROM auteurs,collections,livres », il faut cliquer sur chacune des tables puis sur SELECT.

Pour créer la ligne « WHERE auteurs.id_auteur », il faut cliquer sur l’id_auteur dans la table auteurs puis sur WHERE.

Pour créer la ligne « ORDER BY livres.titre_livre », il faut cliquer sur le champ qui va vous servir à trier les enregistrements puis sur ORDER BY.

Cliquer sur ok après avoir tapé (ou généré) le code suivant :
SELECT * FROM auteurs, collections, livres WHERE auteurs.id_auteur=livres.id_auteur AND collections.id_collection=livres.id_collection ORDER BY livres.titre_livre
Vous devez obtenir un jeu d’enregistrement comprenant tous les champs des 3 tables.
Affichage d’une liste.
Il nous reste maintenant à créer une page affichant un tableau avec la liste des livres, leurs auteurs et leur collection (page « liste_livres.php »).
Insérer un tableau de 3 colonnes et 2 rangées et transformer la première rangée en cellules d’entête. Faire un cliquer/glisser dans les cellules du tableau pour insérer les éléments correspondant du jeu d’enregistrement :

Sélectionner ensuite la deuxième rangée (de <tr> à </tr>) et demander une Région répétée en affichant tous les enregistrements.
Vos livres sont désormais affichés par ordre alphabétique. N’oubliez pas d’ajouter une feuille de style pour améliorer la présentation.

Merci, de pouvoir m’aider de la sorte, à mieux comprendre le Bases de données mysql.
14 juil 2009 @ 14:39
bonjour et merci pour ce super tuto bien expliqué.
j’ai une demande particulière, pourrait-on avoir un tuto ds le même genre pour pouvoir afficher un résultat de requète par rapport à un choix d’une autre table, donc en utilisant la jointure de table comme expliqué ici.
je m’explique, j’ai une liste de modeles de voitures dans une table, avec un champ idmodele, et une table marque avec un champ idmarque pour faire correspondre les 2, par exemple la 1ere table bmw, peugeot, et la 2eme table 320,325,106,206.
je voudrais en sélectionnant dans une liste déroulante une marque, bmw, être redirigé sur une autre liste où serait là énuméré 320 et 325.
j’espère être assez clair ds mes explications, je n’arrive pas à jouer avec la jointure des jeux d’enregistrements.
merci d’avance de votre aide précieuse, peut-être que cela pourrait faire l’objet d’un nouveau tuto pour aider tout le monde, merci encore.
15 juin 2010 @ 22:26