La boucle while retourn plusieurs données
Résolu
delavega470
Messages postés
298
Date d'inscription
Statut
Membre
Dernière intervention
-
yg_be Messages postés 23541 Date d'inscription Statut Contributeur Dernière intervention -
yg_be Messages postés 23541 Date d'inscription Statut Contributeur Dernière intervention -
bonjour , j'ai un souci avec ce code il retourne plusieurs fois les meme choses
<?php include 'ca/codes/bdcon.php'; $req_join = 'SELECT DISTINCT P.id_cata,lib_cata,img_prod,lib_prod FROM marque M LEFT JOIN produit P ON M.id_marq = P.id_marq LEFT JOIN catalogue CA ON CA.id_cata = P.id_cata LEFT JOIN couleur CO ON CO.id_prod = P.id_prod WHERE statu_cata=1 order by lib_cata'; $envoi = $bd->query($req_join); print_r($req_join); while ($data=$envoi->fetch()) { echo ' <li> <a class="mega-title" href="#" rel="nofollow noopener noreferrer" target="_blank">'.$data['lib_cata'].'</a></li> <li> <a href="#" rel="nofollow noopener noreferrer" target="_blank">'.$data['lib_prod'].' </a></li>'; } ?>
A voir également:
- La boucle while retourn plusieurs données
- Fuite données maif - Guide
- Supprimer les données de navigation - Guide
- Trier des données excel - Guide
- Sauvegarde des données - Guide
- La base de données de sécurité du serveur n'a pas de compte d'ordinateur pour la relation ✓ - Forum Réseau
20 réponses
yg_be
Messages postés
23541
Date d'inscription
Statut
Contributeur
Dernière intervention
Ambassadeur
1 584
bonsoir, et ainsi?
si tu veux une aide plus précise, je te suggère de décrire la structure de tes tables, et les "mêmes choses" retournées.
nous ne voyons pas ce que tu vois, nous ne savons pas ce que tu sais.
si tu ne nous donnes pas d'information, nous ne pouvons pas les deviner.
SELECT DISTINCT lib_cata, lib_prod FROM marque M LEFT JOIN produit P ON M.id_marq = P.id_marq LEFT JOIN catalogue CA ON CA.id_cata = P.id_cata LEFT JOIN couleur CO ON CO.id_prod = P.id_prod WHERE statu_cata=1 order by lib_cata
si tu veux une aide plus précise, je te suggère de décrire la structure de tes tables, et les "mêmes choses" retournées.
nous ne voyons pas ce que tu vois, nous ne savons pas ce que tu sais.
si tu ne nous donnes pas d'information, nous ne pouvons pas les deviner.
$data['lib_cata'] retourne 6 element de meme nom c'est a dire si j'ai mis accessoire il ya plusieurs fois accessoire. je veux qu'il affiche accessoire ensuite tout les element concernant accessoire . en d'autre tourne lister les enregistrements de catalogue 'accessoire,pc...' maintenant sous accessoire on affiche le nom du produit mais pas les meme nom du produit .
ce que tu expliques est compliqué pour nous: nous connaissons lib_cata et lib_prod, et, dans ton message, tu utilises un autre vocabulaire.
il est normal que ton code te donne, par exemple:
cata1, prod1
cata1, prod2
cata2, prod1
cata3, prod1
cata1, prod3
si tu veux obtenir autre chose, tu dois, soit faire d'autres requêtes à la base de données, soit, par programme, traiter le résultat reçu pour afficher ce que tu veux.
tu peux cependant modifier la requête pour recevoir les résultats dans l'ordre, si nécessaire.
il est normal que ton code te donne, par exemple:
cata1, prod1
cata1, prod2
cata2, prod1
cata3, prod1
cata1, prod3
si tu veux obtenir autre chose, tu dois, soit faire d'autres requêtes à la base de données, soit, par programme, traiter le résultat reçu pour afficher ce que tu veux.
tu peux cependant modifier la requête pour recevoir les résultats dans l'ordre, si nécessaire.
comment je fais parce que moi je veux afficher
cata1,prod1 jusqu'a ----->prod N
cata2,prod2 jusqu'a----->prod N
cataN,prodn jusqu'a----->prod N
cata1,prod1 jusqu'a ----->prod N
cata2,prod2 jusqu'a----->prod N
cataN,prodn jusqu'a----->prod N
moi je ferais ainsi:
1) retirer lib_prod de ta requête
2) dans le while, faire une seconde requête qui va chercher tous les lib_prod correspondants au $data['lib_cata']. cette seconde requete va utiliser de nouvelles variables, disons $data2, $envoi2 et $req_join2
3) suite à cette seconde requête, faire un second while (imbriqué dans le premier), qui va traiter $data['lib_cata'] et $data2['lib_prod']
ta seconde requete serait qualque-chose comme:
cela te permettre de te familiariser avec le concept de préparation d'une requête: tu pourras préparer la seconde requête hors des while.
1) retirer lib_prod de ta requête
2) dans le while, faire une seconde requête qui va chercher tous les lib_prod correspondants au $data['lib_cata']. cette seconde requete va utiliser de nouvelles variables, disons $data2, $envoi2 et $req_join2
3) suite à cette seconde requête, faire un second while (imbriqué dans le premier), qui va traiter $data['lib_cata'] et $data2['lib_prod']
ta seconde requete serait qualque-chose comme:
SELECT DISTINCT lib_prod FROM marque M LEFT JOIN produit P ON M.id_marq = P.id_marq LEFT JOIN catalogue CA ON CA.id_cata = P.id_cata LEFT JOIN couleur CO ON CO.id_prod = P.id_prod WHERE statu_cata=1 and lib_cata = ? order by lib_prod
cela te permettre de te familiariser avec le concept de préparation d'une requête: tu pourras préparer la seconde requête hors des while.
Vous n’avez pas trouvé la réponse que vous recherchez ?
Posez votre question
j'ai retiré lib_prod ensuite l'autre explication je ne comprend pas
$req_join='SELECT lib_cata FROM marque M LEFT JOIN produit P ON M.id_marq = P.id_marq LEFT JOIN catalogue CA ON CA.id_cata = P.id_cata LEFT JOIN couleur CO ON CO.id_prod = P.id_prod WHERE statu_cata=1 order by lib_cata'; $envoi = $bd->query($req_join); while ($data=$envoi->fetch()) { echo ' <li> <a class="mega-title" href="#" rel="nofollow noopener noreferrer" target="_blank">'.$data['lib_cata'].'</a></li> <li> <a href="#" rel="nofollow noopener noreferrer" target="_blank">'.$data['lib_prod'].' </a></li>'; }
ok mais votre suggestion je n'ai pas compris je veux reussir celui la les autres exercices je les fais je suis un peu perdu c'est pour cela je poste ici
allons pas à pas je vais comprendre , une histoire de 2 boucle while , je n'ai pas encore rencontrer un probleme pareil
ok, essayons:
tu prends une copie des lignes de code qui commencent en $req_join et qui se terminent au }.
tu remplaces dans le code original les lignes de echo jusqu'au ; par le code que tu as copié
dans le code que tu viens d'insérer, tu ajoutes 2 derrière le nom de chaque variable, sauf $bd
tu remplaces le code
par
tu partages le code obtenu
tu prends une copie des lignes de code qui commencent en $req_join et qui se terminent au }.
tu remplaces dans le code original les lignes de echo jusqu'au ; par le code que tu as copié
dans le code que tu viens d'insérer, tu ajoutes 2 derrière le nom de chaque variable, sauf $bd
tu remplaces le code
$req_join2='SELECT lib_cata FROM marque M LEFT JOIN produit P ON M.id_marq = P.id_marq LEFT JOIN catalogue CA ON CA.id_cata = P.id_cata LEFT JOIN couleur CO ON CO.id_prod = P.id_prod WHERE statu_cata=1 order by lib_cata';
par
$req_join2='SELECT DISTINCT lib_prod FROM marque M LEFT JOIN produit P ON M.id_marq = P.id_marq LEFT JOIN catalogue CA ON CA.id_cata = P.id_cata LEFT JOIN couleur CO ON CO.id_prod = P.id_prod WHERE statu_cata=1 and lib_cata = "' . $data['lib_cata' ] . '" order by lib_prod';
tu partages le code obtenu
Bonjour,
A partir de ton code d'origine ...
Deux solutions s'offrent à toi ...
Soit... tu gères avec des IF pour voir si, lorsque tu parcours ta boucle, la "cata" précédente égale celle que tu vas afficher (si oui.. tu ne l'affiche pas...)
Soit .. c'est plus simple... tu passes par un tableau intermédiaire.
Un truc du genre :
A partir de ton code d'origine ...
Deux solutions s'offrent à toi ...
Soit... tu gères avec des IF pour voir si, lorsque tu parcours ta boucle, la "cata" précédente égale celle que tu vas afficher (si oui.. tu ne l'affiche pas...)
Soit .. c'est plus simple... tu passes par un tableau intermédiaire.
Un truc du genre :
<?php require_once 'ca/codes/bdcon.php'; $req_join = 'SELECT DISTINCT P.id_cata,lib_cata,img_prod,lib_prod FROM marque M LEFT JOIN produit P ON M.id_marq = P.id_marq LEFT JOIN catalogue CA ON CA.id_cata = P.id_cata LEFT JOIN couleur CO ON CO.id_prod = P.id_prod WHERE statu_cata=1 order by lib_cata'; $envoi = $bd->query($req_join); print_r($req_join); // on retravaille l'array de sorti pour avoir un array plus simple à utiliser $arrTmp = array(); while ($data=$envoi->fetch()) { $arrTmp[$data['id_cata']]['lib_cata'] = $data['lib_cata']; $arrTmp[$data['id_cata']]['prod'][] = array('img'=>$data['img_prod'],'lib_prod'=>$data['lib_prod']); } //tableau remis en forme : print_r($arrTmp); //je boucle sur le nouvel array pour faire l'affichage if(!empty($arrTmp)){ foreach($arrTmp as $id_cata=>$Cata){ echo '<li> <a class="mega-title" href="#" rel="nofollow noopener noreferrer" target="_blank">'.$Cata['lib_cata'].'</a> </li>'; $arr_prod = !empty($Cata['prod']) ? $Cata['prod'] : NULL; //si il y a des produits... if($arr_prod){ foreach($arr_prod as $prod){ echo '<li> <a class="mega-title" href="#" rel="nofollow noopener noreferrer" target="_blank">'.$prod['lib_prod'].'</a> </li>'; } } } }
je veux les placer dans un tableau j'ai essayer cela ne me donne rien de bon tout es desordonné !!!!
IMPRIMANTE ACCESSOIRE
|-------------| | ---------|
-Canon -Ecouteur
-hp -...........
ce genre d'affichage je veux
IMPRIMANTE ACCESSOIRE
|-------------| | ---------|
-Canon -Ecouteur
-hp -...........
ce genre d'affichage je veux
<?php require_once 'ca/codes/bdcon.php'; $req_join = 'SELECT DISTINCT P.id_cata,lib_cata,img_prod,lib_prod FROM marque M LEFT JOIN produit P ON M.id_marq = P.id_marq LEFT JOIN catalogue CA ON CA.id_cata = P.id_cata LEFT JOIN couleur CO ON CO.id_prod = P.id_prod WHERE statu_cata=1 order by lib_cata'; $envoi = $bd->query($req_join); //print_r($req_join); // on retravaille l'array de sorti pour avoir un array plus simple à utiliser $arrTmp = array(); while ($data=$envoi->fetch()) { $arrTmp[$data['id_cata']]['lib_cata'] = $data['lib_cata']; $arrTmp[$data['id_cata']]['prod'][] = array('img'=>$data['img_prod'],'lib_prod'=>$data['lib_prod']); } //tableau remis en forme : //print_r($arrTmp); //je boucle sur le nouvel array pour faire l'affichage if(!empty($arrTmp)){ foreach($arrTmp as $id_cata=>$Cata){ echo '<table border="1"><thead><tr><th> <li> <a class="mega-title" href="#" rel="nofollow noopener noreferrer" target="_blank">'.$Cata['lib_cata'].'</a> </li></th></tr></thead> '; $arr_prod = !empty($Cata['prod']) ? $Cata['prod'] : NULL; //si il y a des produits... if($arr_prod){ foreach($arr_prod as $prod){ echo '<tbody><tr><td><li> <a href="#" rel="nofollow noopener noreferrer" target="_blank">'.$prod['lib_prod'].' </a> </li></td></tr></tbody></table>'; } } } } ?>
les $Cata['lib_cata'] je veux les afficher en horizontal car c'est dans un menu deroulant et sous les $Cata['lib_cata'] leur produit correspondant dans les <a href="..." rel="nofollow noopener noreferrer" target="_blank"> obtenir leur id pour afficher le produit correspondant au choix de l'utilisateur
Je ne comprend pas trop....
Là actuellement .. tu créés un TABLEAU par $Cata['lib_cata']
Mais toi.. tu veux que ça soit présenté comment exactement ?
Montre nous le code HTML que tu souhaites avoir en sorti ...
par exemple :
Là actuellement .. tu créés un TABLEAU par $Cata['lib_cata']
Mais toi.. tu veux que ça soit présenté comment exactement ?
Montre nous le code HTML que tu souhaites avoir en sorti ...
par exemple :
<table> <thead> <tr> <th> TOTO</th> </tr> </thead> <tbody> <tr> <td> Produit 1 </td> <td> Produit 2 </td> <td> Produit ... </td> </tr> </tbody> </table> <table> <thead> <tr> <th> TITI </th> </tr> </thead> <tbody> <tr> <td> Produit 1 </td> <td> Produit 2 </td> <td> Produit ... </td> </tr> </tbody> </table>
ce model
<table> <thead> <tr> <th> TOTO</th> <th> TITI </th> <th> TATA </th> </tr> </tr> </thead> <tbody> <tr> <td> Produit 1 </td> <td> Produit 1 </td> <td> Produit 1 </td> </tr> <tr> <td> Produit 2 </td> <td> Produit 2 </td> <td> Produit ...</td> </tr> <tr> <td> Produit 3 </td> <td> Produit 3 </td> <td> Produit ... </td> </tr> </tbody> </table>
1 - Arrête d'éditer tes messages précédents pour y mettre ton code modifié !
Déjà parceque les messages que nous avons posté en dessous n'ont plus aucun sens.. et ensuite par-ce que c'est casse pied de sans cesse devoir scroller de bas en haut pour regarder le code ...
2 - Tu fais n'importe quoi dans ton code..... Faudrait vraiment que tu commences par (ou apprendre les bases du langage que tu ne maitrise clairement pas..... ou que tu prennes au moins le temps d'essayer de comprendre ce que tu fais ! )
Tu ne vas pas me dire que ceci ne te choque pas :
Te rends tu compte que dans la boucle ... tu génère des tbody à chaque tour de la boucle ??? .... sais tu au moins comment est sensé être structuré une TABLE html ?????
3 - Ca ne sert à rien (hormis m'agacer....) de venir poster un message toutes les deux heures pour faire des "up" .... Déjà ça ne nous fera pas répondre plus vite (bien au contraire....) et ensuite.... au lieu de faire des UP tu devrais nous montrer où tu en es. Ce n'est pas possible qu'entre 17h04 et 19h24 tu n'aies rien essayé ..... ou alors tu attend qu'on te donne le code tout fait ???? (mais là... ce n'est pas notre façon de faire habituelle !!!!! )
4 - Ta question de départ ne concernait en rien un TABLEAU. tu étais sur des listes ( <ul><li>... ).
Normalement.... tu aurais du ouvrir une nouvelle discussion et non pas poser ta "nouvelle" question dans celle là !
5 - Comme je sens que si je ne te donne pas un debut de code... tu n'avanceras pas plus... voila ;
Essaye ça
NB: Je te laisse le compléter selon tes besoins.
Merci de mettre cette discussion en Résolu et d'en ouvrir une nouvelle pour ta prochaine question.
NB² : Dans ta prochaine question... essaye de t'appliquer pour expliquer ce que tu as fait et ce que tu VEUX faire... Histoire qu'on ne perdre pas autant de temps que cette fois ci.
Déjà parceque les messages que nous avons posté en dessous n'ont plus aucun sens.. et ensuite par-ce que c'est casse pied de sans cesse devoir scroller de bas en haut pour regarder le code ...
2 - Tu fais n'importe quoi dans ton code..... Faudrait vraiment que tu commences par (ou apprendre les bases du langage que tu ne maitrise clairement pas..... ou que tu prennes au moins le temps d'essayer de comprendre ce que tu fais ! )
Tu ne vas pas me dire que ceci ne te choque pas :
foreach($arr_prod as $prod){ echo '<tbody><tr><td><li>
Te rends tu compte que dans la boucle ... tu génère des tbody à chaque tour de la boucle ??? .... sais tu au moins comment est sensé être structuré une TABLE html ?????
3 - Ca ne sert à rien (hormis m'agacer....) de venir poster un message toutes les deux heures pour faire des "up" .... Déjà ça ne nous fera pas répondre plus vite (bien au contraire....) et ensuite.... au lieu de faire des UP tu devrais nous montrer où tu en es. Ce n'est pas possible qu'entre 17h04 et 19h24 tu n'aies rien essayé ..... ou alors tu attend qu'on te donne le code tout fait ???? (mais là... ce n'est pas notre façon de faire habituelle !!!!! )
4 - Ta question de départ ne concernait en rien un TABLEAU. tu étais sur des listes ( <ul><li>... ).
Normalement.... tu aurais du ouvrir une nouvelle discussion et non pas poser ta "nouvelle" question dans celle là !
5 - Comme je sens que si je ne te donne pas un debut de code... tu n'avanceras pas plus... voila ;
Essaye ça
<?php require_once 'ca/codes/bdcon.php'; $req_join = 'SELECT DISTINCT P.id_cata,lib_cata,img_prod,lib_prod FROM marque M LEFT JOIN produit P ON M.id_marq = P.id_marq LEFT JOIN catalogue CA ON CA.id_cata = P.id_cata LEFT JOIN couleur CO ON CO.id_prod = P.id_prod WHERE statu_cata=1 order by lib_cata'; $envoi = $bd->query($req_join); //print_r($req_join); // on retravaille l'array de sorti pour avoir un array plus simple à utiliser $a_colonnes = array(); $arr_body = array(); while ($data=$envoi->fetch()) { $a_colonnes[$data['id_cata']] = $data['lib_cata']; $arr_body[] = array('img'=>$data['img_prod'],'lib_prod'=>$data['lib_prod']); } //tableau remis en forme : //print_r($arrTmp); echo "<table> <thead> <tr>"; if(!empty($a_colonnes)){ foreach($a_colonnes as $id_cata=>$Cata){ echo "<th>".$Cata."</th>"; } } echo "</tr> </thead> <tbody>"; if(!empty($arr_body)){ foreach($arr_body as $row){ echo "<tr>"; if(!empty($arr_body)){ foreach($row as $prod){ echo "<td>".$prod['lib_prod']."</td>"; } } echo "</tr>"; } } echo "</tbody> </table>"; ?>
NB: Je te laisse le compléter selon tes besoins.
Merci de mettre cette discussion en Résolu et d'en ouvrir une nouvelle pour ta prochaine question.
NB² : Dans ta prochaine question... essaye de t'appliquer pour expliquer ce que tu as fait et ce que tu VEUX faire... Histoire qu'on ne perdre pas autant de temps que cette fois ci.
Désolé si je vous agasse.