Précédent   Forum des professionnels en informatique > PHP > Bibliothèques et frameworks
Bibliothèques et frameworks Forum d'entraide sur les frameworks, templates, bibliothèques de code (PDFLib, eZPdf, JpGraph, Artichow, PEAR, etc). Avant de poster : FAQ bibliothèques, toutes les FAQ PHP et cours bibliothèques
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 05/06/2006, 14h14   #1
Membre du Club
 
Développeur Web
Inscription : décembre 2005
Messages : 110
Détails du profil
Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : décembre 2005
Messages : 110
Points : 45
Points : 45
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 :
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 :
$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.
fadeninev est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 05/06/2006, 18h12   #2
Rédacteur
 
Avatar de Yogui
 
Homme Guillaume Rossolini
Directeur technique
Inscription : février 2004
Messages : 13 720
Détails du profil
Informations personnelles :
Nom : Homme Guillaume Rossolini
Localisation : France

Informations professionnelles :
Activité : Directeur technique

Informations forums :
Inscription : février 2004
Messages : 13 720
Points : 17 355
Points : 17 355
Salut

Je ne connais pas la SPL mais, dans la doc, ils conseillent quelque chose dans ce style :
Code :
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 !
__________________
Mes articles - Zend Certified Engineer (PHP + Zend Framework)
Ressources PHP - Ressources Zend Framework
Yogui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/06/2006, 09h45   #3
Membre du Club
 
Développeur Web
Inscription : décembre 2005
Messages : 110
Détails du profil
Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : décembre 2005
Messages : 110
Points : 45
Points : 45
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 !
fadeninev est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/06/2006, 10h11   #4
Rédacteur
 
Avatar de Yogui
 
Homme Guillaume Rossolini
Directeur technique
Inscription : février 2004
Messages : 13 720
Détails du profil
Informations personnelles :
Nom : Homme Guillaume Rossolini
Localisation : France

Informations professionnelles :
Activité : Directeur technique

Informations forums :
Inscription : février 2004
Messages : 13 720
Points : 17 355
Points : 17 355
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.
__________________
Mes articles - Zend Certified Engineer (PHP + Zend Framework)
Ressources PHP - Ressources Zend Framework
Yogui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/06/2006, 10h19   #5
Membre du Club
 
Développeur Web
Inscription : décembre 2005
Messages : 110
Détails du profil
Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : décembre 2005
Messages : 110
Points : 45
Points : 45
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.
fadeninev est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/06/2006, 10h56   #6
Rédacteur
 
Avatar de Yogui
 
Homme Guillaume Rossolini
Directeur technique
Inscription : février 2004
Messages : 13 720
Détails du profil
Informations personnelles :
Nom : Homme Guillaume Rossolini
Localisation : France

Informations professionnelles :
Activité : Directeur technique

Informations forums :
Inscription : février 2004
Messages : 13 720
Points : 17 355
Points : 17 355
J'imagine que tu le sais mais je préfère préciser...

Code :
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.
__________________
Mes articles - Zend Certified Engineer (PHP + Zend Framework)
Ressources PHP - Ressources Zend Framework
Yogui est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 06/06/2006, 15h44   #7
Membre du Club
 
Développeur Web
Inscription : décembre 2005
Messages : 110
Détails du profil
Informations professionnelles :
Activité : Développeur Web

Informations forums :
Inscription : décembre 2005
Messages : 110
Points : 45
Points : 45
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 !
fadeninev 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 19h50.


 
 
 
 
Partenaires

Hébergement Web