Arborescence intervallaire

Eléphant du PHP | 71 Messages

24 août 2011, 01:35

Bonjour à tous :)

J'essai de creer une classe qui me permetrait de manipuler un arbre de ce type

Il y a une incoherence que je ne comprend pas, pouvez vous me dire ou est mon erreur ? :?

Voici une exemple :
Class arbre{

		// +--> Declaration des variables

		var $id;
		var $idgauche;
		var $iddroit;
		var $niveau;
		var $titre;
		var $nbenfants;
		var $enfants;

		// +--> Compte les noeuds enfants

		function nbenfants($niveau,$idgauche,$iddroit){

			// Cherche le nombre de noeuds enfants (niveau+1)
			$sql = "
			SELECT count(*)
			FROM   NEW_FAMILLE
			WHERE  NFM_BG > ".$idgauche."
			   AND NFM_BD < ".$iddroit."
			   AND NFM_NV = ".($niveau+1)."";
			$rsql = mysql_query($sql);
			
			if (mysql_num_rows($rsql) == 0){
				$this->id = -1; 
			}else{
				// Enregistre le nombre d'enfants
				$this->nbenfants = mysql_result($rsql, 0, "count(*)"); 
			}
		}

		// +--> Cherche le neoud racine

		function racine(){

			// Rechercher la racine (intervalle le plus grand)
			$sql = "SELECT *
			FROM NEW_FAMILLE
			WHERE  (NFM_BD - NFM_BG) = (SELECT MAX(NFM_BD - NFM_BG)
						    FROM NEW_FAMILLE)";
			$rsql = mysql_query($sql);
			
			// Si pas de racine
			if (mysql_num_rows($rsql) == 0) 
			{
				$this->id = -1; 
			}else{
				for($i=0;$i<mysql_num_rows($rsql);$i++)
				{
					// Enregistre les resultats
					$this->id = mysql_result($rsql, $i, "id"); 
					$this->iddroit = mysql_result($rsql, $i, "NFM_BG");
					$this->idgauche = mysql_result($rsql, $i, "NFM_BD");
					$this->titre = mysql_result($rsql, $i, "NFM_LIB");
					$this->niveau = mysql_result($rsql, $i, "NFM_NV");

					// Compte les enfants
					$this->nbenfants($this->niveau,$this->idgauche,$this->iddroit);
				}
			}
		}

		// +--> Cherche les neouds enfants

		function enfants($idgauche,$iddroite,$niveau,$enfant){

			// Cherche les enfants du noeud passé en parametre
			$sql = "SELECT * FROM NEW_FAMILLE
			WHERE  NFM_BG > ".$idgauche."
			   AND NFM_BD < ".$iddroite."
			   AND NFM_NV = ".($niveau+1)."";
			$rsql = mysql_query($sql);

			for($i=0;$i<mysql_num_rows($rsql);$i++){
				if($enfant == $i){
					// Enregistre les resultats
					$this->id = mysql_result($rsql, $i, "id"); 
					$this->iddroit = mysql_result($rsql, $i, "NFM_BD"); 
					$this->idgauche = mysql_result($rsql, $i, "NFM_BG"); 
					$this->niveau = mysql_result($rsql, $i, "NFM_NV"); 
					$this->titre = mysql_result($rsql, $i, "NFM_LIB");

					// Compte les enfants
					$this->nbenfants($this->niveau,$this->idgauche,$this->iddroit);

					// Cherche les noeuds enfants de chaque enfant 
					for($j=0;$j<$this->nbenfants;$j++){
						$this->enfants[$j] = new arbre;
						$this->enfants[$j]->enfants($this->idgauche,$this->iddroit,$this->niveau,$j);	
					}
				}
			}
		}

		// +--> Parcours de l'arbre complet

		function cre_arbre(){

			// Rechercher la racine (intervalle le plus grand)

			$sql = "SELECT *
				FROM NEW_FAMILLE
				WHERE  (NFM_BD - NFM_BG) = (SELECT MAX(NFM_BD - NFM_BG)
							    FROM NEW_FAMILLE)";
			$rsql = mysql_query($sql);

			if (mysql_num_rows($rsql) == 0){
				$this->id = -1; 
			}else{
				// Enregistre les resultats
				$this->id = mysql_result($rsql, $i, "id"); 
				$this->iddroit = mysql_result($rsql, 0, "NFM_BD"); 
				$this->idgauche = mysql_result($rsql, 0, "NFM_BG"); 
				$this->niveau = mysql_result($rsql, 0, "NFM_NV"); 
				$this->titre = mysql_result($rsql, 0, "NFM_LIB");

				// Compte les enfants
				$this->nbenfants($this->niveau,$this->idgauche,$this->iddroit);

				// Cherche les enfants
				for($i=0;$i<$this->nbenfants;$i++){
					$this->enfants[$i] = new arbre;
					$this->enfants[$i]->enfants($this->idgauche,$this->iddroit,$this->niveau,$i);
				}
			}
		}
	}// fin de classe
