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

Zend Framework PHP Discussion :

Problème Requête Zend


Sujet :

Zend Framework PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    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
    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 : 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
     
    <?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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  2. #2
    Membre habitué
    Homme Profil pro
    Étudiant
    Inscrit en
    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
    Par défaut
    C'est Bon maintenant ca marche:

    Le Modèle Tables.php :
    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
     
    <?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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  3. #3
    Membre Expert
    Avatar de 5h4rk
    Homme Profil pro
    CTO at TabMo
    Inscrit en
    Février 2011
    Messages
    813
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : CTO at TabMo
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2011
    Messages : 813
    Par défaut
    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

  4. #4
    Membre émérite
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2009
    Messages
    736
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : Maroc

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

    Informations forums :
    Inscription : Mai 2009
    Messages : 736
    Par défaut
    Tu dois travailler avec autoloader du zend pour ne plus faire des require_once pour appeler tes class

  5. #5
    Membre éprouvé Avatar de Alcide_
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2008
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2008
    Messages : 79
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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

  6. #6
    Membre Expert
    Avatar de 5h4rk
    Homme Profil pro
    CTO at TabMo
    Inscrit en
    Février 2011
    Messages
    813
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 40
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : CTO at TabMo
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2011
    Messages : 813
    Par défaut
    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

  7. #7
    Membre éprouvé Avatar de Alcide_
    Homme Profil pro
    Étudiant
    Inscrit en
    Juin 2008
    Messages
    79
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 36
    Localisation : France

    Informations professionnelles :
    Activité : Étudiant
    Secteur : Aéronautique - Marine - Espace - Armement

    Informations forums :
    Inscription : Juin 2008
    Messages : 79
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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...

Discussions similaires

  1. Problème: Requête utilisant NOT IN
    Par fages dans le forum Langage SQL
    Réponses: 4
    Dernier message: 04/05/2004, 10h18
  2. erreur3073 Problème requête
    Par amel123456789 dans le forum Langage SQL
    Réponses: 8
    Dernier message: 01/04/2004, 10h15
  3. Problème requête qui renvoie plusieurs
    Par dai.kaioh dans le forum Langage SQL
    Réponses: 6
    Dernier message: 01/04/2004, 10h07
  4. Problème requête avec UNION et ORDER BY
    Par Yann21 dans le forum Langage SQL
    Réponses: 12
    Dernier message: 12/12/2003, 11h02
  5. Réponses: 8
    Dernier message: 23/10/2003, 16h22

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