pb de doublon suite select

Eléphanteau du PHP | 16 Messages

31 janv. 2010, 23:05

Bonsoir à tous,
j'ouvre un nouveau topic pour mon autre pb ;

quand je fais un select pour lister les categories et sous-categories voilà ce que j'ai :

categorie 1
sous-categorie 1
sous-categorie 2
sous-categorie 3....
categorie 1 (il me met un doublon a cause de mon 2eme select pour afficher la suite des catégories ! )
categorie 2....

alors que j'aimerais ceci :
categorie 1
sous-categorie 1
sous-categorie 2
sous-categorie 3....
on reprend à la categorie suivante
categorie 2....

si vous avez une idée !
merci par avance :)
Modifié en dernier par vincentpablo02 le 02 févr. 2010, 22:34, modifié 1 fois.

Avatar du membre
Administrateur PHPfrance
Administrateur PHPfrance | 13231 Messages

31 janv. 2010, 23:57

Bonsoir,

Je suis désolé, mais j'ai égaré ma boule de crystal, est-ce que tu pourrais nous montrer ta requête SQL ( et éventuellement le code PHP) qui te permet de récupérer tout ça ? ;)
Connaître son ignorance est la meilleure part de la connaissance
Pour un code lisible : n'hésitez pas à sauter des lignes et indenter

twitter - site perso - Github - Zend Certified Engineer

ViPHP
ViPHP | 5462 Messages

01 févr. 2010, 01:40

Bonsoir,

Je suis désolé, mais j'ai égaré ma boule de crystal, est-ce que tu pourrais nous montrer ta requête SQL ( et éventuellement le code PHP) qui te permet de récupérer tout ça ? ;)

Code : Tout sélectionner

apt-get install crystal-ball
:mrgreen:

Eléphanteau du PHP | 16 Messages

01 févr. 2010, 22:00

#-o ce serait peut être mieux effectivement !
:)

le pb c'est que je fais un simple select :
$query = 'select ID, categorie
        from categorie order by ID';
