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 :

Table composant :

Table composition (qui fait le liens entre produit et composant et qui indique donc de quoi est composé chaque produit) :

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 :
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 :

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 :
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 :

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.
Partager