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

Signaler
Messages postés
32
Date d'inscription
jeudi 8 novembre 2007
Statut
Membre
Dernière intervention
20 avril 2008
-
Messages postés
32
Date d'inscription
jeudi 8 novembre 2007
Statut
Membre
Dernière intervention
20 avril 2008
-
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

Messages postés
385
Date d'inscription
lundi 27 février 2006
Statut
Membre
Dernière intervention
21 août 2015
4
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.
Messages postés
32
Date d'inscription
jeudi 8 novembre 2007
Statut
Membre
Dernière intervention
20 avril 2008

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
Messages postés
385
Date d'inscription
lundi 27 février 2006
Statut
Membre
Dernière intervention
21 août 2015
4
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.
Messages postés
10839
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
23
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;
}
?>
Messages postés
32
Date d'inscription
jeudi 8 novembre 2007
Statut
Membre
Dernière intervention
20 avril 2008

Ca marche pas
Messages postés
10839
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
23
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.
Messages postés
10839
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
23
Qu'est-ce qui ne marche pas ?
Messages postés
32
Date d'inscription
jeudi 8 novembre 2007
Statut
Membre
Dernière intervention
20 avril 2008

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
Messages postés
10839
Date d'inscription
lundi 24 février 2003
Statut
Modérateur
Dernière intervention
2 mars 2010
23
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).
Messages postés
32
Date d'inscription
jeudi 8 novembre 2007
Statut
Membre
Dernière intervention
20 avril 2008

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.