IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

PHP & Base de données Discussion :

affichage résultat requête avec jointure.


Sujet :

PHP & Base de données

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre averti
    Homme Profil pro
    ingénieur
    Inscrit en
    Décembre 2016
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : ingénieur

    Informations forums :
    Inscription : Décembre 2016
    Messages : 20
    Par défaut affichage résultat requête avec jointure.
    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.

  2. #2
    Membre émérite Avatar de Willy_k
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2011
    Messages
    541
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2011
    Messages : 541
    Par défaut
    Salut,
    Peut être regarder du côté de GROUP_CONCAT ..

    Sinon pourquoi pas de tables pour type/format/difficulté du produit ?

  3. #3
    Membre averti
    Homme Profil pro
    ingénieur
    Inscrit en
    Décembre 2016
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : ingénieur

    Informations forums :
    Inscription : Décembre 2016
    Messages : 20
    Par défaut
    Bonjour et merci pour cette reponse.

    Si la solution proposée est intéressante. Je ne pense pas qu'elle réponde à mon besoin car je récupérerai un string de tout mes composants. Faire alors des liens ou seulement traiter les composants un à un serait donc très compliqué...

    Pour la question je ne suis pas sûre de la comprendre. Pourquoi ne pas mettre type format et difficultés dans des tables à part? Si c'est bien la question et bien disons que la modélisation de mon objet produit fait que pour l'instant ce n'est pas necessairé ou qu'en tout cas je n'en voie pas l'utilité pour l'instant.

  4. #4
    Membre émérite Avatar de Willy_k
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2011
    Messages
    541
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2011
    Messages : 541
    Par défaut
    Pour la question oui, tu m'as effectivement compris, mais si ça ne te gêne pas tant mieux.
    Concernant le GROUP_CONCAT, comme par défaut le séparateur est une virgule, un explode(',', xxx) sur la chaine te renverras un tableau où tu pourras traiter chaque composant..


    Edit: Retrait de la solution avec fetchAll PDO::FETCH_COLUMN+PDO::FECTH_GROUP qui ne semble pas convenir à ce que tu souhaites obtenir

  5. #5
    Membre averti
    Homme Profil pro
    ingénieur
    Inscrit en
    Décembre 2016
    Messages
    20
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    Localisation : France, Cher (Centre)

    Informations professionnelles :
    Activité : ingénieur

    Informations forums :
    Inscription : Décembre 2016
    Messages : 20
    Par défaut
    Bonjour.

    Après quelque test la solution fonctionne bien.



    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
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    	<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())
    		{
    			$composants_nom =  explode(',', $produit['GROUP_CONCAT(composant.nom_composant)']);
    			print_r($composants_nom);
    			echo '<BR>';
    			$composants_id =  explode(',', $produit['GROUP_CONCAT(composant.id_composant)']);
    			print_r($composants_id);
    			echo '<BR>';
    			?>	
    			<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>
    					<?php foreach($composants_nom as $composant_nom)
    					{
    					?>
    						<?= $this->nettoyer($composant_nom);?>
    						<BR>
    					<?php } ?>
    					<?php foreach($composants_id as $composant_id)
    					{
    					?>
    						<?= $this->nettoyer($composant_id);?>
    						<BR>
    					<?php } ?>
    				</td>
    				<td><?= $this->nettoyer($produit['produit_prix']);?></td>
    			</tr>
    		<?php }?>
    	</table>
    	</div>
    </div>
    Cependant deux choses me gênent :
    1 - ça devient un peu compliquer à gérer lorsque l'on veux récupérer et afficher plusieurs valeur de ce type (ex : récupérer le nom et l'id des éléments de la table composant. On jongle alors avec les tableaux et les foreach, ce qui est rapidement compliqué, surtout si on veux créer un lien par exemple et ou il faut donc gérer deux tableau GROUP_CONCAT à la fois).
    2 - La fonction SQL_CONCAT n'est disponible que pour MySQL. ça fonctionne certe bien dans mon cas mais j'aimerai une solution un peu moins contrainte au SGBD.

    Donc merci pour cette proposition mais j'aimerai continuer à cherche une solution de remplacement.

    Si il y d'autres idées je suis preneur !

    Merci.

  6. #6
    Membre émérite Avatar de Willy_k
    Homme Profil pro
    Développeur Web
    Inscrit en
    Juin 2011
    Messages
    541
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Côte d'Ivoire

    Informations professionnelles :
    Activité : Développeur Web
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Juin 2011
    Messages : 541
    Par défaut
    Salut, tu peux utiliser un alias pour le GROUP_CONCAT.. Tu as effectivement raison pour le GROUP_CONCAT, exclusif à MYSQL..
    Tu as quelle version de PHP?
    Essayerai de faire quelque indépendamment de la base de données (niveau perf sait pas trop)

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. [2.x] Affichage résultat requête SQL avec Twig
    Par madone dans le forum Symfony
    Réponses: 11
    Dernier message: 18/11/2014, 18h31
  2. [MySQL] Utiliser le résultat d'une requête avec jointure
    Par ksper92 dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 12/05/2011, 08h46
  3. Résultat requête avec jointure
    Par arthuro45 dans le forum MS SQL Server
    Réponses: 4
    Dernier message: 03/02/2010, 15h15
  4. Réponses: 1
    Dernier message: 30/10/2009, 08h48
  5. requête avec jointure qui renvoie des résultats bizarres
    Par Canari74 dans le forum Requêtes et SQL.
    Réponses: 0
    Dernier message: 20/05/2008, 02h13

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo