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 09/09/2007, 18h15   #1
Nouveau Membre du Club
 
Inscription : mai 2005
Messages : 109
Détails du profil
Informations forums :
Inscription : mai 2005
Messages : 109
Points : 26
Points : 26
Par défaut [SQL] Fonction récursive et enregistrement tableau ?

Bonjour,

J'ai une table mysql avec ceci :

Code :
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 :
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 :

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

Code :
$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 :
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 :- ?
yazerty est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/09/2007, 22h20   #2
Membre actif
 
Inscription : juillet 2007
Messages : 179
Détails du profil
Informations personnelles :
Âge : 36

Informations forums :
Inscription : juillet 2007
Messages : 179
Points : 159
Points : 159
essaie en changeant ta requête
Code :
 $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 :
pa_Data = mysql_fetch_array($req);
?
sebdu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 09/09/2007, 22h54   #3
Nouveau Membre du Club
 
Inscription : mai 2005
Messages : 109
Détails du profil
Informations forums :
Inscription : mai 2005
Messages : 109
Points : 26
Points : 26
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 :
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.
yazerty est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/09/2007, 09h17   #4
Membre actif
 
Inscription : juillet 2007
Messages : 179
Détails du profil
Informations personnelles :
Âge : 36

Informations forums :
Inscription : juillet 2007
Messages : 179
Points : 159
Points : 159
essaie ça pour voir
Code :
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
sebdu est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 10/09/2007, 21h06   #5
Nouveau Membre du Club
 
Inscription : mai 2005
Messages : 109
Détails du profil
Informations forums :
Inscription : mai 2005
Messages : 109
Points : 26
Points : 26
J'ai fait comme ceci et ça marche :

Code :
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 !
yazerty 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 09h55.


 
 
 
 
Partenaires

Hébergement Web