Affichage résultat requête avec jointure.

Fermé
yulione Messages postés 39 Date d'inscription mardi 25 février 2014 Statut Membre Dernière intervention 27 octobre 2019 - Modifié le 17 avril 2017 à 18:40
yulione Messages postés 39 Date d'inscription mardi 25 février 2014 Statut Membre Dernière intervention 27 octobre 2019 - 14 mai 2017 à 22:30
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 :

les images ne fonctionnent pas à chaque fois voici la structure de la table :
Champ 1 = "produit_id"
Champ 2 = "produit_nom"
Champ 3 = "produit_format"
Champ 4 = "produit_type"
Champ 5 = "produit_description"
Champ 6 = "produit_difficulté"
Champ 7 = "produit_image"
Champ 8 = "produit_video"


Table composant :

les images ne fonctionnent pas à chaque fois voici la structure de la table :
Champ 1 = "id"
Champ 2 = "nom_composant"
Champ 3 = "prix"

Table composition (qui fait le liens entre produit et composant et qui indique donc

les images ne fonctionnent pas à chaque fois voici la structure de la table :
Champ 1 = "id_produit"
Champ 2 = "id_composant"
Champ 3 = "quantite"

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


A voir également:

5 réponses

yulione Messages postés 39 Date d'inscription mardi 25 février 2014 Statut Membre Dernière intervention 27 octobre 2019
13 mai 2017 à 21:09
Sur l'id produit par exemple?
0
jordane45 Messages postés 38144 Date d'inscription mercredi 22 octobre 2003 Statut Modérateur Dernière intervention 21 avril 2024 4 650
14 mai 2017 à 04:24
Bonjour,

Le GROUP BY ne pourra rien pour toi dans ce cas...

Pour obtenir l'affichage que tu souhaites ... il faut (au choix)
- Jouer avec des IF pour voir si le "produit" précédent est le même que celui que tu vas afficher ou non...
- ou, (perso je préfère...) retravailler l'array de sorti pour l'organiser comme tu le souhaites.

En gros, tu as les deux exemples ici :
https://forums.commentcamarche.net/forum/affich-34566332-probleme-pour-afficher-une-double-requete-avec-php-mysql
0
yulione Messages postés 39 Date d'inscription mardi 25 février 2014 Statut Membre Dernière intervention 27 octobre 2019
14 mai 2017 à 22:30
Merci à tous les deux.

Je vais tester vos conseils et reviendrai vous dire si j'ai réussi ou non.
0
forum92 Messages postés 220 Date d'inscription lundi 6 juillet 2015 Statut Membre Dernière intervention 14 août 2018 133
13 mai 2017 à 20:57
Bonjour,
Si je comprends bien .. tu souhaites regrouper tes résultats par composants et par produits ....
je rajouterai donc un groupBy à ta requete SQL
-1

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
forum92 Messages postés 220 Date d'inscription lundi 6 juillet 2015 Statut Membre Dernière intervention 14 août 2018 133
14 mai 2017 à 00:44
Bonsoir,
Oui tout à fait
groupBy IdProduit

( Attention le groupBy ne peut s'effectuer que sur un champs qui est déjà dans le select)
-1