$query = mysql_query($sql);
 $result = mysql_numrows($query);
      if ($result) {
  while ($rs = mysql_fetch_array($query)) {
ensuite je met en forme le résultat par un lien (GET) pour appeller la catégorie et rechercher les sous-catégories rattachées :
if (isset($_GET['categorie_ID'])){

$ID_categorie = $_GET['categorie_ID'];

$sql2 = 'select categorie.categorie, sous_categorie.sous_categorie, sous_categorie.ID
        from categorie, sous_categorie where sous_categorie.ID_categorie=categorie.ID and sous_categorie.ID_categorie="'.$ID_categorie.'"';
$query2 = mysql_query($sql2);
 $result2 = mysql_numrows($query2);
      if ($result2>0) {
echo '<div id="sous_categorie">';

  while ($rs2 = mysql_fetch_array($query2)) {

echo ''.$rs2['sous_categorie'].' .....


c'est là que ca devient complexe pour moi ! car si je veux afficher ensuite en dessous la suite des catégories comment faire sans avoir a recommencer depuis le début ??

Eléphanteau du PHP | 16 Messages

02 févr. 2010, 18:02

bonjour
zeus, pas solution ? :priere:

Eléphanteau du PHP | 16 Messages

02 févr. 2010, 22:34

j'ai trouvé une solution qui me va bien : le javascript !
trouvé sur ce site qui me sauve la mise http://www.css-faciles.com
merci quand même ! :wink:
<html>
    <head>
      <style type="text/css">
        #monmenu {font-family: trebuchet ms, arial, tahoma, verdana, sans-serif; font-size: 90%; font-weight:bold;}
        #monmenu ul ul {display: none; left: 144px; top: -1px; position: absolute; margin:0px; padding: 0px; border: 1px solid #B0B0B0;}
        #monmenu li {list-style-type: none; position: relative; width: 140px; background-color: #E0E0E0; padding: 2px; margin: 0px}
        #monmenu li:hover, #monmenu li.sfhover {background-color: #FFFF70;}
        #monmenu li a {text-decoration:none;}
        #monmenu li:hover ul.niveau2, #monmenu li li:hover ul.niveau3, #monmenu li.sfhover ul.niveau2, #monmenu li li.sfhover ul.niveau3 {display: block}
        #monmenu li.plus {background-position:right; background-image: url(illustrations/ fdroite.gif); background-repeat: no-repeat; border-bottom: 1px solid #B0B0B0;}
      </style>
      <!--[if lt IE 7]>
        <script type="text/javascript">
            // Fonction destinée à remplacer le "LI:hover" pour IE 6
            sfHover = function() {
                var sfEls = document.getElementById("monmenu").getElementsByTagName("li");
                for (var i=0; i<sfEls.length; i++) {
                    sfEls[i].onmouseover = function() {
                        this.className = this.className.replace(new RegExp(" sfhover"), "");
                        this.className += " sfhover";
                    }
                    sfEls[i].onmouseout = function() {
                        this.className = this.className.replace(new RegExp(" sfhover"), "");
                    }
                }
            }
            if (window.attachEvent) window.attachEvent("onload", sfHover);
        </script>
        <style type="text/css">
            #monmenu li {width: 144px;}
        </style>
     <![endif]-->
     <meta name="keywords"
 content="CSS, cascading style sheets, mise en page, design, site, web, techniques, sites, webmaster, page">
     <meta name="description"
 content="Voici un exemple de code de menu hiérarchique déroulant réalisé à l'aide de CSS.">
     <title>Exemple de menu hiérarchique en CSS</title>
  </head>
  <body>
    <div id="monmenu">
        <ul class="niveau1">
           <li> Menu
               <ul class="niveau2">
                  <li class="plus">
                    <a href= "http://www.rankspirit.com">
                       <img alt=" " src="illustrations/ menu-deroulant/ bebe.gif"
 border="none">
                       Extras
                    </a>
                    <ul class="niveau3">
                      <li>
                        <a href= "http://www.rankspirit.com">
                            <img alt=" " src="illustrations/ menu-deroulant/ note.gif"
 border="none">
                           Demander la note
                         </a>
                        </li>
                        <li>
                            <a href= "http://www.rankspirit.com">
                                <img alt=" "
 src="illustrations/ menu-deroulant/ serveuse.gif"
 border="none">                 Draguer la serveuse
                            </a>
                        </li>
                    </ul>
                  </li>
                  <li>
                    <a href= "http://www.rankspirit.com">
                        <img alt=" "
 src="illustrations/ menu-deroulant/ entree.gif"
 border="none">
                        Entrée
                    </a>
                  </li>
                  <li>
                    <a href= "http://www.rankspirit.com">
                        <img alt=" "
 src="illustrations/ menu-deroulant/ plat.gif"
 border="none">
                        Plat
                    </a>
                  </li>
                  <li>
                     <a href= "http://www.rankspirit.com">
                        <img alt=" "
 src="illustrations/ menu-deroulant/ dessert.gif"
 border="none">
                        Dessert
                     </a>
                   </li>
                   <li>
                      <a href= "http://www.rankspirit.com">
                        <img alt=" "
 src="illustrations/ menu-deroulant/ cafe.gif"
 border="none">         Café
                      </a>
                   </li>
                </ul>
              </li>
        </ul>
    </div>
  </body>
</html>

Eléphanteau du PHP | 16 Messages

02 févr. 2010, 23:55

j'ai crié victoire trop vite !! ne fonctionne pas sous IE 8 #-o

je vous remets mon code qui ne va pas :
<?php
  $sql2 = 'select categorie.categorie, sous_categorie.sous_categorie, sous_categorie.ID
        from categorie, sous_categorie where sous_categorie.ID_categorie=categorie.ID';
$query2 = mysql_query($sql2);
 $result2 = mysql_numrows($query2);
      if ($result2) { 
  while ($rs2 = mysql_fetch_array($query2))
  {
    echo '
        <ul class="niveau1">
           <li>
            <img alt=" " src="images/plus.gif" border="none"><a href="index.php?categorie_ID='.$rs2['ID'].'" class="lien" target="_parent">'.$rs2['categorie'].'</a>

        <ul class="niveau2">
                  <li class="plus">
                        <a href="index.php?sous_categorie='.$rs2['sous_categorie'].'" class="lien" target="_parent">'.$rs2['sous_categorie'].'</a>
                    </a>
                  </li>
               </ul>
            </li>
        </ul>
    </div>';

 }
} else {
   echo 'pas de catégorie trouvée';
 }
?>
le résultat voulu est :
* catégorie 1
- sous catégorie 1
- sous catégorie 2...
*catégorie 2.....

mais ce n'est pas le cas car je ne sais pas faire de boucle !

ViPHP
ViPHP | 5462 Messages

03 févr. 2010, 00:15

faut faire 2 boucle

tu boucles sur les categories qui elle boucles leur sous categories

Avatar du membre
Modérateur PHPfrance
Modérateur PHPfrance | 10684 Messages

03 févr. 2010, 21:05

Tu peux en effet faire une première boucle sur tes catégories, puis, pour chaque catégorie aller chercher les sous-catégories qui lui sont associées. C'est sans doute l'algorythme le plus simple. L'inconvénient, c'est que cela va te faire un nombre de requêtes proportionnel au nombre de catégories dans ta base, ce qui d'un point de vue performance est loin d'être terrible.

Je te recommande donc de ne faire qu'une seule requête et de laisser le traitement de mise en page à php tel que tu as commencé. Ce qui te manque, c'est simplement une variable temporaire ou stocker la catégorie courrante, que tu pourras afficher lorsqu'elle change :
$categorie = '' ; // valeur initiale, vide par défaut
while ($rs2 = mysql_fetch_assoc($query2))  { // si tu utilises uniquement les noms des champs pour accéder aux donnée, _assoc est plus léger que _array

   if ($categorie != $rs2['categorie']) { // tu rencontres une nouvelle catégorie
      echo $rs2['categorie'] . "<br />"; // affiche la catégorie
      $categorie = $rs2['categorie']; // stocke la nouvelle catégorie dans la variable temporaire
   }

   echo $rs2['sous_categorie'] . "<br />";
}
Voici la base de ta boucle... à partir de là, tu peux avec quelques conditions bien placées ouvrir et fermer tes listes quand il le faut :)
Ce n'est pas en améliorant la bougie que l'on a inventé l'ampoule...

Eléphanteau du PHP | 16 Messages

03 févr. 2010, 22:27

Merci Ryle

Je ne voyais pas cela comme ca ! :?
en même temps, on est dans la rubrique débutant ! :D
je teste de suite :wink:

Eléphanteau du PHP | 16 Messages

03 févr. 2010, 22:35

alors là merci !
exactement ce que je voulais - c'est souvent le plus simple qui est le plus inaccessible !!!
=D>