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

Bibliothèques et frameworks PHP Discussion :

[SPL] Rewind() qui renvoie NULL


Sujet :

Bibliothèques et frameworks PHP

  1. #1
    Membre régulier
    Profil pro
    Développeur Web
    Inscrit en
    Décembre 2005
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2005
    Messages : 110
    Points : 77
    Points
    77
    Par défaut [SPL] Rewind() qui renvoie NULL
    Bonjour à vous qui voulez m'aider !

    Je vous présente mon cas : je développe un site en php5, et j'ai besoin de récupérer les données d'une table de ma bdd. Pour cela, j'utilise le code ci dessous (je vous passe la connexion à la base...) qui fonctionne très bien. J'utilise des RecursiveArrayIterator de la SPL (Ce sont mes ContainerRubriques, qui héritent de RecursiveArrayIterator).

    Les données que je récupère sont des rubriques, qui peuvent avoir des sous-rubriques, qui peuvent elles-mêmes avoir des sous-rubriques.

    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
     
    while (($rubrique = $stmt->fetch(PDO::FETCH_CLASS)) == true) {
                $this->_container->append($rubrique);
     
                //Deuxième niveau : objets "sous-rubriques"
                $sub_stmt = $this->_db->query('select * from shadow_rubriques where sha_id_rubriques = '.$rubrique->getIdRubrique());
                $sub_stmt->setFetchMode(PDO::FETCH_CLASS, 'RubriqueObject');
                $this->_sub_container = new ContainerRubriques();           
                while (($sous_rubrique = $sub_stmt->fetch(PDO::FETCH_CLASS)) == true) {
                    $this->_sub_container->append($sous_rubrique);
     
                    //Troisième niveau : objets "sous-sous-rubriques"
                    $sub_sub_stmt = $this->_db->query('select * from shadow_rubriques where sha_id_rubriques = '.$sous_rubrique->getIdRubrique());
                    $sub_sub_stmt->setFetchMode(PDO::FETCH_CLASS, 'RubriqueObject');
                    $this->_sub_sub_container = new ContainerRubriques();                
                    while (($sous_sous_rubrique = $sub_sub_stmt->fetch(PDO::FETCH_CLASS)) == true) {
                        $this->_sub_sub_container->append($sous_sous_rubrique);
                    }
     
                    if($this->_sub_sub_container->count() > 0) {
                        $this->_sub_container->append($this->_sub_sub_container);
                    }
                }
                if ($this->_sub_container->count() > 0) {
                    $this->_container->append($this->_sub_container);
                }
            }
    Je répète que ce code fonctionne très bien. Mon souci, c'est qu'après ce code, je veux me positionner au début de mon container, et je fais donc :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $this->_container->rewind();
    Et c'est là que ça plante ! Cette instruction devrait me renvoyer TRUE ou FALSE, et au lieu de ça, elle me renvoie NULL Pourquoi ?

    Merci d'avance...

    Cécilia.

  2. #2
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Points : 29 985
    Points
    29 985
    Par défaut
    Salut

    Je ne connais pas la SPL mais, dans la doc, ils conseillent quelque chose dans ce style :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $iterator = $this->_container->getIterator();
    $iterator->rewind();
    Il ne semble pas prévu d'avoir accès directement aux méthodes de l'itérateur comme tu le fais.
    En outre, puisque tu n'utilises pas l'itérateur ($iterator->next() et compagnie...), je doute qu'il soit utile d'appeler rewind(). Je ne sais pas, tu nous diras !

  3. #3
    Membre régulier
    Profil pro
    Développeur Web
    Inscrit en
    Décembre 2005
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2005
    Messages : 110
    Points : 77
    Points
    77
    Par défaut
    getIterator() ne fonctionne pas car c'est une méthode de IteratorAggregate, or mon container est un RecursiveArrayIterator.
    Sinon pour te répondre, dans le code que j'ai publié je n'utilise pas l'itérateur, mais dans la suite je le fais, avec les méthodes rewind(), valid() et next() (qui me renvoient toutes NULL au lieu de TRUE )
    D'ailleurs, je l'ai fais aussi dans un autre fichier dans lequel ça renvoyait bien true, donc ça prouve qu'il est prévu d'utiliser directement ces méthodes (même si un foreach le ferait tout seul pour moi ! Ici j'en ai besoin car je fais des tests unitaires sur une classe, enfin bref... C'est bien embêtant car les méthodes fonctionnent, elles me permettent bien de me déplacer dans mon container, mais elle ne renvoient pas la bonne valeur, c'est étrange... )

    Merci quand même Yogui !

  4. #4
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Points : 29 985
    Points
    29 985
    Par défaut
    Flûte, ça le fait pas, je passe responsable et je réponds n'imp...

    Pour rester dans le sujet, jette un oeil à ce lien :
    http://www.php.net/~helly/php/ext/sp...3896cf6929e136

    Il semble que ta méthode rewind() ne retourne rien du tout, contrairement à ce que tu dis.
    Si je pige bien, tu devrais pouvoir appeler valid() à la suite pour vérifier.

  5. #5
    Membre régulier
    Profil pro
    Développeur Web
    Inscrit en
    Décembre 2005
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2005
    Messages : 110
    Points : 77
    Points
    77
    Par défaut
    Mouarf c'est la doc que je lis depuis 3 jours ;o) Ils ne le marquent pas mais pourtant dans un fichier qu'on a fait avec un autre développeur ça retourne bien true... On y comprend rien... (Le pire, c'est que ça me renvoie null, mais je peux aussi bien le comparer avec null qu'avec false, ça ne lui pose pas de problèmes...)

    Valid() permet en effet de vérifier qu'il y a bien un élément là où se trouve le pointeur dans l'itérateur.

  6. #6
    Rédacteur

    Avatar de Yogui
    Homme Profil pro
    Directeur technique
    Inscrit en
    Février 2004
    Messages
    13 721
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Yonne (Bourgogne)

    Informations professionnelles :
    Activité : Directeur technique

    Informations forums :
    Inscription : Février 2004
    Messages : 13 721
    Points : 29 985
    Points
    29 985
    Par défaut
    J'imagine que tu le sais mais je préfère préciser...

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    <?php
     
    echo (NULL === FALSE) ? 'NULL = = = FALSE' : 'NULL ! = = FALSE';
    echo '<br />';
    echo (NULL == FALSE) ? 'NULL = = FALSE' : 'NULL ! = FALSE';
     
    ?>
    Utilise bien l'opérateur === (triple égal) pour des comparaisons aussi poiintues.

  7. #7
    Membre régulier
    Profil pro
    Développeur Web
    Inscrit en
    Décembre 2005
    Messages
    110
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Décembre 2005
    Messages : 110
    Points : 77
    Points
    77
    Par défaut
    En fin de compte tu avais raison cette méthode ne renvoit rien du tout ! C'est dans le cadre d'autres utilisations (sur d'autres objets) qu'elle est susceptible de renvoyer true ou false !

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

Discussions similaires

  1. Un getElementById qui renvoie null alors qu'il existe
    Par Marc22 dans le forum Général JavaScript
    Réponses: 7
    Dernier message: 28/05/2010, 14h53
  2. [AC-2003] Requete qui renvoie 0 au lieu de NUll
    Par oxino dans le forum Requêtes et SQL.
    Réponses: 5
    Dernier message: 15/12/2009, 12h26
  3. COUNT qui renvoie null au lieu de 0
    Par gomodo dans le forum Requêtes
    Réponses: 4
    Dernier message: 10/02/2008, 14h50
  4. Requête qui renvoie 'Null'
    Par Invit-é dans le forum VB 6 et antérieur
    Réponses: 14
    Dernier message: 11/06/2007, 17h32
  5. [JDBC]Un new qui renvoie null...
    Par Ditch dans le forum JDBC
    Réponses: 4
    Dernier message: 03/01/2005, 13h14

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