Lorsque que je fait appel à :
$arbre = new arbre();
$arbre->cre_arbre();
J'obtiens bien l'abre souhaité :

Code : Tout sélectionner

arbre Object ( [id] => 1 [idgauche] => 1 [iddroit] => 44 [niveau] => 1 [titre] => Transport [nbenfants] => 3 [enfants] => Array ( [0] => arbre Object ( [id] => 2 [idgauche] => 2 [iddroit] => 21 [niveau] => 2 [titre] => Aérien [nbenfants] => 6 [enfants] => Array
Par contre si j'appelle :
$arbre = new arbre();
$arbre->racine();
La variable 'nbenfants' n'est pas bonne :

Code : Tout sélectionner

arbre Object ( [id] => 1 [idgauche] => 44 [iddroit] => 1 [niveau] => 1 [titre] => Transport [nbenfants] => 0 [enfants] => )
Suite à de multiples echecs je me tourne vers vous, quelqun à-t-il une idée ?

Merci d'avance :wink:

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

24 août 2011, 10:41

Bonjour,

Tout d'abord il faut éviter d'utiliser le même nom pour une propriété et une méthode dans une classe et c'est le cas pour nbenfants. Même si ça n'a pas de relation directe avec ton problème.

Par ailleurs, je ne vois pas l'utilité de la boucle for dans la méthode (fonction) racine() :
                                for($i=0;$i<mysql_num_rows($rsql);$i++)
                                {
                                        // Enregistre les resultats
                                        $this->id = mysql_result($rsql, $i, "id");
                                        $this->iddroit = mysql_result($rsql, $i, "NFM_BG");
                                        $this->idgauche = mysql_result($rsql, $i, "NFM_BD");
                                        $this->titre = mysql_result($rsql, $i, "NFM_LIB");
                                        $this->niveau = mysql_result($rsql, $i, "NFM_NV");

                                        // Compte les enfants
                                        $this->nbenfants($this->niveau,$this->idgauche,$this->iddroit);
                                }
                        }
Puisque qu'il ne peut y avoir qu'une seule racine.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphant du PHP | 71 Messages

24 août 2011, 12:21

bonjour sadeq :)

Merci pour les corrections :wink:

J'ai modifier nbenfants() pour compte_enfants(), puis supprimé le for() inutile ^^
Class arbre{

		// +--> Declaration des variables

		var $id;
		var $idgauche;
		var $iddroit;
		var $niveau;
		var $titre;
		var $nbenfants;
		var $enfants;

		// +--> Compte les noeuds enfants

		function compte_enfants($niveau,$idgauche,$iddroit){

			// Cherche le nombre de noeuds enfants (niveau+1)

			$sql = "
			SELECT count(*)
			FROM   NEW_FAMILLE
			WHERE  NFM_BG > ".$idgauche."
			   AND NFM_BD < ".$iddroit."
			   AND NFM_NV = ".($niveau+1)."";
			$rsql = mysql_query($sql);
		
			if (mysql_num_rows($rsql) == 0){
				$this->id = -1; 
			}else{
				// Enregistre le nombre d'enfants
				$this->nbenfants = mysql_result($rsql, 0, "count(*)"); 
			}
		}

		// +--> Cherche le neoud racine

		function cre_racine(){

			// Rechercher la racine (intervalle le plus grand)
			$sql = "SELECT *
			FROM NEW_FAMILLE
			WHERE  (NFM_BD - NFM_BG) = (SELECT MAX(NFM_BD - NFM_BG)
						    FROM NEW_FAMILLE)";
			$rsql = mysql_query($sql);

			// Si pas de racine
			if (mysql_num_rows($rsql) == 0) {
				$this->id = -1; 
			}else{
				// Enregistre les resultats
				$this->id = mysql_result($rsql, $i, "id"); 
				$this->iddroit = mysql_result($rsql, $i, "NFM_BG");
				$this->idgauche = mysql_result($rsql, $i, "NFM_BD");
				$this->titre = mysql_result($rsql, $i, "NFM_LIB");
				$this->niveau = mysql_result($rsql, $i, "NFM_NV");

				// Compte les enfants
				$this->compte_enfants($this->niveau,$this->idgauche,$this->iddroit);
			}
		}

		// +--> Cherche les neouds enfants

		function cre_enfants($idgauche,$iddroite,$niveau,$enfant){

			// Cherche les enfants du noeud passé en parametre
			$sql = "SELECT * FROM NEW_FAMILLE
			WHERE  NFM_BG > ".$idgauche."
			   AND NFM_BD < ".$iddroite."
			   AND NFM_NV = ".($niveau+1)."";
			$rsql = mysql_query($sql);

			for($i=0;$i<mysql_num_rows($rsql);$i++){
				if($enfant == $i){
					// Enregistre les resultats
					$this->id = mysql_result($rsql, $i, "id"); 
					$this->iddroit = mysql_result($rsql, $i, "NFM_BD"); 
					$this->idgauche = mysql_result($rsql, $i, "NFM_BG"); 
					$this->niveau = mysql_result($rsql, $i, "NFM_NV"); 
					$this->titre = mysql_result($rsql, $i, "NFM_LIB");

					// Compte les enfants
					$this->compte_enfants($this->niveau,$this->idgauche,$this->iddroit);

					// Cherche les noeuds enfants de chaque enfant 
					for($j=0;$j<$this->nbenfants;$j++){
						$this->enfants[$j] = new arbre;
						$this->enfants[$j]->cre_enfants($this->idgauche,$this->iddroit,$this->niveau,$j);	
					}
				}
			}
		}

		// +--> Parcours de l'arbre complet

		function cre_arbre(){

			// Rechercher la racine (intervalle le plus grand)
			$sql = "SELECT *
				FROM NEW_FAMILLE
				WHERE  (NFM_BD - NFM_BG) = (SELECT MAX(NFM_BD - NFM_BG)
							    FROM NEW_FAMILLE)";
			$rsql = mysql_query($sql);

			if (mysql_num_rows($rsql) == 0){
				$this->id = -1; 
			}else{
				// Enregistre les resultats
				$this->id = mysql_result($rsql, $i, "id"); 
				$this->iddroit = mysql_result($rsql, 0, "NFM_BD"); 
				$this->idgauche = mysql_result($rsql, 0, "NFM_BG"); 
				$this->niveau = mysql_result($rsql, 0, "NFM_NV"); 
				$this->titre = mysql_result($rsql, 0, "NFM_LIB");

				// Compte les enfants
				$this->compte_enfants($this->niveau,$this->idgauche,$this->iddroit);

				// Cherche les enfants
				for($i=0;$i<$this->nbenfants;$i++){
					$this->enfants[$i] = new arbre;
					$this->enfants[$i]->cre_enfants($this->idgauche,$this->iddroit,$this->niveau,$i);
				}
			}
		}
	}// fin de classe
S'il y à d'autre amelioration que je peu apporter à mon code, je serait ravi des les entendres en vue d'une correction.

As-tu une idée sur le fait que la propieté 'nbenfants' soit fausse lorsque je l'appelle depuis la methode racine() ?

Merci de ton aide :D

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

24 août 2011, 16:31

Bien, mais il en reste encore, voici quelque simplifications:
1. Pour compter les enfants, je pense que les champs impliqués dans la condition WHERE sont inversés car si la droite pour toi dans le cas de la racine vaut 1 et la gauche vaut 44 alors si tu teste NFM_BD < $iddroit ce n'est pas possible car c'est comme si tu disais : NFM_BD < 1 (cas de la racine) or NFM_BD n'est jamais < 1 dans la base de données.

D'autres parts, la requête COUNT retourne toujours un seul enregistrement à un seul champ qui contient le compte soit 0 ou N. Le IF que tu fais sur mysql_num_rows est donc insignifiant.

Voici une proposition de correction:
                // +--> Compte les noeuds enfants

                function compte_enfants($niveau,$idgauche,$iddroit){

                        // Cherche le nombre de noeuds enfants (niveau+1)

                        $sql = "
                        SELECT count(*) AS NB
                        FROM   NEW_FAMILLE
                        WHERE  NFM_BG < ".$idgauche."
                           AND NFM_BD > ".$iddroit."
                           AND NFM_NV = ".($niveau+1)."";
                        $rsql = mysql_query($sql);
               
                        if ($rsql) {
                                // Enregistre le nombre d'enfants
                                $this->nbenfants = mysql_result($rsql, 0, "NB");
                        }
                }
Nota: Vaut mieux nommer les champs de calcul dans SQL avec AS. Et si cette histoire de gauche/droite n'est pas claire alors essaye de respecter l'ordre gauche/droite dans ton programme entre NFM_BD, NFM_BG et $iddroit et $idgauche et aussi dans le jeu de données dans la base.


2. Dans la fonction cre_racine() t'as oublié la variable $i orpheline à remplacer par zéro. Et il est recommandé de tester mysql_num_rows($rsql) <= 0 et non == 0 pour prendre en considération les cas d'erreur.
// +--> Cherche le neoud racine

                function cre_racine(){

                        // Rechercher la racine (intervalle le plus grand)
                        $sql = "SELECT *
                        FROM NEW_FAMILLE
                        WHERE  (NFM_BD - NFM_BG) = (SELECT MAX(NFM_BD - NFM_BG)
                                                    FROM NEW_FAMILLE)";
                        $rsql = mysql_query($sql);

                        // Si pas de racine
                        if (mysql_num_rows($rsql) <= 0) {
                                $this->id = -1;
                        }else{
                                // Enregistre les resultats
                                $this->id = mysql_result($rsql, 0, "id");
                                $this->iddroit = mysql_result($rsql, 0, "NFM_BG");
                                $this->idgauche = mysql_result($rsql, 0, "NFM_BD");
                                $this->titre = mysql_result($rsql, 0, "NFM_LIB");
                                $this->niveau = mysql_result($rsql, 0, "NFM_NV");

                                // Compte les enfants
                                $this->compte_enfants($this->niveau,$this->idgauche,$this->iddroit);
                        }
                }
à suivre ...
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

devlop78
Invité n'ayant pas de compte PHPfrance

25 août 2011, 03:53

C'est intéressant comme article, d'un point de vue performances de consultation, ça ne doit pas avoir son pareil.

Par contre, pour tout ce qui est modification, à moins de recréer tout l'arbre, je vois difficilement comment tu peux faire ... Evidemment, les modifications sont logiquement moins nombreuses que les consultations, et donc allouer beaucoup de ressources une seule fois vaut mieux qu'en allouer beaucoup plusieurs fois (je parle bien sûr pour de gros arbres).

ViPHP
ViPHP | 5462 Messages

25 août 2011, 09:45

ça marche plutôt bien le nested set, c'est pas forcement simple a comprendre

http://www.vbmysql.com/articles/databas ... a-in-mysql

et très bon slideshow sur les différente façon de faire :
http://www.slideshare.net/billkarwin/mo ... hical-data

Eléphant du PHP | 71 Messages

25 août 2011, 10:59

Bonjour à tous :)

