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] Fonction récursive et enregistrement tableau ?


Sujet :

PHP & Base de données

  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 109
    Par défaut [SQL] Fonction récursive et enregistrement tableau ?
    Bonjour,

    J'ai une table mysql avec ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    category_id - category - parent_num
    1 - Catégorie 1 - 0
    2 - Catégorie 2 - 5
    3 - Catégorie 3 - 2
    4 - Catégorie 4 - 3
    5 - Catégorie 5 - 3
    ...

    Il s'agit d'un système de catégorie à plusieurs niveaux. Une catégorie peut en contenir une autre (ceci à l'infini). Si je suis dans la catégorie 5 le fil d'ariane peut ainsi donner :

    Index > Catégorie 3 > Catégorie 5 >Catégorie 2

    Je souhaite donc faire un fil d'ariane. J'ai abouti à cette fonction :

    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
    // Fil d'Ariane
    $category_id = $db_data['category_id'];
    echo $category_id; // affiche bien l'id de la catégorie en cours
     
    function getTopParent($pi_current, $pa_data)
            {
     
                // sql + query
                $sSql = "SELECT parent_num, category FROM categories WHERE category_id=$pi_current";
                $req = mysql_query($sSql) or die(mysql_error());
     
                if (mysql_num_rows($req)>0)
                {
                    $aData = mysql_fetch_assoc($req);
                    $pa_data = array($aData);
                    getTopParent($aData['parent_num'], $pa_data);
                }
            }
     
            // Appel de la function
            getTopParent($category_id, $pa_data) ;
     
            // Reverse l'ordre des resultats pour avoir en premier le root
            $aFinalData = array_reverse($pa_data) ; 
     
    // pour parcourir ce tableau, utilisons la boucle foreach
    foreach($individu as $cle=>$valeur)
        {
        echo $cle.' : '.$valeur.'<br>';
        }
    Mais cela me sort ce message d'erreur :

    Warning: array_reverse() [function.array-reverse]: The argument should be an array
    pour la ligne correspondant à :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $aFinalData = array_reverse($pa_data) ;
    Le problème semble venir de (la mauvaise) insertion des données dans le tableau, car lorsque je fais seulement:

    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
    function getTopParent($pi_current, $pa_data)
            {
     
                // sql + query
                $sSql = "SELECT parent_num, category FROM categories WHERE category_id=$pi_current";
                $req = mysql_query($sSql) or die(mysql_error());
     
                if (mysql_num_rows($req)>0)
                {
                    $aData = mysql_fetch_assoc($req);
                    echo $aData['category'];
                    getTopParent($aData['parent_num'], $pa_data);
                }
            }
     
     
            // Appel de la function
            getTopParent($category_id, $pa_data) ;
    Cela m'affiche bien le nom de mes catégories, mais dans l'ordre inverse d'un fil d'ariane (à gauche il y a la catégorie la plus basse dans la hiérarchie et à droite la plus haute, alors que ça devrait bien sûr être l'inverse pour un fil d'ariane...). D'où l'idée de stocker les données dans un tableau pour ensuite inverser le tableau et afficher les données (si vous avez mieux je suis tout autant preneur ).

    J'ai cherché avec mon ami Google les cours présentant la mise en tableau de données, mais je n'ai pas réussi à comprendre où était l'erreur dans mon code :-/... Je suppose pourtant que la bêtise est évidente :- ?

    Pourriez-vous m'aider s'il vous plait :- ?

  2. #2
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    181
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 181
    Par défaut
    essaie en changeant ta requête
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
     $sSql = "SELECT parent_num, category FROM categories WHERE category_id='".$pi_current."'";
    je ne pense pas que ça vienne de là mais on sait jamais...
    sinon mets ta page en entier, ça sera plus facile à comprendre


    sinon tu as essayé
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    pa_Data = mysql_fetch_array($req);
    ?

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 109
    Par défaut
    Merci pour tes suggestions . Malheureusement ni l'une ni l'autre ne débloquent la chose .

    La requête SQL intègre bien la bonne variable (je le vérifie en faisant un echo $sSql juste après la ligne $sSql).


    De plus quand je fais echo $aData['category']; (cf le dernier code du 1er message de ce topic) ça m'affiche bien les catégories. Le seul problème est qu'elles sont présentées dans le désordre en fait :-/.

    Exemple : "16Blogs multithématiques 0Loisirs & divertissement"
    Dans cet exemple la hiérarchie est la suivante dans la BDD (il n'y a pas de catégorie avec l'id "0" puisque le parent_num minimum est "0") :
    (0) > Loisirs & divertissement (category_id = 16; parent_num = 0) > Blogs Multithématiques (category_id = 20; parent_num = 16)

    J'ai essayé :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
                if (mysql_num_rows($req)>0)
                {
                    $aData = mysql_fetch_assoc($req);
    				$pa_data = mysql_fetch_array($req);
    				getTopParent($aData['parent_num'], $pa_data);
                }
    mais l'effet est toujours le même.

    Mmm ça m'énerve d'avoir une fonction récursive qui marche et d'avoir cette inversion qui me bloque l'avancement de mon script ...

    J'ai recherché dans les cours en ligne que j'ai trouvé mais je ne comprends toujours pas pourquoi ça ne marche pas :- ?

    ps : en fait je n'ai pas plus de choses sur ma page. C'est le début de ma page et ce qui suit n'a pas de rapport.

  4. #4
    Membre confirmé
    Profil pro
    Inscrit en
    Juillet 2007
    Messages
    181
    Détails du profil
    Informations personnelles :
    Âge : 49
    Localisation : France

    Informations forums :
    Inscription : Juillet 2007
    Messages : 181
    Par défaut
    essaie ça pour voir
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
      if (mysql_num_rows($req)>0)
                {
                	$adata = mysql_fetch_array($req);
    	getTopParent($adata['parent_num'], $pa_data);
                }
    étant donné que l'erreur dit que $adata n'est pas un tableau, ça peut marcher. (???)
    sinon bien ton code récursif, il pourra me servir un jour

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Mai 2005
    Messages
    109
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2005
    Messages : 109
    Par défaut
    J'ai fait comme ceci et ça marche :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    if (mysql_num_rows($req)>0)
                {
                    $aData = mysql_fetch_assoc($req);
                    $pa_data[]=$aData;
                    getTopParent($aData['parent_num'], $pa_data);
                }
    Merci pour votre aide !

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

Discussions similaires

  1. Réponses: 5
    Dernier message: 13/07/2010, 12h06
  2. [MySQL] Peu importe la taille du tableau, SQL est censé tout enregistrer(non pas foreach :D )
    Par Dermiste dans le forum PHP & Base de données
    Réponses: 2
    Dernier message: 26/04/2008, 01h47
  3. Réponses: 4
    Dernier message: 18/09/2007, 10h46
  4. [SQL] Fonction pour trier un tableau
    Par ciel65 dans le forum PHP & Base de données
    Réponses: 7
    Dernier message: 15/02/2007, 16h43
  5. [PL/SQL] Fonction retournant un tableau
    Par moneyinthebank dans le forum SQL
    Réponses: 6
    Dernier message: 03/11/2006, 11h38

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