Précédent   Forum des professionnels en informatique > PHP > Outils > Zend > Zend Framework
Zend Framework Forum d'entraide sur la programmation PHP avec Zend Framework. Avant de poster -> FAQ ZF, Cours ZF
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 11/09/2011, 01h51   #1
Invité de passage
 
Homme
Étudiant
Inscription : août 2011
Messages : 10
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Maroc

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : août 2011
Messages : 10
Points : 0
Points : 0
Par défaut Problème Requête Zend

Bonsoir

Donc voilà je voudrai exécuter une requête en suivant le MVC de Zend, donc voilà quelques bouts de code :

Le Modèle Tables.php :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
 
<?php
    class Post extends Zend_Db_Table
    {
        protected $_name = "Post" ;
 
        public function select_acceuil_post()
        {
            $db = Zend_Db_Table::getDefaultAdapter() ;
            $select = new Zend_Db_Select($db) ;
            $select = $db -> select() ;
                          -> from('Post') ;
                          -> order('id_post DESC') ;
                          -> limit('3') ;
        }
    }
?>
Le Controller IndexController.php :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
 
<?php
    class IndexController extends Zend_Controller_Action
    {    
        public function indexAction()
        {
            require_once 'Tables.php' ;
            $this->view->title = "Contradictor but Homogen" ;
            $last_post = new Post() ;
            $req = $last_post -> select_acceuil_post() ;
            $this -> view -> last_post = $req -> fetchAll() ;
        }
    }
?>
La Vue index.phtml :
Code :
1
2
3
4
5
6
7
 
<?php
    foreach($this->last_post as $post)
    {
        echo $this-> escape($post -> id_post) ;
    }
?>
Et je reçois le Fameux Joli Message d'erreur :
Fatal error: Call to a member function fetchAll() on a non-object in /opt/lampp/htdocs/contradictors/application/controllers/IndexController.php on line 11

Est-ce quelqu'un aurait une idée d'où provient cette erreur ?

Merci d'avance
Mehdi Fal est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/09/2011, 03h45   #2
Invité de passage
 
Homme
Étudiant
Inscription : août 2011
Messages : 10
Détails du profil
Informations personnelles :
Sexe : Homme
Localisation : Maroc

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : août 2011
Messages : 10
Points : 0
Points : 0
C'est Bon maintenant ca marche:

Le Modèle Tables.php :
Code :
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
 
<?php
    class Post extends Zend_Db_Table
    {
        protected $_name = "Post" ;
 
        public function select_acceuil_post()
        {
            $db = Zend_Db_Table::getDefaultAdapter() ;
            $select = new Zend_Db_Select($db) ;
            $select = $db -> select() ;
                          -> from('Post') ;
                          -> order('id_post DESC') ;
                          -> limit('3') ;
            return $select->query() ;   // 1er Probleme
        }
    }
?>
et pour la view :
Code :
1
2
3
4
5
6
7
 
<?php
    foreach($this->last_post as $post)
    {
        echo $this-> escape($post['id_post']) ; // car fetchAll() return un tableau
    }
?>
Merci en tout cas
Mehdi Fal est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 11/09/2011, 13h57   #3
Modérateur
 
Homme Loïc
Développeur Web
Inscription : février 2011
Messages : 680
Détails du profil
Informations personnelles :
Nom : Homme Loïc
Âge : 26
Localisation : France, Hérault (Languedoc Roussillon)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : février 2011
Messages : 680
Points : 1 044
Points : 1 044
Un conseil, pour créer un modèle Post représentant la table post de ta BDD, donne lui le même nom et non pas Tables.php

Pour ma part, j'aurais fait ainsi:
- Le modèle serait dans le dossier : /application/models/DbTable/Post.php
- L'entête du fichier serait : Model_DbTable_Post extends Zend_DbTable
5h4rk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 12/09/2011, 12h57   #4
Membre chevronné
 
Homme Taoufiq Ben
Développeur Web
Inscription : mai 2009
Messages : 465
Détails du profil
Informations personnelles :
Nom : Homme Taoufiq Ben
Âge : 25
Localisation : Maroc

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : mai 2009
Messages : 465
Points : 651
Points : 651
Tu dois travailler avec autoloader du zend pour ne plus faire des require_once pour appeler tes class
m4riachi est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/09/2011, 11h21   #5
Membre régulier
 