Merci de m'avoir lu ^^

Tout d'abord merci sadeq de m'avoir fait pointé le doigt sur mon erreur !

Voci la classe modifiée :
Class arbre{

        // +--> Declaration des variables

        var $id;
        var $idgauche;
        var $iddroit;
        var $niveau;
        var $titre;
        var $nbenfants;
        var $enfants;

        // +--> Compter les enfants

        function compte_enfants($niveau,$idgauche,$iddroit){

                // Cherche le nombre de noeuds enfants (niveau+1)
                $sql = "SELECT count(*) AS NB
                FROM   NEW_FAMILLE
                WHERE  NFM_BG > ".$idgauche."
                   AND NFM_BD < ".$iddroit."
                   AND NFM_NV = ".($niveau+1)."";
                $rsql = mysql_query($sql);
       
                if ($rsql) {
                        // Enregistre le nombre d'enfants
                        $this->nbenfants = mysql_result($rsql, 0, "NB");
                }
        }

        // +--> Recuperer la racine

        function cre_racine(){

                // Cherche le neoud racine (intervalle le plus grand)
                $sql = "SELECT *
                FROM NEW_FAMILLE
                WHERE  (NFM_BD - NFM_BG) = (SELECT MAX(NFM_BD - NFM_BG)
                                            FROM NEW_FAMILLE)";
                $rsql = mysql_query($sql);

                // Enregistre les resultats
                $this->id = mysql_result($rsql, 0, "id");
                $this->idgauche = mysql_result($rsql, 0, "NFM_BG");
                $this->iddroit = mysql_result($rsql, 0, "NFM_BD");
                $this->titre = mysql_result($rsql, 0, "NFM_LIB");
                $this->niveau = mysql_result($rsql, 0, "NFM_NV");

                // Compte les enfants
                $this->compte_enfants($this->niveau,$this->idgauche,$this->iddroit);
        }

        // +--> Recuperer les enfants

        function cre_enfants($idgauche,$iddroite,$niveau,$numenfant){

                // Cherche les noeuds enfants du noeud passé en parametre
                $sql = "SELECT * FROM NEW_FAMILLE
                WHERE  NFM_BG > ".$idgauche."
                   AND NFM_BD < ".$iddroite."
                   AND NFM_NV = ".($niveau+1)."";
                $rsql = mysql_query($sql);
		
		// Si pas de d'enfants
                if (mysql_num_rows($rsql) <= 0) {
                        $this->id = -1;
		// Sinon pour chaque enfant trouvé
                }else{
	                for($i=0;$i<mysql_num_rows($rsql);$i++){
				// Et si la position de l'enfant dans l'arbre correspond à l'indice de la boucle
	                        if($numenfant == $i){
	                                // Enregistre les resultats
	                                $this->id = mysql_result($rsql, $i, "id");
	                                $this->iddroit = mysql_result($rsql, $i, "NFM_BD");
	                                $this->idgauche = mysql_result($rsql, $i, "NFM_BG");
	                                $this->niveau = mysql_result($rsql, $i, "NFM_NV");
	                                $this->titre = mysql_result($rsql, $i, "NFM_LIB");

	                                // Compte les enfants
	                                $this->compte_enfants($this->niveau,$this->idgauche,$this->iddroit);

	                                // Recupere les noeuds enfants de chaque enfant
	                                for($j=0;$j<$this->nbenfants;$j++){
	                                        $this->enfants[$j] = new arbre;
	                                        $this->enfants[$j]->cre_enfants($this->idgauche,$this->iddroit,$this->niveau,$j);      
	                                }
	                        }
	                }
		}
        }

        // +--> Parcours de l'arbre complet

        function cre_arbre(){

                // Rechercher la racine
		$this->cre_racine();

                // Cherche les enfants
                for($i=0;$i<$this->nbenfants;$i++){
                        $this->enfants[$i] = new arbre;
                        $this->enfants[$i]->cre_enfants($this->idgauche,$this->iddroit,$this->niveau,$i);
                }
        }
}// fin de classe
Mon erreur été bien une inversion mais dans la methode cre_racine() :
$this->iddroit = mysql_result($rsql, $i, "NFM_BG");
$this->idgauche = mysql_result($rsql, $i, "NFM_BD");
Je recuperait le bord droit sur le gauche et inversement, d'ou je ne trouvait pas d'enfant

