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 :

Utiliser fetch et ses amis dans un Controller


Sujet :

Zend Framework PHP

  1. #1
    Membre averti
    Inscrit en
    Juin 2010
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 34
    Par défaut Utiliser fetch et ses amis dans un Controller
    Bonjour voila je cherche à être éclairé parceque là je bug
    Voila je cherche a faire un truc tout con (enfin tout con pour moi en PHP 4) :

    Je veux sortir une liste avec fetchAll()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
            $this->view->title = "Enchere Coco";
            $enchere = new Model_DbTable_Encheres();
            $this->view->encheres = $enchere->fetchAll();
    et dans ma view je vais rechercher les données de cette manière :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    <?php foreach($this->encheres as $enchere) : ?>
    id :<? echo $this->escape($enchere->id); ?>
    titre :<? echo $this->escape($enchere->titre); ?>
    <?php endforeach; ?>
    Ceci marche très bien !!!!





    Voila en fait j'aimerais rechercher dans ma boucle foreach seulement les données pour lesquelles validation=2 (dans ma bdd enchere) comment faire pour insérer la clause WHERE ? (j'ai essayé pas mal de truc sans succès j'utilise ZF 1.10)

    Ce n'est pas terminé...
    En plus de cela j'aurais besoin d'aller rechercher pour chaque encheres affichées (avec validation=2) dans ma boucle foreach des données d'une autre table en fonction de l'id...
    Donc j'imagine que pour commencer je dois créer une nouvelle connexion à ma nouvelle table (dans le même controller bien sur)
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
            $gagnant = new Model_DbTable_Gagnants();
    Et avec cette connexion je fais quoi un fetchAll ou autre chose ?
    Par exemple j'aimerais juste aller chercher le pseudo du gagnant de l'enchere en question. Comment faire ? merci de m'éclairer

  2. #2
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Mars 2006
    Messages
    70
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2006
    Messages : 70
    Par défaut
    Bonjour,

    tes classes Model_DbTable_* héritent-elles de la classe Zend_Db_Table_Abstract ?

    Si tel est ton cas, tu devrais pouvoir appliquer la méthode where() avant de faire le fetchAll().

    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
     
    $enchere->select()
    ->where('validation=?',2)
    ->fetchAll();
    Pour ce qui est de ton gagnant, tu devrais pouvoir faire un fetchRow() vu que tu vas récupérer une seule ligne.

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    215
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 215
    Par défaut
    Il faut d'abord appeler la méthode select() sur l'objet table, puis la méthode where. Pour ce qui est des gagnats, une jointure couplée avec un having devrait faire l'affaire

  4. #4
    Membre averti
    Inscrit en
    Juin 2010
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 34
    Par défaut
    Non en effet ma classe Model_DbTable_* n'herite pas de Zend_Db_Table_Abstract !!!!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <?php
     
    class Model_DbTable_Encheres extends Zend_Db_Table
    {
        protected $_name = 'enchere';
    }
    Le mieux est de la faire hériter ??? ok je la fais hériter alors comme cela
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <?php
     
    class Model_DbTable_Encheres extends Zend_Db_Table_Abstract
    {
        protected $_name = 'enchere';
    }
    Enfin c'est quoi le mieux de la faire hériter ou pas de la faire hériter du truc _Abstract ??

  5. #5
    Membre averti
    Inscrit en
    Juin 2010
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 34
    Par défaut
    Donc j'utilise maintenant l'héritage _Abstract

    mais quand je fais ça
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    <?php
     
    class EnchereCocoController extends Zend_Controller_Action
    {
        function indexAction()
        {
            $this->view->title = "Encheres Coco";
            $enchere = new Model_DbTable_Encheres();
            $sql = 'SELECT * FROM enchere WHERE validation = 2';
            $this->view->encheres = $enchere->fetchAll($sql);
        }
    }
    Ca me sort Message: SQLSTATE[21000]: Cardinality violation: 1241 Operand should contain 1 column(s)

  6. #6
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    215
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 215
    Par défaut
    Lol, Zend_Db_Table hérite de Zend_Db_Table_Abstract ...
    Mais ça ne suffit pas, la méthode where de Zend_Db_Table_Abstract est protégée, tu dois passer par un objet Zend_Db_Table_Select :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    $DbTable = new Model_DbTable_Foo;
    $select = $DbTable->select()->setIntegrityCheck(false)->where('validation=?',2) // setIntegrityCheck(false) : Permet les jointures
    $data = $DbTable->fetchAll($select);

  7. #7
    Membre averti
    Inscrit en
    Juin 2010
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 34
    Par défaut
    Feng-Huang quand je fais ton truc
    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
     
    <?php
     
    class EnchereCocoController extends Zend_Controller_Action
    {
        function indexAction()
        {
            $this->view->title = "Encheres Coco";
            $enchere = new Model_DbTable_Encheres();
     
            $select = $enchere->select()->setIntegrityCheck(false)->where('validation=?',2) // setIntegrityCheck(false) : Permet les jointures
            $this->view->encheres = $enchere->fetchAll($select);
     
        }
    }
    ça me sort page blanche...

  8. #8
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Mars 2006
    Messages
    70
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2006
    Messages : 70
    Par défaut
    Dans mon cas personnel, mes classes héritent de Zend_Db_Table_Abstract comme dans le manuel du framework.
    Après si tu t'en sors avec Zend_Db_Table, je ne saurais te dire quel est le mieux. Mieux vaut quand même suivre le manuel me semble-t-il.

    Maintenant pour ton erreur essaie plutôt cette syntaxe :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    <?php
     
    class EnchereCocoController extends Zend_Controller_Action
    {
        function indexAction()
        {
            $this->view->title = "Encheres Coco";
            $enchere = new Model_DbTable_Encheres();
            $sql = $enchere->select()->where('validation=?',2);
            $this->view->encheres = $enchere->fetchAll($sql);
        }
    }
    Je ne te garantie pas le résultat car perso je créé des méthodes dans la classe qui hérite de Zend_Db_Table_Abstract

  9. #9
    Membre éprouvé
    Homme Profil pro
    Ingenieur BI - Dev Web Senior
    Inscrit en
    Décembre 2009
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Ingenieur BI - Dev Web Senior

    Informations forums :
    Inscription : Décembre 2009
    Messages : 118
    Par défaut Doc Zend_Db_Select
    Bonjour,

    Voila un exemple qui marche:
    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
    public function listCommunautes($field = 'email', $value= '', $banni = 'all'){
     
    		$db = Zend_Db_Table::getDefaultAdapter();
     		$selectCommunautes = new Zend_Db_Select($db);
     		$selectCommunautes->from('communaute');
     
    		if($value != '' ){
            	$value = '%'.strtolower($value).'%';
            	$selectCommunautes->where('LOWER('.$field.') LIKE ?' , $value);
            }
     
            if( $banni != 'all' ){
            	$selectCommunautes->where('banni = ?' , $banni);
            }
     
    		$selectCommunautes->order('id DESC');
     
     		return $selectCommunautes;
     	}
    Pour plus d'infos RDV ici (doc de Zend)

    Cordialement,
    Ahmed.

  10. #10
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    215
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 215
    Par défaut
    @abenlahsen : ton système est compliqué moche pas sécurisé et casse le système MVC. Désolé

  11. #11
    Membre averti
    Inscrit en
    Juin 2010
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 34
    Par défaut
    godzinho magnifique ça fonctionne !!!!!!! super super je commence à apprendre un peu plus.

    Si tu pouvais me dire comment je fais pour utiliser fetchRow pour aller rechercher le pseudo du gagnant en fonction de l'id de l'enchere

    Vraiment merci d'avance (c'est chaud Zend y'a beaucoup de vocabulaire à connaitre)

  12. #12
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    215
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 215
    Par défaut
    @tomtom94500 : ce que t'as écris godzinho c'est exactement ce que je t'ai dis de faire ...

    Cependant dans ce que nous t'avons montré il y a un défaut : cela casse le modèle MVC : à savoir jamais de sql dans un contrôleur. Tu dois créer une méthode publique dans ton modèle pour récupérer cela précisément. Ou alors créer un petit parseur sql simple.

  13. #13
    Membre averti
    Inscrit en
    Juin 2010
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 34
    Par défaut
    c'est ce code là qui fonctionne, pas l'autre super compliqué de [B]abenlahsen/B] (désolé abenlahsen )

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
     
    <?php
     
    class EnchereCocoController extends Zend_Controller_Action
    {
        function indexAction()
        {
            $this->view->title = "Encheres Coco";
            $enchere = new Model_DbTable_Encheres();
            $sql = $enchere->select()->where('validation=?',2);
            $this->view->encheres = $enchere->fetchAll($sql);
        }
    }
    Comment faire pour aller chercher maintenant les pseudo des gagnants en fonction de l'id de l'enchere svp

  14. #14
    Membre éprouvé
    Homme Profil pro
    Ingenieur BI - Dev Web Senior
    Inscrit en
    Décembre 2009
    Messages
    118
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Maroc

    Informations professionnelles :
    Activité : Ingenieur BI - Dev Web Senior

    Informations forums :
    Inscription : Décembre 2009
    Messages : 118
    Par défaut
    Bonjour Feng-Huang,

    Qu'est ce qui va pas avec ma solution?
    Merci de me corriger si j'ai un FAIL de sécurité.

    Cordialement,
    Ahmed.

  15. #15
    Membre averti
    Inscrit en
    Juin 2010
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 34
    Par défaut
    Je retiens la leçon pas de sql dans un controller
    La vache c'est pour ça que il y a tant de vocabulaire à connaitre...

  16. #16
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Mars 2006
    Messages
    70
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2006
    Messages : 70
    Par défaut
    @Feng-Huang : peux-tu me dire pourquoi faire hériter les modèles de Zend_Db_Table plutôt que Zend_Db_Table_Abstract ? Merci d'avance.

    @tomtom94500 : pour ne sélectionner que le pseudo tu dois le spécifier en ajoutant la méthode from() à la suite du select()
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $sql = $enchere->select()->from($nomTable,'nomColonne')->where('validation=?',2);

  17. #17
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Mars 2006
    Messages
    70
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2006
    Messages : 70
    Par défaut
    Pour rejoindre Feng-Huang, mieux vaut créer des méthodes dans ton modèle pour récupérer des infos précises.

    Par exemple :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public function getPseudo($id){
    $select = $this->_db->select();
    $select->from($this->_name,'*') // tu peux remplacer le * par les colonnes que tu veux
    $select->where('id=?',$id);
     
    return $this->_db->fetchAll($select);
    }

  18. #18
    Membre confirmé
    Profil pro
    Inscrit en
    Décembre 2008
    Messages
    215
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Décembre 2008
    Messages : 215
    Par défaut
    @godzinho : dans la mesure où Zend_Db_Table hérite directement de Zend_Db_Table_Abstract et ne définit aucune méthode, on peut se dire que cela ne change rien. Mais si lors d'une update de ZF, Zend_Db_Table définit de nouvelles méthode, ou fait varier un comportement logique, tu devra revoir ton code. Ce qui est dommage puique définir dès le début un héritage à Zend_Db_Table n'affecte en rien le développement de ton application et te permettra éventuellement de bénéficier d'amélioration.

  19. #19
    Membre averti
    Inscrit en
    Juin 2010
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 34
    Par défaut
    @godzinho Non justement c'est ça le problème !!!!

    C'est que le pseudo de mon gagnant se trouve dans une autre table que celle de enchere...

    Tout ce que je sais pour l'instant c'est que il va me falloir créer une nouvelle connexion au Models_DbTable_Gagnants (hérité de _abstract bien sur) et que apparement il faut que j'utilise la méthode fetchRow mais comment

    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
     
    <?php
     
    class EnchereCocoController extends Zend_Controller_Action
    {
        function indexAction()
        {
            $this->view->title = "Encheres Coco";
            $enchere = new Model_DbTable_Encheres();
            $sql = $enchere->select()
                           ->where('validation=?',2)
                           ->order('id');
            $this->view->encheres = $enchere->fetchAll($sql);
     
    // Ma fameuse connexion à ma nouvelle table gagnants (héritée de _abstract)
            $gagnant = new Model_DbTable_Gagnants();
    // comment utiliser le fetchRow pour aller rechercher en fonction de l'id de l'enchere, le pseudo du gagnant
        }
    }
    C'est ça le truc c'est que j'utilise 2 table aucun tutoriel ne parle de 2 connexions en meme temps, tandis que je sais que vous pouvez m'aider sur ce point là !

  20. #20
    Membre confirmé
    Profil pro
    Étudiant
    Inscrit en
    Mars 2006
    Messages
    70
    Détails du profil
    Informations personnelles :
    Âge : 39
    Localisation : France, Haute Garonne (Midi Pyrénées)

    Informations professionnelles :
    Activité : Étudiant

    Informations forums :
    Inscription : Mars 2006
    Messages : 70
    Par défaut
    @Feng-Huang : tout à fait vrai. Mais où avais-je la tête...
    Je m'en vais de ce pas changer mes héritages.

    @tomtom94500 : ce n'est pas très grave. Soit tu as fais les jointures dans ton modèle et tu peux récupérer le pseudo.
    Soit si tu récupères l'id du pseudo, tu créé simplement un nouvel objet qui instancie le modèle où se trouve le pseudo et tu le récupères.

Discussions similaires

  1. expression a utiliser dans un controle calculé
    Par gui-llaume dans le forum IHM
    Réponses: 2
    Dernier message: 26/11/2007, 12h33
  2. probleme d'utilisation d api c dans des controle forms avec wpf
    Par ZashOne dans le forum Windows Presentation Foundation
    Réponses: 4
    Dernier message: 24/07/2007, 12h04
  3. Réponses: 1
    Dernier message: 12/02/2007, 12h43
  4. Utiliser les touches flèche dans un controle Edit
    Par Henri dans le forum Windows
    Réponses: 6
    Dernier message: 26/05/2006, 22h32
  5. Réponses: 8
    Dernier message: 17/12/2004, 15h58

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