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 :

liste déroulante alimentée par BDD [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    73
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mai 2006
    Messages : 73
    Points : 45
    Points
    45
    Par défaut liste déroulante alimentée par BDD


    voila mon souci , j ai une table "lieux" qui me permet de creer un lieu ou un sous-lieu

    ------------------
    - lieux -----------
    -----------------
    - id_lieux -
    - nom_lieux -
    - lieux_lie -
    ------------------

    je m 'explique :

    je veux creer un lieu , il aura pour parametre s
    > lieux = 1 , nom_lieux = "garage" , lieux_lie = 0 (indique que c'est un lieu "maitre")
    puis dans ce lieu "maitre" je creer un sous lieu
    >
    > lieux = 2 , nom_lieux = "salle de repos" , lieux_lie = 1
    donc le sous-lieu "salle de repos" est affecté au lieu "maitre" garage

    sachant que lieux est unique car il est auto-incémenté

    j'espere que cette explication a été clair


    De plus a partir de cela je veux faire une liste deroulante avec une "hierarchisation" des lieux et sous lieux (cf moteur recherche de developpez.com)

    exemple:

    garage
    ----salle repos
    ----accueil
    etc....

    j ai essayer de faire du code mais je stocke toutes les valeurs mais je n arrive pas à faire de " "


    voici mon code :
    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
    <?php 
     
    $requete_lieux="
    SELECT * FROM lieux
    ORDER BY id_lieux,lieux_lie ;";
     
     
     //tri par ordre croissant les lieux liées au lieu "maître"
    $resultat_lieux = mysql_query($requete_lieux);
    if ($resultat_lieux == FALSE)
    {
            echo "echec requete <BR>";
    	echo $resultat_lieux;
    }
    else
    {
    echo"<select name='nom_lieux' rowspan=2 width= 50 size=7>";
    //affiche la liste déroulante correspondant au lieu
    //que je vais chercher dans ma table lieux
     
    while($ligne_lieux = mysql_fetch_array($resultat_lieux))
    {
     
     
    echo "<option value='".$ligne_lieux['nom_lieux']."' ";
    if( @$_POST['nom_lieux']==$ligne_lieux['nom_lieux'] )
    {
    	echo " selected ";
    }
    	if(( @$_POST['nom_lieux']==$ligne_lieux['nom_lieux']) )
    	{
    		echo " selected ";
    	}
    	echo ">".$ligne_lieux['nom_lieux']."</option>";
     
    	}
    	echo "</select>";
     }
    ?>

    MErci d'avance !!

  2. #2
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 83
    Points : 35
    Points
    35
    Par défaut slt
    slt sans avoir vu de prés ton code, si j'ai bien suivi il faut que tu revoi te structure de base de donné pour faire cela ...

    car ta table de sous-lieu ne comporte pas d'info sur le lieu "maitre" dans lequel il est compris ... et donc il y aura forcément un souci pour redessiner la hierarchie non ?


    ou alor puisque je voi que tu n'a qu'une seul table ... à la place des valeur 0 ou 1 dans lieu_lie met plutot 0 pour un lieu maitre et l'id du lieu maitre dans lequel celui ci est inclu pour un lieu ... euh qui n'est pas maitre ... (comment tu l'apel déja ... )


    que veu tu dire précisément par "je n arrive pas à faire de "&nbsp;""


    et pkoi tu fait deux foi le meme :

    if( @$_POST['nom_lieux']==$ligne_lieux['nom_lieux'] )
    {
    echo " selected ";
    }

    (a part les parenthèse qui change) ?

  3. #3
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    73
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mai 2006
    Messages : 73
    Points : 45
    Points
    45
    Par défaut
    en faite qd c'est un lieu "maitre" dans la case "lieux_lie" je mets la valeur 0 comme çà des que je vois que cette case et à 0
    je sais obligatoirement que c'est un lieu "maitre" et pas un "sous lieu"

  4. #4
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 83
    Points : 35
    Points
    35
    Par défaut
    oui ça j'avai bien compri, mai quand c'est un sous lieu, comment sais tu a quel lieu maitre il appartient ?

  5. #5
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    73
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mai 2006
    Messages : 73
    Points : 45
    Points
    45
    Par défaut
    bé en faite on sait que c'est un sous lieu qd "lieux_lie" != 0
    la valeur de "lieux_lie" = 1 ou 2 ou 3 ....
    cella indique que ce sous lieu est affecté au id_lieux 1 ,2 ou 3 ....

    tu comprends?

    vu que id_lieux est unique

  6. #6
    Nouveau membre du Club
    Profil pro
    Inscrit en
    Mai 2007
    Messages
    83
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2007
    Messages : 83
    Points : 35
    Points
    35
    Par défaut
    oui oui je comprend tout a fait c'est ce que j'ai suggérer en deuxieme mai tu avai pas dit que c'étai déja fait

    ou alor puisque je voi que tu n'a qu'une seul table ... à la place des valeur 0 ou 1 dans lieu_lie met plutot 0 pour un lieu maitre et l'id du lieu maitre dans lequel celui ci est inclu pour un sou-lieu

    bon ensuite ... ton code... :p (t'a de la chance je sui de bon humeur et j'ai le temp ^^ lol)

    que veu tu dire précisément par "je n arrive pas à faire de "&nbsp;""


    et pkoi tu fait deux foi le meme :

    if( @$_POST['nom_lieux']==$ligne_lieux['nom_lieux'] )
    {
    echo " selected ";
    }

    (a part les parenthèse qui change) ?

    d'abord le code a incéré dans la balise pour que le champ soit sélectioné est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ...    selected="selected" />
    je croi

  7. #7
    Membre éclairé Avatar de grabriel
    Inscrit en
    Septembre 2006
    Messages
    946
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 946
    Points : 730
    Points
    730
    Par défaut
    Salut,

    Ce que tu veux faire c'est plus un système d'arborescence dans ton select... pour faire ca moi je passe par une fonction récursive, je sais pas si c'est la meilleur solution mais ca marche. en dessous du pseudo code pour réaliser ton arbo :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    //recup de tous les lieux niveau 1 (qui n'ont pas de père)
    $result=bd_query("select lieux where lieux_lie=0");
    while ($row=bd_fetch_array($result)){
            echo $row["nom_lieux"];
            retourneFils($row["id_lieux"]);
    }
     
    retourneFils(int id_lieuxpere){
               $result=bd_query("select lieux where lieux_lie=id_lieuxpere");
               while($row=bd_fetch_array($result)){
                    echo "&nbsp;&nbsp;---".$row["nom_lieux"];
                    retourneFils($row["id_lieux"]);
                }
    }

  8. #8
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    73
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mai 2006
    Messages : 73
    Points : 45
    Points
    45
    Par défaut
    Citation Envoyé par guian
    oui oui je comprend tout a fait c'est ce que j'ai suggérer en deuxieme mai tu avai pas dit que c'étai déja fait




    bon ensuite ... ton code... :p (t'a de la chance je sui de bon humeur et j'ai le temp ^^ lol)

    que veu tu dire précisément par "je n arrive pas à faire de "&nbsp;""


    et pkoi tu fait deux foi le meme :

    if( @$_POST['nom_lieux']==$ligne_lieux['nom_lieux'] )
    {
    echo " selected ";
    }

    (a part les parenthèse qui change) ?

    d'abord le code a incéré dans la balise pour que le champ soit sélectioné est :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    ...    selected="selected" />
    je croi

    oups désolé autant pr moi

    sinon me suis raté dans le copier coller hihi

  9. #9
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    73
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mai 2006
    Messages : 73
    Points : 45
    Points
    45
    Par défaut
    Citation Envoyé par grabriel
    Salut,

    Ce que tu veux faire c'est plus un système d'arborescence dans ton select... pour faire ca moi je passe par une fonction récursive, je sais pas si c'est la meilleur solution mais ca marche. en dessous du pseudo code pour réaliser ton arbo :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    //recup de tous les lieux niveau 1 (qui n'ont pas de père)
    $result=bd_query("select lieux where lieux_lie=0");
    while ($row=bd_fetch_array($result)){
            echo $row["nom_lieux"];
            retourneFils($row["id_lieux"]);
    }
     
    retourneFils(int id_lieuxpere){
               $result=bd_query("select lieux where lieux_lie=id_lieuxpere");
               while($row=bd_fetch_array($result)){
                    echo "&nbsp;&nbsp;---".$row["nom_lieux"];
                    retourneFils($row["id_lieux"]);
                }
    }
    j y avais bien penser a la recursivité mais bon c'est pas ma tasse de thé
    je vais tester cela en tout cas merci de votre aide à tout les deux

  10. #10
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    73
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mai 2006
    Messages : 73
    Points : 45
    Points
    45
    Par défaut
    bd_query , tu veux dire mysql_query non??
    idem pour bd_fetch_array ??

    A part cela j ai du mal avec la recursivité

  11. #11
    Membre éclairé Avatar de grabriel
    Inscrit en
    Septembre 2006
    Messages
    946
    Détails du profil
    Informations forums :
    Inscription : Septembre 2006
    Messages : 946
    Points : 730
    Points
    730
    Par défaut
    bd_query , tu veux dire mysql_query non??
    idem pour bd_fetch_array ??
    Ouais j'avais la fleme de remonter pour voir quel base tu utilisais donc j'ai mis bd.

    A part cela j ai du mal avec la recursivité
    T'as du mal a comprendre? C'est pas si compliqué surtout que là y'a 10 lignes de code.

    Si on reprends le bout de code :

    En premier lieu tu construis une boucle qui liste tes lieux racine (ceux qui n'ont pas de père) et que tu reconnais parceque lieux_lie à la valeur 0.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    //recup de tous les lieux niveau 1 (qui n'ont pas de père) 
    echo "<select>";
    $result=bd_query("select lieux where lieux_lie=0"); 
    while ($row=bd_fetch_array($result)){  
    echo "<option value=\"".$row["nom_lieux"]."\">".$row["nom_lieux"]."</option>\n"; 
    }  
    echo "</select>";
    Donc pour l'instant t'as un select avec tes lieux racine.

    Pour l'instant c'est tout simple.

    Après tu te dis je veux rajouter les fils des lieux père donc ceux qui sont au niveau 1 sachant que les racines sont au niveau 0.

    Donc tu reprends ta boucle et tu rajoutes une autre boucle pour avoir les fils directe de la racine :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    //recup de tous les lieux niveau 1 (qui n'ont pas de père) 
    echo "<select>";
    $result=bd_query("select lieux where lieux_lie=0"); 
    while ($row=bd_fetch_array($result)){  
    echo "<option value=\"".$row["nom_lieux"]."\">".$row["nom_lieux"]."</option>\n"; 
     
    $result2=bd_query("select lieux where lieux_lie=".$row["id_lieux"].""); 
    while ($row2=bd_fetch_array($result2)){  
    echo "<option value=\"".$row2["nom_lieux"]."\">---".$row2["nom_lieux"]."</option>\n"; 
    } 
    }  
    echo "</select>";
    Avec ce code tu auras une liste avec les lieux racine et les lieux fils de premier niveau.

    Une boucle imbriquée c'est pas très evident à lire, ca fait du code pas très propre je vais en faire une fonction.

    Donc tu reprends ton premier morceaux de code et tu rajoutes ta fonction que tu appel retourneFils.

    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
    //recup de tous les lieux niveau 1 (qui n'ont pas de père) 
    echo "<select>";
    $result=bd_query("select lieux where lieux_lie=0"); 
    while ($row=bd_fetch_array($result)){  
    echo "<option value=\"".$row["nom_lieux"]."\">".$row["nom_lieux"]."</option>\n"; 
     
    retourneFils();
     
    }  
    echo "</select>";
     
    function retourneFils(id_lieuxpere){ 
     $result2=bd_query("select lieux where lieux_lie=id_lieuxpere");
     while($row2=bd_fetch_array($result2)){  
    echo "<option value=\"".$row2["nom_lieux"]."\">---".$row2["nom_lieux"]."</option>\n"; 
    } 
    }
    ";

    Maintenant ton code est plus propre mais t'as toujours le même résultat une liste de lieux racine avec un seul niveau de fils.

    Si tu regarde ta fonction tu es dans la meme situation que dans le premier morceau de code i.e. tu déplie qu'un niveau. Et pour avoir le niveau du dessous, tu vas pas refaire une boucle mais tu vas rappeler la fonction que tu as déjà écrite.

    Ce qui donne :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    function retourneFils(id_lieuxpere){ 
     $result2=bd_query("select lieux where lieux_lie=id_lieuxpere"); while($row2=bd_fetch_array($result)){  
    echo "<option value=\"".$row2["nom_lieux"]."\">---".$row2["nom_lieux"]."</option>\n"; 
     
    retourneFils($row2["id_lieux"]);
     
    } 
    }
    avec ca j'espère que t'y vois plus claire.

    J'ai pas testé le code, ni relu mon texte donc il se peux qu'il y ait des erreurs et des fautes d'orthographe.

    Par contre pour ce qui est du selected il faudra que tu rajoutes un ligne pour tester quel est l'élément à selectionner dans ta fonction et dans ta première boucle.

  12. #12
    Membre du Club
    Inscrit en
    Mai 2006
    Messages
    73
    Détails du profil
    Informations personnelles :
    Âge : 41

    Informations forums :
    Inscription : Mai 2006
    Messages : 73
    Points : 45
    Points
    45
    Par défaut
    impecc cela marche merci de tes explications tres bien construites qui m'a permis
    de mieux comprendre la recursivité !!


    bye @+

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

Discussions similaires

  1. Réponses: 4
    Dernier message: 28/12/2009, 15h37
  2. Réponses: 12
    Dernier message: 05/12/2008, 14h30
  3. [AJAX] lier deux listes déroulantes alimenté par une base de données (Mysql)
    Par arnaudperfect dans le forum Général JavaScript
    Réponses: 2
    Dernier message: 23/04/2007, 01h06
  4. Réponses: 1
    Dernier message: 20/03/2007, 09h24
  5. [AJAX] Comment rafraîchir une liste déroulante alimentée par ajax
    Par lodan dans le forum Général JavaScript
    Réponses: 5
    Dernier message: 11/03/2007, 09h01

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