Encore merci pour ton aide !
COUNT retourne toujours un seul enregistrement à un seul champ qui contient le compte soit 0 ou N. Le IF que tu fais sur mysql_num_rows est donc insignifiant.
J'essairait de voir ce retourne un methode avant d'ajouter du code inutle :wink:
Et il est recommandé de tester mysql_num_rows($rsql) <= 0 et non == 0 pour prendre en considération les cas d'erreur.
bien vu, certain que ca m'evitera des heures de recherche lorsque j'en arriverait a la gestion d'erreur.
C'est intéressant comme article, d'un point de vue performances de consultation, ça ne doit pas avoir son pareil.
Je peux poster la classe une fois complete, content de ne pas etre le seul que ca interesse :)

Merci à toi aussi pour les liens, stealth35, il y à des requetes sql interessantes, je vais les etudier ;)

Bonne journée à tous et merci encore ;)
Modifié en dernier par Moker le 25 août 2011, 11:06, modifié 1 fois.

ViPHP
ViPHP | 5462 Messages

25 août 2011, 11:04

sinon c'est normale que ta classe soit en PHP 4 ?

Eléphant du PHP | 71 Messages

25 août 2011, 11:12

lol :D

oui et non, j'ai apris php a cette epoque, j'ai changer de boulot, acheter une maison à gros traveaux et php5 est arrvié :P

