Help, fonction pour transmettre une variable créer a l'issu d'une boucle

Résolu
cs_romega
Messages postés
32
Date d'inscription
jeudi 8 novembre 2007
Statut
Membre
Dernière intervention
20 avril 2008
- 19 mars 2008 à 15:05
cs_romega
Messages postés
32
Date d'inscription
jeudi 8 novembre 2007
Statut
Membre
Dernière intervention
20 avril 2008
- 20 mars 2008 à 15:44
Salut a vous,
Alors je continu dans la création de mon forum, voila un nouveau probleme pour moi. D'abord le code ce sera plus simple :

function selectcat($id2,$st=array(),$rs="")
{
    $qnm=mysql_query("SELECT id, id_parent FROM arbo WHERE id_parent='$id2'");
    while($res3=mysql_fetch_array($qnm))
        {
            array_push($st,''.$res3['id'].'');
            selectcat($res3['id']);
        }
            $i=0;
            while ($i<sizeof($st))
        {
            $rs.= " OR cate=$st[$i] ";
            $i++;
        }
    echo $rs;
    return $rs;
}

Supposons que j'ai 3 catégories le echo va me marquer "OR cate=1 OR cate=2 OR cate=3" il le fait trés bien. Le probleme est que le echo est la juste pour controlé que la boucle fonctionne bien. Le but est de récupéré cette valeur $rs dans le reste du script et la quand je fait "echo selectcat(...);" il me marque seuleument "OR cate=3" et zap les premier passage de la boucle pourquoi et comment résoudre ce problème
Merci a vous
PS:j'espere que j'ai bien indenter mon code...

10 réponses

amezghal
Messages postés
385
Date d'inscription
lundi 27 février 2006
Statut
Membre
Dernière intervention
21 août 2015
5
19 mars 2008 à 16:49
salut,
ba dans ta premiere boucle while {} tu fais appelle a la meme fonction (récursivité)
normal que tu recuperes que les derniers valeurs...
solutions => tes variables $st ,$rs doivent etre declarées en dehors de la fonction..

<hr size="2" width="100%" />Au début, on essaye de trouver une solution qui marche, et puis on veut la meilleure.
3
cs_romega
Messages postés
32
Date d'inscription
jeudi 8 novembre 2007
Statut
Membre
Dernière intervention
20 avril 2008

19 mars 2008 à 17:25
J'ai essayé de les déclarer en dehors de la fonction, mais elle ne sont pas reconnues dans la fonction après. J'ai essayé avec global mais du coup la variable est remise a sa valeur initial. Si tu pouvais m'indiquer aussi le code ou comment déclaré a l'exterieur de la variable pour ensuite récupé le résultat de ma boucle, désolé je suis un peu perdu avec cette fonction.
Merci
0
amezghal
Messages postés
385
Date d'inscription
lundi 27 février 2006
Statut
Membre
Dernière intervention
21 août 2015
5
19 mars 2008 à 19:50
salut,
declare tes var en dehors de la fonction, ta fonction n'aura comme param que $id2
donc function selectcat($id2){....}
<hr size="2" width="100%" />Au début, on essaye de trouver une solution qui marche, et puis on veut la meilleure.
0
malalam
Messages postés
10839
Date d'inscription
lundi 24 février 2003
Statut
Membre
Dernière intervention
2 mars 2010
25
19 mars 2008 à 20:12
Hello,

non.
La solution serait de déclarer tes variables en statique. Exemple à la con :
<?php
function recurse($sChaine) {
    static $aRes = array();
    $iLength = strlen($sChaine);
    if(!empty($iLength)) {
        $aRes[] = substr($sChaine, 0, 1);
        recurse(substr($sChaine, 1));
    }
    return $aRes;
}
print_r(recurse('hello'));
?>

Et parce que ce soir je suis d'humeur sympa ;-) :
<?php
function selectcat($id2) {
    static $rs = '';
    static $st = array();
    $qnm=mysql_query("SELECT id, id_parent FROM arbo WHERE id_parent='$id2'");
    while($res3=mysql_fetch_array($qnm))
        {
            array_push($st,''.$res3['id'].'');
            selectcat($res3['id']);
        }
            $i=0;
            while ($i<sizeof($st))
        {
            $rs.= " OR cate=$st[$i] ";
            $i++;
        }
    echo $rs;
    return $rs;
}
?>
0

Vous n’avez pas trouvé la réponse que vous recherchez ?

Posez votre question
cs_romega
Messages postés
32
Date d'inscription
jeudi 8 novembre 2007
Statut
Membre
Dernière intervention
20 avril 2008

19 mars 2008 à 20:13
Ca marche pas
0
malalam
Messages postés
10839
Date d'inscription
lundi 24 février 2003
Statut
Membre
Dernière intervention
2 mars 2010
25
19 mars 2008 à 20:18
Quand même...
si tu utilises mysql_fetch_array(), et que tu ne te sers que des index associatifs, utilise la constante MYSQL_FETCH_ASSOC avec.
Ne mets pas non plus ton sizeof() dans le while(). Initialise une variable avant la boucle, qui a pour valeur ton sizeof(), et sers-toi de cette variable dans la boucle.
0
malalam
Messages postés
10839
Date d'inscription
lundi 24 février 2003
Statut
Membre
Dernière intervention
2 mars 2010
25
19 mars 2008 à 20:20
Qu'est-ce qui ne marche pas ?
0
cs_romega
Messages postés
32
Date d'inscription
jeudi 8 novembre 2007
Statut
Membre
Dernière intervention
20 avril 2008

19 mars 2008 à 21:03
En fait ca marche pas totalement avec static, car je me sers deux fois de la fonction et a la deuxieme utilisation il me ressort les résultat de la premiere utilisation plus ceux de la deuxieme. Il faudrait remettre a zero les variables statique pour la deuxieme utilisation ?
Merci pour votre aide
0
malalam
Messages postés
10839
Date d'inscription
lundi 24 février 2003
Statut
Membre
Dernière intervention
2 mars 2010
25
20 mars 2008 à 08:22
Bah dans ce cas :

function selectcat($id2,$st=array(),$rs="")
{
    $qnm=mysql_query("SELECT id, id_parent FROM arbo WHERE id_parent='$id2'");
    while($res3=mysql_fetch_array($qnm))
        {
            array_push($st,''.$res3['id'].'');
            selectcat($res3['id'], $st, $rs);
        }
            $i=0;
            while ($i<sizeof($st))
        {
            $rs.= " OR cate=$st[$i] ";
            $i++;
        }
    echo $rs;
    return $rs;
}

Néanmoins tu sais que ton code est à priori foireux ? Je ne pense pas que ton mysql_fetch_array() reprenne le fil après la sortie d'un nouvel appel récursif à ta fonction. C'est à vérifier, mais je pense que ta ressource est écrasée par la suivante (au sein de la mémoire de php).
0
cs_romega
Messages postés
32
Date d'inscription
jeudi 8 novembre 2007
Statut
Membre
Dernière intervention
20 avril 2008

20 mars 2008 à 15:44
Voila grace a vous j'ai trouvé, il fallait en effet déclarer les variable en global, mais il fallait quelques petits aménagement dans le reste du script. Entre autre une "réinitialisation" de la variable après son utilisation pour une deuxième utilisation ce qui n'est apparemment pas possible avec une variable static.
Merci.
0