Bonjour à tous.

Voilà j'ai un petit problème qui je pense nécessite des compétences supérieures au miennes.

Le contexte :


J'ai une liste de produit. Chaque produit peut être composé de différent composant (logique)

Ceci est modélisé dans le SGBD (phpMyAdmin) de la façon suivante :

Table produits :
Nom : table produit.PNG
Affichages : 1034
Taille : 37,8 Ko


Table composant :
Nom : Table composant.PNG
Affichages : 935
Taille : 8,2 Ko


Table composition (qui fait le liens entre produit et composant et qui indique donc de quoi est composé chaque produit) :
Nom : Composition.PNG
Affichages : 925
Taille : 4,7 Ko


L'objectif :

Le but est de pouvoir afficher sur une même page tous les produits proposés ainsi que leur composition respective (dans un tableau)

ex :

Produit1 : composant1, composant2, composant3,

Produit2 : composant1, composant3,

L'execution :

Pour atteindre cet objectif j'envoie la requete suivante à ma base de données :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
 SELECT produits.produit_id, produits.produit_nom, produits.produit_type, produits.produit_difficulté, produits.produit_prix, produits.produit_image, composant.nom_composant FROM produits LEFT JOIN composition ON produits.produit_id=composition.id_produit LEFT JOIN composant ON composition.id_composant=composant.id
Qui me donne le résultat suivant :
Nom : résultat requete.PNG
Affichages : 1010
Taille : 30,1 Ko


ou avec un print_r pour être sûr que c'est bien ce qui est récupéré :

Array ( [produit_id] => 1 [0] => 1 [produit_nom] => produit1 [1] => produit1 [produit_type] => sac à main [2] => sac à main [produit_difficulté] => 1-premiers pas [3] => 1-premiers pas [produit_prix] => 10 [4] => 10 [produit_image] => produit1 [5] => produit1 [nom_composant] => composant1 [6] => composant1 )
Array ( [produit_id] => 1 [0] => 1 [produit_nom] => produit1 [1] => produit1 [produit_type] => sac à main [2] => sac à main [produit_difficulté] => 1-premiers pas [3] => 1-premiers pas [produit_prix] => 10 [4] => 10 [produit_image] => produit1 [5] => produit1 [nom_composant] => composant2 [6] => composant2 )
Array ( [produit_id] => 1 [0] => 1 [produit_nom] => produit1 [1] => produit1 [produit_type] => sac à main [2] => sac à main [produit_difficulté] => 1-premiers pas [3] => 1-premiers pas [produit_prix] => 10 [4] => 10 [produit_image] => produit1 [5] => produit1 [nom_composant] => composant1 [6] => composant1 )
Array ( [produit_id] => 2 [0] => 2 [produit_nom] => produit2 [1] => produit2 [produit_type] => pull [2] => pull [produit_difficulté] => 1-premiers pas [3] => 1-premiers pas [produit_prix] => 20 [4] => 20 [produit_image] => produit2 [5] => produit2 [nom_composant] => composant2 [6] => composant2 )
Array ( [produit_id] => 3 [0] => 3 [produit_nom] => produit3 [1] => produit3 [produit_type] => pull [2] => pull [produit_difficulté] => 2-débutant [3] => 2-débutant [produit_prix] => 15 [4] => 15 [produit_image] => produit3 [5] => produit3 [nom_composant] => [6] => )
Array ( [produit_id] => 4 [0] => 4 [produit_nom] => produit4 [1] => produit4 [produit_type] => sacoche [2] => sacoche [produit_difficulté] => 3-confirmé [3] => 3-confirmé [produit_prix] => 22 [4] => 22 [produit_image] => produit4 [5] => produit4 [nom_composant] => [6] => )
Array ( [produit_id] => 5 [0] => 5 [produit_nom] => produit5 [1] => produit5 [produit_type] => collier [2] => collier [produit_difficulté] => 4-expert [3] => 4-expert [produit_prix] => 50 [4] => 50 [produit_image] => produit5 [5] => produit5 [nom_composant] => [6] => )
Array ( [produit_id] => 6 [0] => 6 [produit_nom] => produit6 [1] => produit6 [produit_type] => sac à main [2] => sac à main [produit_difficulté] => 4-expert [3] => 4-expert [produit_prix] => 5 [4] => 5 [produit_image] => produit6 [5] => produit6 [nom_composant] => [6] => )
Array ( [produit_id] => 7 [0] => 7 [produit_nom] => produit7 [1] => produit7 [produit_type] => Sac à main [2] => Sac à main [produit_difficulté] => 4-expert [3] => 4-expert [produit_prix] => 100 [4] => 100 [produit_image] => [5] => [nom_composant] => [6] => )
Array ( [produit_id] => 8 [0] => 8 [produit_nom] => produit8 [1] => produit8 [produit_type] => sac à main [2] => sac à main [produit_difficulté] => 1-premiers pas [3] => 1-premiers pas [produit_prix] => 10 [4] => 10 [produit_image] => produit1 [5] => produit1 [nom_composant] => [6] => )

Pour afficher le résultat de cette jolie requête j'utilise ceci :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
 
<div id='produits'>
	<table class='produits sortable'>
		<tr>
			<th></th>
			<th>Nom</th>
			<th>Type</th>
			<th>difficulté</th>
			<th>Composition</th>
			<th>Prix</th>
		</tr>
	<?php 
 
		/*$produit = $produits->fetch();
		print_r($produit);*/
		$produits2 = $produits;
		while($produit = $produits->fetch())
		{
 
			?>	
			<tr>
				<td><img src=<?= $this->nettoyer("Pictures/Produits/" . $produit['produit_image'] .".jpg") ;?> alt=<?= $this->nettoyer($produit['produit_image']);?>></td>
				<td><a href=<?= "Produit/produit/" . $this->nettoyer($produit['produit_id']);?>><?= $this->nettoyer($produit['produit_nom']);?></a></td>
				<td><?= $this->nettoyer($produit['produit_type']);?></td>
				<td><?= $this->nettoyer($produit['produit_difficulté']);?></td>
				<td>
					<?= $this->nettoyer($produit['nom_composant']); /* Ici je voudrais tous les composants, pour un même produit*/?> 
				</td>
				<td><?= $this->nettoyer($produit['produit_prix']);?></td>
			</tr>
		<?php }?>
	</table>
	</div>
Ce qui me donne le résultat suivant :
Nom : résultat affichage.PNG
Affichages : 973
Taille : 51,1 Ko


Comme vous le voyez (et comme on peux s'y attendre d’ailleurs), ce code affiche chaque ligne du tableau issues de la requete, aussi, je me retrouve avec autant de ligne pour le produit 1 qu'il a de composant

Produit1 : composant 1

Produit1 : composant 2

Produit1 : composant 3

Produit2 : composant 1

Produit2 : composant 3

Ce n'est donc pas le résultat que j'attend...malheureusement.

Aussi, comment modifier mon code pour obtenir le résultat attendu ? J'ai essayé d'être aussi précis que possible afin que vous puissiez m'aider au mieux, n'hésitez pas à demander si ils vous manque des informations.

Merci de votre aide.