ca fait plusieiurs année que je ne touchait plus au code, j'ai un peu plus temps maintenant.

Il y as beaucoup de changement sous php5 ?

Si tu as de la lecture a me proposer je serait ravi de m'y mettre ;)

ViPHP
ViPHP | 5462 Messages

25 août 2011, 11:21

juste change les var en public et mettre public devant tes function
pour ta boucle fait plutôt un while sur un mysql_fetch_object

Modérateur PHPfrance
Modérateur PHPfrance | 2575 Messages

25 août 2011, 11:52

Voici, de la lecture intéressante pour se rafraichir: http://stephaneey.developpez.com/tutori ... ouveautes/ et merci à Stephane Eyskens 8-)

Et bonne continuation.
--------//////----//---//----//////
-------//---//----//---//----//---//
------//////----//////-----//////
-----||--------||--||---||
Prendre le recul n'est pas une perte de temps.


ps: Affrontez moi dans l'arène

Eléphant du PHP | 71 Messages

25 août 2011, 14:41

Bien joué pour cette methode stealth53 :)

Voila le code en php5 donc :
<?php

	// +--> Connection à la base
	$db_host = "localhost";
	$db_user = "root"; 
	$db_pass = ""; 
	$db_name = "arbre";
	$connexion = mysql_connect($db_host, $db_user, $db_pass) or die (mysql_error());
	$db = mysql_select_db($db_name, $connexion) or die(mysql_error());

