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 :

[SQL] Créer arborescence affichage


Sujet :

PHP & Base de données

  1. #1
    Membre à l'essai
    Inscrit en
    Février 2008
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 45
    Points : 11
    Points
    11
    Par défaut [SQL] Créer arborescence affichage
    Bonjour à tous,

    voila mon problème, j'ai une liste de Poles d'une entreprise et je souhaiterais afficher cette liste sous la forme d'une arborescence de ce type :

    PoleParent1
    -PoleEnfant1
    -PoleEnfant2
    PoleParent2
    -PoleEnfant1
    ....

    la table est sur un SQL Server : Pole_v2(ID,Label,PoleParent,IDAgentResp)

    Pour l'instant j'arrive a afficher uniquement les poles parents par exemple mais je n'arrive pas a afficher les 2 en même temps et au bon endroit.

    Merci par avance

  2. #2
    Membre éclairé Avatar de kenny.kev
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    646
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 646
    Points : 816
    Points
    816
    Par défaut
    bonjour a toi,

    Si j'ai bien compris je procèderai comme suivant :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
     
    $valParent = mysql_query('SELECT PoleParent FROM Pole_v2');
    echo '<select>';
          while ($result = mysql_fetch_array($valParent)) {
              echo '<optgroup>' . $result['PoleParent'] . '</optgroup>';
              $valEnfant = mysql_query('SELECT ID,Label FROM Pole_v2 WHERE PoleParent=' . $result['PoleParent']);
              while ($result2 = mysql_fetch_array($valEnfant)) {
                   echo '<option value="' . $result2['ID'] . '">' . $result2['Label'] . '</option>';
             }
         }
    echo '</select>';

  3. #3
    Membre à l'essai
    Inscrit en
    Février 2008
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 45
    Points : 11
    Points
    11
    Par défaut
    Bonjour,

    Merci kenny.kev ton aide m'a été précieuse. Par contre le <optgroup> ne fonctionnait pas donc j'utilise un système de listes <li> et <ol>. De plus je n'avais pas précisé que le PoleParent dans la table est l'identifiant du PoleParent et non le label mais j'ai Réussi à m'en sortir.
    Sauf pour le fait que certains Poles n'ont pas de PoleParent ni d'Enfant et donc ils ne sont pas affichés.

    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
     
    $sqlParent = "Select distinct(PoleParent) from Pole_v2 where PoleParent<>''";
    $valParent = mssql_query($sqlParent);						
    while ($result = mssql_fetch_array($valParent)) 
    {
        $idPoleParent = $result['PoleParent'];
        $sql = "select Label from Pole_v2 where ID='$idPoleParent'";
        $query = mssql_query($sql);
        $res = mssql_fetch_array($query);
        $PoleParent = $res['Label'];
     
        echo '<li>';
            echo $PoleParent;
        echo '</li>';
     
        $sqlEnfant = "Select ID,Label from Pole_v2 where PoleParent='$idPoleParent'";
        $valEnfant = mssql_query($sqlEnfant);
        while ($result2 = mssql_fetch_array($valEnfant)) 
        {
            echo '<ol>';
                echo $result2['Label'];
            echo '</ol>';
        }
    }
    Merci par avance.

  4. #4
    Membre éclairé Avatar de kenny.kev
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    646
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 646
    Points : 816
    Points
    816
    Par défaut
    c'est normal car tu as fait ta requête avec un where qui te récupère tout sauf les vides.

  5. #5
    Membre à l'essai
    Inscrit en
    Février 2008
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 45
    Points : 11
    Points
    11
    Par défaut
    Bonjour,

    oui mais cette requête permettait de récupérer que les poles parents.
    Mais de toute façon j'ai réussi, merci encore kenny.kev.
    Voici mon code qui fonctionne :
    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
     
    $sqlparent = "select distinct(Label),ID,PoleParent from Pole_v2 ";
    $valparent = mssql_query($sqlparent);
     
    while ($result = mssql_fetch_array($valparent))
    {						
       if($result['PoleParent'] == "")
       {
    	$idPoleParent = $result['ID'];
    	echo '<li>';
    	   echo $result['Label'];
    	echo '</li>';
       }
     
       $sqlEnfant = "Select ID,Label from Pole_v2 where PoleParent='$idPoleParent'";
       $valEnfant = mssql_query($sqlEnfant);
       while ($result2 = mssql_fetch_array($valEnfant)) 
       {
    	echo '<ol>';
    	   echo $result2['Label'];
    	echo '</ol>';
       }
    }

  6. #6
    Membre à l'essai
    Inscrit en
    Février 2008
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 45
    Points : 11
    Points
    11
    Par défaut
    Bonjour,

    En fait j'ai un nouveau soucis, je dois prévoir le fait qu'il peut y avoir 3 ou 4 niveaux dans l'arborescence et non 2 seulements.
    Donc il faut que j'adapte le code précédent, j'ai deja essayé pour un 3ème niveau mais j'ai un problème, les 2 dernieres lignes sont affichées 5 fois au lieu d'une seule. Donc j'imagine que c'est un problème avec la boucle donc si quelqu'un à une idée pour corriger mon code ou bien une meilleure façon de procéder je suis preneur.

    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
     
    $sqlparent = "select distinct(Label),ID,PoleParent from Pole_v2 ";
    $valparent = mssql_query($sqlparent);
     
    while ($result = mssql_fetch_array($valparent))
    {
    	if($result['PoleParent'] == "")
    	{
    		$idPoleParent = $result['ID'];
    		echo '<li>';
    			echo $result['Label'];
    		echo '</li>';
    	}
    	$sqlEnfant = "Select ID,Label from Pole_v2 where PoleParent='$idPoleParent'";
    	$valEnfant = mssql_query($sqlEnfant);
    	while ($result2 = mssql_fetch_array($valEnfant)) 
    	{
    		$idPoleParent2 = $result2['ID'];
    		echo '<dd>';
    			echo $result2['Label'];
    		echo '</dd>';
    	}
    	$sqlEnfant2 = "Select ID,Label from Pole_v2 where PoleParent='$idPoleParent2'";
    	$valEnfant2 = mssql_query($sqlEnfant2);
    	while ($result3 = mssql_fetch_array($valEnfant2))
    	{
    		echo '<dd><dd>';
    			echo $result3['Label'];
    		echo '</dd>';
    	}
    }
    Merci par avance

  7. #7
    Membre éclairé Avatar de kenny.kev
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    646
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 646
    Points : 816
    Points
    816
    Par défaut
    Au lieu de tes 'while' utilise plutot des foreach tu auras moins de problèmes.
    De plus, dans ton code lorsque tu fais un echo concataine au lieu de faire 3 echo a la suite :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    echo '<dd>';
    	echo $result2['Label'];
    echo '</dd>';
    change le en :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    echo '<dd>' . $result2['Label'] . '</dd>';
    Cela te permet d'optimiser ton site, tu gagnes en rapidité.

  8. #8
    Membre à l'essai
    Inscrit en
    Février 2008
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 45
    Points : 11
    Points
    11
    Par défaut
    Bonjour,

    ok pour la concaténation si tu veux même si c'est une petite popup donc rapide à charger.
    Mais pour le foreach, je ne l'ai utilisé qu'une fois et je ne vois pas dans le cas présent comment je peux l'utiliser, si tu peux m'aider !(mais à mon avis le foreach aura le même effet que le while)

    Merci par avance.

  9. #9
    Membre éclairé Avatar de kenny.kev
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    646
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 646
    Points : 816
    Points
    816
    Par défaut
    Voila un ami a fait ce bout de code. Tu va en fin de compte appeler une fonction récursive. Ainsi peut importe le nombre d'enfant pour une arborescence. J'ai pu tester et cela fonctionne.
    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
    <?php
    function	func_rec_arbo($idParent = 0)
    {
    	$sqlParent = mysql_query('SELECT * FROM Pole_v2 WHERE PoleParent = "' . $idParent . '"');
    	while ($resultParent = mysql_fetch_array($sqlParent))
    	{
    		echo '<li>' . $resultParent['Label'];
    		$sqlEnfant = mysql_query('SELECT * FROM Pole_v2 WHERE PoleParent=' . $resultParent['ID']);
    		$num_rows_enfant = mysql_num_rows($sqlEnfant);
    		if ($num_rows_enfant == 0)
    		{
    			echo '</li>';
    		}
    		else
    		{
    			echo '<ul>';
    			func_rec_arbo($resultParent['ID']);
    			echo '</ul>';
    		}
    	}
    }
    echo '<ul>';
    func_rec_arbo();
    echo '</ul>';
    ?>
    Surtout, Tu dois faire appelle a la fonction comme signaler dans le code. C'est à dire :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    echo '<ul>';
    func_rec_arbo();
    echo '</ul>';
    TRES IMPORTANT : ne pas donner de paramètre à l'appelle de la fonction

  10. #10
    Membre à l'essai
    Inscrit en
    Février 2008
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 45
    Points : 11
    Points
    11
    Par défaut
    Bonjour,

    Tout d'abord, désolé pour le retard mais j'avais aussi d'autres choses à faire importantes.
    Donc j'ai regardé ton code et testé mais j'ai des problèmes.
    D'une part je ne comprends pas pourquoi $idParent = 0 dans func_rec_arbo($idParent = 0)

    car dans ce cas la je n'ai aucun résultat.
    Sinon j'ai testé avec la requete suivante : 'SELECT * from Pole_v2' à la place de 'SELECT * from Pole_v2 WHERE PoleParent="'.$idParent.'"'
    et dans ce cas la, la boucle tourne indéfiniment et j'ai donc une erreur. Je ne vois pas comment faire ! Peut-être que j'appel mal la fonction ou qu'elle est mal définie, je te redonne mon code inspiré du tien :

    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
     
    	function func_rec_arbo($idParent = 0)
    	{
    		//$sqlParent = mssql_query('SELECT * FROM Pole_v2 WHERE PoleParent = "' . $idParent . '"');
    		$sqlParent = mssql_query('SELECT * FROM Pole_v2');
    		while ($resultParent = mssql_fetch_array($sqlParent))
    		{
    			echo '<li>'.$resultParent['Label'];
    			$idPoleParent = $resultParent['ID'];
    			$sqlEnfant = mssql_query('SELECT * FROM Pole_v2 WHERE PoleParent='.$idPoleParent);
    			$num_rows_enfant = mssql_num_rows($sqlEnfant);
    			if ($num_rows_enfant == 0)
    			{
    				echo '</li>';
    			}
    			else
    			{
    				echo '<ul>';
    				func_rec_arbo($idPoleParent);
    				echo '</ul>';
    			}
    		}
    	}
    ET pour l'appel, je ne mets que ça :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    echo '<ul>';
    func_rec_arbo();
    echo '</ul>';
    Merci par avance

  11. #11
    Membre éclairé Avatar de kenny.kev
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    646
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 646
    Points : 816
    Points
    816
    Par défaut
    tu peux me donné le prototypage de ta table en complet car j'ai fait les testes avec '$idParent' de type int() donc c'est peut être pour ça.

  12. #12
    Membre à l'essai
    Inscrit en
    Février 2008
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 45
    Points : 11
    Points
    11
    Par défaut
    Pole_v2(ID,Label,PoleParent,IDAgentResp)

    avec :
    -ID : int(4)
    -Label : varchar(50)
    -PoleParent : int(4)
    -IDAgentResp : int(4)

    Voila.

  13. #13
    Membre éclairé Avatar de kenny.kev
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    646
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 646
    Points : 816
    Points
    816
    Par défaut
    Dans "PoleParent" quand tu n'as pas de parents la valeur est de 0 ou non ?

    Car en gros voici comment fonctionne la fonction :

    je sélectionne tous les label qui n'ont pas de PoleParent
    tand que j'ai des valeurs
    j'affiche le libellé
    puis j'ecrase mone ancienne valeur de '$idPoleparent'
    je sélectionne les enfants du parent encours
    je teste si il y en a
    si oui je relance la fonction
    sinon je ferme la balise

    aussi un ou enregistrement type dans ta base pour que je puisse tester

  14. #14
    Membre à l'essai
    Inscrit en
    Février 2008
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 45
    Points : 11
    Points
    11
    Par défaut
    La valeur ,n'est pas de 0, elle est nulle.
    Le problème c'est que c'est une reflexive donc il ne veut pas de PoleParent égal à 0.

    Voici quelques enregistrements de ma base

    1 R&D - Development <null> <null>
    2 Professionnal Services <null> <null>
    3 Marketing and Communication 2 <null>
    4 Information System 1 <null>
    5 Alliances 1 <null>
    6 Sales EMEA 3 <null>

    Merci par avance.

  15. #15
    Membre éclairé Avatar de kenny.kev
    Homme Profil pro
    Inscrit en
    Janvier 2007
    Messages
    646
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 39
    Localisation : France, Indre et Loire (Centre)

    Informations professionnelles :
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Janvier 2007
    Messages : 646
    Points : 816
    Points
    816
    Par défaut
    Tu as bien une base de données MySQL ?
    Car je ne comprend pas tu as des valeurs "NULL" avec des int() alors que moi j'ai des 0 par default meme si la valeur par default est a "NULL".

    Mais pour toi, il te faut changer le $idPoleParent = 0 en $idPoleParent = ""
    et sa devrait fonctionner pour toi

  16. #16
    Membre à l'essai
    Inscrit en
    Février 2008
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 45
    Points : 11
    Points
    11
    Par défaut
    Ma base de données est une base SQL Server.
    J'ai fait des tests avec l'analyseur de requête, le seul moyen de récupérer les bons poles est de mettre 'PoleParent is null' car PoleParent=' ' ne fonctionne pas.
    J'ai donc adapté la requête dans le code mais même problème, la boucle est infinie.

    Je ne vois pas comment faire et cela commence a être urgent.

    Merci par avance.

  17. #17
    Membre à l'essai
    Inscrit en
    Février 2008
    Messages
    45
    Détails du profil
    Informations forums :
    Inscription : Février 2008
    Messages : 45
    Points : 11
    Points
    11
    Par défaut
    J'ai trouvé une solution, j'ai modifié ma table en supprimant la reflexive et en mettant 0 dans PoleParent pour les Pôles qui n'ont pas de parents et la ton code fonctionne.

    Merci beaucoup

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

Discussions similaires

  1. [SQL] Ordre d'affichage des lignes d'un état
    Par duboisfa dans le forum Oracle
    Réponses: 20
    Dernier message: 28/02/2006, 23h00
  2. [Sql] Format d'affichage de virgule
    Par bashou dans le forum Oracle
    Réponses: 21
    Dernier message: 24/02/2006, 09h21
  3. [requète sql] Créer une vue ordonnée
    Par gangsoleil dans le forum Langage SQL
    Réponses: 3
    Dernier message: 10/01/2006, 18h34
  4. [T-SQL] Créer fonction d'arrondi spécifique
    Par d1g-2-d1g dans le forum Langage SQL
    Réponses: 8
    Dernier message: 13/06/2005, 15h17
  5. [Export Données] [SQL] Créer un script d'export de données
    Par Tueur_a_gage dans le forum MS SQL Server
    Réponses: 2
    Dernier message: 08/03/2005, 14h31

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