Précédent   Forum des professionnels en informatique > PHP > PHP & SGBD
PHP & SGBD Forum d'entraide sur les SGBD avec PHP. Avant de poster : FAQ BDD, toutes les FAQ PHP, cours BDD et sources BDD
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 20/02/2008, 10h38   #1
Invité régulier
 
Inscription : février 2008
Messages : 45
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 45
Points : 5
Points : 5
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
killingspree est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/02/2008, 17h13   #2
Membre chevronné
 
Avatar de kenny.kev
 
Homme
Inscription : janvier 2007
Messages : 580
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 27
Localisation : France, Indre et Loire (Centre)

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

Informations forums :
Inscription : janvier 2007
Messages : 580
Points : 696
Points : 696
Envoyer un message via MSN à kenny.kev
bonjour a toi,

Si j'ai bien compris je procèderai comme suivant :
Code :
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>';
kenny.kev est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 20/02/2008, 18h02   #3
Invité régulier
 
Inscription : février 2008
Messages : 45
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 45
Points : 5
Points : 5
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 :
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.
killingspree est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/02/2008, 09h15   #4
Membre chevronné
 
Avatar de kenny.kev
 
Homme
Inscription : janvier 2007
Messages : 580
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 27
Localisation : France, Indre et Loire (Centre)

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

Informations forums :
Inscription : janvier 2007
Messages : 580
Points : 696
Points : 696
Envoyer un message via MSN à kenny.kev
c'est normal car tu as fait ta requête avec un where qui te récupère tout sauf les vides.
kenny.kev est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/02/2008, 10h16   #5
Invité régulier
 
Inscription : février 2008
Messages : 45
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 45
Points : 5
Points : 5
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 :
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>';
   }
}
killingspree est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/02/2008, 14h11   #6
Invité régulier
 
Inscription : février 2008
Messages : 45
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 45
Points : 5
Points : 5
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 :
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
killingspree est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 21/02/2008, 20h20   #7
Membre chevronné
 
Avatar de kenny.kev
 
Homme
Inscription : janvier 2007
Messages : 580
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 27
Localisation : France, Indre et Loire (Centre)

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

Informations forums :
Inscription : janvier 2007
Messages : 580
Points : 696
Points : 696
Envoyer un message via MSN à kenny.kev
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 :
1
2
3
echo '<dd>';
	echo $result2['Label'];
echo '</dd>';
change le en :
Code :
echo '<dd>' . $result2['Label'] . '</dd>';
Cela te permet d'optimiser ton site, tu gagnes en rapidité.
kenny.kev est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 22/02/2008, 10h12   #8
Invité régulier
 
Inscription : février 2008
Messages : 45
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 45
Points : 5
Points : 5
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.
killingspree est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 23/02/2008, 14h44   #9
Membre chevronné
 
Avatar de kenny.kev
 
Homme
Inscription : janvier 2007
Messages : 580
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 27
Localisation : France, Indre et Loire (Centre)

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

Informations forums :
Inscription : janvier 2007
Messages : 580
Points : 696
Points : 696
Envoyer un message via MSN à kenny.kev
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 :
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 :
1
2
3
echo '<ul>';
func_rec_arbo();
echo '</ul>';
TRES IMPORTANT : ne pas donner de paramètre à l'appelle de la fonction
kenny.kev est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/02/2008, 17h20   #10
Invité régulier
 
Inscription : février 2008
Messages : 45
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 45
Points : 5
Points : 5
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 :
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 :
1
2
3
4
 
echo '<ul>';
func_rec_arbo();
echo '</ul>';
Merci par avance
killingspree est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/02/2008, 17h28   #11
Membre chevronné
 
Avatar de kenny.kev
 
Homme
Inscription : janvier 2007
Messages : 580
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 27
Localisation : France, Indre et Loire (Centre)

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

Informations forums :
Inscription : janvier 2007
Messages : 580
Points : 696
Points : 696
Envoyer un message via MSN à kenny.kev
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.
kenny.kev est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/02/2008, 17h31   #12
Invité régulier
 
Inscription : février 2008
Messages : 45
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 45
Points : 5
Points : 5
Pole_v2(ID,Label,PoleParent,IDAgentResp)

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

Voila.
killingspree est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/02/2008, 17h57   #13
Membre chevronné
 
Avatar de kenny.kev
 
Homme
Inscription : janvier 2007
Messages : 580
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 27
Localisation : France, Indre et Loire (Centre)

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

Informations forums :
Inscription : janvier 2007
Messages : 580
Points : 696
Points : 696
Envoyer un message via MSN à kenny.kev
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
kenny.kev est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/02/2008, 18h13   #14
Invité régulier
 
Inscription : février 2008
Messages : 45
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 45
Points : 5
Points : 5
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.
killingspree est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 25/02/2008, 21h44   #15
Membre chevronné
 
Avatar de kenny.kev
 
Homme
Inscription : janvier 2007
Messages : 580
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 27
Localisation : France, Indre et Loire (Centre)

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

Informations forums :
Inscription : janvier 2007
Messages : 580
Points : 696
Points : 696
Envoyer un message via MSN à kenny.kev
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
kenny.kev est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/02/2008, 10h23   #16
Invité régulier
 
Inscription : février 2008
Messages : 45
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 45
Points : 5
Points : 5
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.
killingspree est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 26/02/2008, 11h16   #17
Invité régulier
 
Inscription : février 2008
Messages : 45
Détails du profil
Informations forums :
Inscription : février 2008
Messages : 45
Points : 5
Points : 5
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
killingspree est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 03h18.


 
 
 
 
Partenaires

Hébergement Web