Class arbre{

        // +--> Declaration des publiciables

        public $id;
        public $idgauche;
        public $iddroit;
        public $niveau;
        public $titre;
        public $nbenfants;
        public $enfants;

        // +--> Compter les enfants

        public function compte_enfants($niveau,$idgauche,$iddroit){

                // Cherche le nombre de noeuds enfants (niveau+1)
                $sql = "SELECT count(*) AS NB
                FROM   NEW_FAMILLE
                WHERE  NFM_BG > ".$idgauche."
                   AND NFM_BD < ".$iddroit."
                   AND NFM_NV = ".($niveau+1)."";
                $rsql = mysql_query($sql);
       
                if ($rsql) {
                        // Enregistre le nombre d'enfants
                        $this->nbenfants = mysql_result($rsql, 0, "NB");
                }
        }

        // +--> Recuperer la racine

        public function cre_racine(){

                // Cherche le neoud racine (intervalle le plus grand)
                $sql = "SELECT *
                FROM NEW_FAMILLE
                WHERE  (NFM_BD - NFM_BG) = (SELECT MAX(NFM_BD - NFM_BG)
                                            FROM NEW_FAMILLE)";
                $rsql = mysql_query($sql);

                // Enregistre les resultats
                $this->id = mysql_result($rsql, 0, "id");
                $this->idgauche = mysql_result($rsql, 0, "NFM_BG");
                $this->iddroit = mysql_result($rsql, 0, "NFM_BD");
                $this->titre = mysql_result($rsql, 0, "NFM_LIB");
                $this->niveau = mysql_result($rsql, 0, "NFM_NV");

                // Compte les enfants
                $this->compte_enfants($this->niveau,$this->idgauche,$this->iddroit);
        }

        // +--> Recuperer les enfants

        public function cre_enfants($idgauche,$iddroite,$niveau){

                // Cherche les noeuds enfants du noeud passé en parametre
                $sql = "SELECT * FROM NEW_FAMILLE
                WHERE  NFM_BG > ".$idgauche."
                   AND NFM_BD < ".$iddroite."
                   AND NFM_NV = ".($niveau+1)."";
                $rsql = mysql_query($sql);

		// Si pas de d'enfants
                if (mysql_num_rows($rsql) <= 0) {
                        $this->enfants = -1;
		// Sinon pour chaque enfant trouvé
                }else{
			$i=0;
			while ($row = mysql_fetch_object($rsql)) {
			
				// Cré un nouvel objet enfant
				$this->enfants[$i] = new arbre();

			        // Enregistre les resultats
			        $this->enfants[$i]->id = $row->id;
			        $this->enfants[$i]->iddroit = $row->NFM_BD;
			        $this->enfants[$i]->idgauche = $row->NFM_BG;
			        $this->enfants[$i]->niveau = $row->NFM_NV;
			        $this->enfants[$i]->titre = $row->NFM_LIB;

                                // Compte les enfants
                                $this->enfants[$i]->compte_enfants($this->enfants[$i]->niveau,$this->enfants[$i]->idgauche,$this->enfants[$i]->iddroit);
				
				// Recupere les noeuds enfants de chaque enfant
				$this->enfants[$i]->cre_enfants($this->enfants[$i]->idgauche,$this->enfants[$i]->iddroit,$this->enfants[$i]->niveau);
				$i++;
			}
			mysql_free_result($rsql);
		}
        }

        // +--> Parcours de l'arbre complet

        public function cre_arbre(){

                // Chercher la racine
		$this->cre_racine();

                // Cherche les enfants
                $this->cre_enfants($this->idgauche,$this->iddroit,$this->niveau);
        }

}// fin de classe
C'est tout de meme plus propre !! merci a tous !
Voici, de la lecture intéressante pour se rafraichir: http://stephaneey.developpez.com/tutori ... ouveautes/ et merci à Stephane Eyskens 8-)
Merci beaucoup :)
Modifié en dernier par Moker le 25 août 2011, 15:52, modifié 1 fois.