Avatar de Alcide_
 
Homme
Étudiant
Inscription : juin 2008
Messages : 70
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 23
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juin 2008
Messages : 70
Points : 78
Points : 78
Autres petites remarques :

- utilise la notationCamel pour tes variables ou méthodes

- essaie de préfixer tes accesseurs par "get" ou "set"
ton code sera beaucoup plus lisible.

-Si tu as configurer ton adaptateur au niveau de ton bootstrap avec :
Code :
Zend_Db_Table::setDefaultAdapter($myAdapter);
Tu n'as plus besoin de récupérer l'adaptateur dans tes modèles.

- Tu devrais aussi mettre ton "fetchAll()" au niveau de ton modèle et non pas dans ton contrôleur (regarde bien la doc de fetchAll, car c'est un Zend_Db_Table_Rowset qu'il retourne et non un simple Array).

- (Edit:Je reformule) Ton modèle devrait plutôt retourner le résultat de "fetchAll()" et non celui d'un "$select->query()".
Sinon, regarde bien la doc de fetchAll() car il retourne un Rowset et non un simple Array.
Quand tu boucles dessus via un foreach, tu récupères un Row à chaque itération donc, faire "$row->monChamp" est possible.

Un peu de lecture : ZF coding standard
Alcide_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/09/2011, 11h26   #6
Modérateur
 
Homme Loïc
Développeur Web
Inscription : février 2011
Messages : 680
Détails du profil
Informations personnelles :
Nom : Homme Loïc
Âge : 26
Localisation : France, Hérault (Languedoc Roussillon)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : février 2011
Messages : 680
Points : 1 044
Points : 1 044
Ce que tu signale est exacte mise à part un bémol, il vaut mieux que le fetchAll soit côté controller, le modèle n'a pas pour but de retourner un array, c'est à toi côté applicatif à faire de ton rowset ce que tu veux et non pas au modèle.

Chaque méthode d'un modèle devraient retournée un row ou un rowset quand cela est possible mais ne jamais effectué des opérations sur ces résultats avant de les retransmettre.

Cela permet de pouvoir utiliser la méthode à plusieurs endroit, car si par exemple tu as besoin de travailler avec des objets dans une autre action, en transformant en array tu devra faire une nouvelle méthode
5h4rk est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/09/2011, 12h06   #7
Membre régulier
 
Avatar de Alcide_
 
Homme
Étudiant
Inscription : juin 2008
Messages : 70
Détails du profil
Informations personnelles :
Sexe : Homme
Âge : 23
Localisation : France

Informations professionnelles :
Activité : Étudiant
Secteur : High Tech - Éditeur de logiciels

Informations forums :
Inscription : juin 2008
Messages : 70
Points : 78
Points : 78
On est d'accord, pour que la méthode retourne un Row ou Rowset il faut que les méthodes proxyant _fetch() soient coté modèle...
Sous-entendu :
Code :
1
2
3
4
5
6
7
8
9
10
 
Table_My extends Zend_Db_Table
{
   public function getFoo()
   {
       $select = $this->select();
       /* code */
       return $this->fetchAll($select);
   }
}
Citation:
Envoyé par Alcide_ Voir le message
(regarde bien la doc de fetchAll, car c'est un Zend_Db_Table_Rowset qu'il retourne et non un simple Array).
Cette phrase faisait référence au commentaire de Mehdi Fal sur la valeur de retour d'un fetchAll(), non à une quelconque transformation des valeurs au sein du modèle... veuillez m'excuser si cela a porté à confusion...
Alcide_ est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/09/2011, 12h24   #8
Modérateur
 
Homme Loïc
Développeur Web
Inscription : février 2011
Messages : 680
Détails du profil
Informations personnelles :
Nom : Homme Loïc
Âge : 26
Localisation : France, Hérault (Languedoc Roussillon)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : février 2011
Messages : 680
Points : 1 044
Points : 1 044
Ok tu devrais donc modifier car mon commentaire vient du fait que tu dis mettre le fetchAll côté modèle et non controleur
5h4rk est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 01h38.


 
 
 
 
Partenaires

Hébergement Web