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 :

Problème délicat (tableaux multidimensionnels) [MySQL]


Sujet :

PHP & Base de données

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 10
    Points : 7
    Points
    7
    Par défaut Problème délicat (tableaux multidimensionnels)
    Bonjour à tous,

    Ceci est mon premier message. J'espère que ce post a sa place dans ce forum.

    J'ai actuellement un problème délicat sur lequel je m'arrache les cheveux par poignées (il m'en reste peu).

    Pour un projet personnel, j'ai une base de données MySQL qui comprend une table nommée 'catégorie'.

    Cette table contient 3 champs : 'id','designation' et 'id_parent'.

    Je vais essayer de vous en retranscrire le contenu ligne par ligne :

    id | designation | id_parent

    2 | sport | 0
    3 | loisirs | 0
    4 | nautique | 2
    5 | terrestre | 2
    6 | aerien | 2
    7 | natation | 4
    8 | cyclisme | 5

    Les informations portées dans cette table me permettent de reconstruire une arborescence des catégories.

    Exemple ici :

    Il y a deux catégories à la racine : sport et loisirs.
    La catégorie sport contient 3 catégories : nautique, terrestre et aerien.
    La catégorie nautique contient elle même une catégorie natation.
    La catégorie terrestre contient elle même une catégorie cyclisme.

    Je déduis tout cela grâce aux champs id et id_parent.

    Pour pouvoir présenter ces informations visuellement, j'ai besoin de construire un tableau multidimensionnel qui correspond à cette représentation :

    le tableau 'categories' contiendra :
    -> tableau sport
    ----> tableau aerien
    ----> tableau nautique
    --------> tableau natation
    ----> tableau terrestre
    --------> tableau cyclisme
    -> tableau loisir

    Quelque soit les modifications effectuées par ailleurs dans la table MySQL (suppression, modification etc...), le tableau PHP doit représenter la réalité.
    Itérer sur ce tableau me permettra de représenter visuellement les catégories, avec des retraits etc.
    Je pense que c'est un problème courant mais je m'empêtre complétement dans les boucles et je ne parviens pas à sortir quelque chose de correct. Les requetes sur la base de me posent pas de problème, c'est juste la traduction de cette table en tableau PHP qui me pose souci.

    Je remercie d'avance tous ceux qui voudront bien m'aider. Ma santé capillaire dépend de vos interventions

  2. #2
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 098
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 098
    Points : 8 207
    Points
    8 207
    Billets dans le blog
    17
    Par défaut
    Il va falloir faire du récursif. Faisons simple pour commencer :

    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
    // Recherche les noeuds dont le père est $parent
    // Comportement récursif
    function populate($parent)
    {
        $sql = 'SELECT ALL id, designation, parent '
             . 'FROM categories '
             . 'WHERE parent = ' . $parent ;
        $tree = array( ) ;
        $rs = mysql_query($sql) ;
        while ( $categorie = mysql_fetch_object($rs) ) {
            $tree[ ] = (object)array(
                'data' => $categorie,
                // Recherche des enfants du noeud en cours
                'children' => populate($categorie->id)) ;
        }
        return $tree ;
    }
    header('Content-Type: text/plain') ;
    $tree = populate(0) ; // On lance la recherche depuis la racine
    print_r($tree) ;
    Je n'ai pas testé ce bout de code, mais il te permettra de comprendre le principe.
    Attention, ne pas utiliser ceci dans ton script final, il y aurait bcp trop de requêtes au serveur SQL.
    EDIT : Il faudrait amhà passer par un tableau PHP qui récupèrerait toutes tes catégories d'un coup, après traitement cela te permettrait de reconstruire $tree.
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

  3. #3
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 10
    Points : 7
    Points
    7
    Par défaut
    Merci pour la rapidité de la réponse

    J'ai déjà mal au crâne rien qu'à lire le mot "récursif".

    J'ai testé ce bout de code, mais j'ai en sortie un erreur :

    Severity: Warning

    Message: mysql_fetch_object(): supplied argument is not a valid MySQL result resource

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    10
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 10
    Points : 7
    Points
    7
    Par défaut J'ai enfin réussi :)
    J'ai finalement réussi, grâce à tes conseils.

    Voici le 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
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
     
     
    function categories_ajax()
    	{
    global $xml_part;
    		//Authentification
    		$authentification= $this->authentification->back_login($this->session->userdata('identifiant'), $this->session->userdata('motdepasse'));
    		//
    		$xml= "<?xml version='1.0' encoding='UTF-8' ?>";
    		$xml .= "<page>";
    		$this->db->select('id,designation,id_parent,position')->from('kb_categories')->where('id_parent', 0);
    		$query= $this->db->get();
    		if ($query->num_rows() < 1)
    		{
    			echo "vide";
    			return FALSE;
    		}
    		else
    		{
    			foreach ($query->result() as $row)
    			{
    $xml_part ="";
    				$head= array ();
    				array_push($head, $row->id);
    				$xml .= "<categorie id='" . $row->id . "' nom='" . $row->designation . "'>";
    				$xml .= $this->_cherche_enfants($head);
    				$xml .= "</categorie>";
    			}
    		}
    		$xml .= "</page>";
    		header('Content-Type: text/xml');
    		echo $xml;
    	}
    	function _cherche_enfants($tab)
    	{
    global $xml_part;
    		for ($i= 0; $i < count($tab); $i++)
    		{
    			$this->db->select('id,designation,id_parent,position')->from('kb_categories')->where('id_parent', $tab[$i]);
    			$query= $this->db->get();
    			if ($query->num_rows() == 0)
    			{
    				$vide= '';
    				return $vide;
    			}
    			else
    			{
    				$xml_part= "";
    				foreach ($query->result() as $row)
    				{
    					$new_tab= array ();
    					array_push($new_tab, $row->id);
    					$xml_part .= "<categorie id='" . $row->id . "' nom='" . $row->designation . "'>";
    					$this->_cherche_enfants($new_tab);
    					$xml_part .= "</categorie>";
    				}
    				return $xml_part;
    			}
    		}
    	}
    La finalité était de générer du XML, pour passer les données à Ajax.
    J'ai deux fonctions : la première (categories_ajax) récupére les catégories qui sont directement relatives à la racine (les catégories principales)et appelle la seconde (_cherche_enfants) qui est récursive.

    Cela marche trés bien et je n'ai pas eu besoin de générer de tableau multidimensionnels.

    Pour le moment cela fonctionne en multipliant les requêtes, je vais voir si je peux utiliser un tableau PHP pour soulager la base, encore qu'avec si peu de données, je pense qu'elle ne risque pas grand chose.

    Pardon pour les requêtes active record, j'utilise Code Igniter.

    Merci beaucoup pour ton aide.

  5. #5
    Expert éminent
    Avatar de Séb.
    Profil pro
    Inscrit en
    Mars 2005
    Messages
    5 098
    Détails du profil
    Informations personnelles :
    Âge : 46
    Localisation : France

    Informations professionnelles :
    Secteur : High Tech - Opérateur de télécommunications

    Informations forums :
    Inscription : Mars 2005
    Messages : 5 098
    Points : 8 207
    Points
    8 207
    Billets dans le blog
    17
    Par défaut
    Citation Envoyé par setblue
    Merci beaucoup pour ton aide.
    Content d'avoir pû de te mettre sur la voie
    Un problème exposé clairement est déjà à moitié résolu
    Keep It Smart and Simple

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

Discussions similaires

  1. Problème de tableaux multidimensionnels
    Par progfou dans le forum C#
    Réponses: 3
    Dernier message: 09/03/2007, 10h23
  2. Problème avec tableaux dynamiques et procédure
    Par K20 dans le forum Langage
    Réponses: 11
    Dernier message: 06/01/2006, 20h51
  3. Réponses: 5
    Dernier message: 24/12/2005, 15h40
  4. HTML : problème de tableaux qui se superposent
    Par paprika dans le forum Balisage (X)HTML et validation W3C
    Réponses: 4
    Dernier message: 13/10/2005, 15h55
  5. [D2005]Problème de tableaux dynamique
    Par Laurent Dardenne dans le forum Delphi .NET
    Réponses: 8
    Dernier message: 26/07/2005, 11h56

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