ViPHP
ViPHP | 5462 Messages

25 août 2011, 15:11

fait plutot :
$db_host = "localhost";
$db_user = "root";
$db_pass = "*********";
$db_name = "arbre";

ini_set('mysql.trace_mode', true);
$connexion = mysql_connect($db_host, $db_user, $db_pass));
db = mysql_select_db($db_name, $connexion);

Eléphant du PHP | 71 Messages

25 août 2011, 15:57

mince j'ai laissé mon pass ^^ (Modérateur Sadeq: Je l'ai effacé)

Merci pour le code stealth35 ;)

devlop78
Invité n'ayant pas de compte PHPfrance

25 août 2011, 17:17

ça marche plutôt bien le nested set, c'est pas forcement simple a comprendre

http://www.vbmysql.com/articles/databas ... a-in-mysql

et très bon slideshow sur les différente façon de faire :
http://www.slideshare.net/billkarwin/mo ... hical-data

Ca marche plutôt bien ? Il parait certain que pour la lecture, il est "imbattable". Il est davantage compliqué, non pas dans sa conception, mais dans les méthodes à mettre en place. Il est plus algo. Dans un arbre hierarchique relationnel, le plus difficile est de construire sa représentation de consultation. Mais supprimer, ajouter ou déplacer des noeuds est d'un enfantin, et très agréable (comme DOM .. J'adore !). Mais justement cette représentation est un peu compliquée, et très lourde. Là, niveau consultation, je le trouve très intéressant, et j'ai gardé les articles sous le coude. Par contre, Algorithement, il est plus compliqué pour le reste. Lors de l'ajout et de la suppression il y a effectivement certainement des astuces pour ne pas avoir à tout charger et à tout refaire, comme le décalage (comme un tableau dans lequel on mettrait un élément). Par contre, pour le déplacement, je m'avancerai pas trop. Déplacer un fils dans un autre pere ... Aie Ouille ! Mais j'espère trouver le temps et la motivation de regarder ça plus en profondeur.