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. #21
    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,

    c'est ce code là qui fonctionne, pas l'autre super compliqué de [B]abenlahsen/B] (désolé abenlahsen )
    Excuse moi mais cette solution casse le MVC!

    Moi je ferais pas ce code dans mon contrôleur! Je créer une fonction dans mon modèle et je l'appel dans mon action

    @tomtom94500 Le code que je t'ai donné illustre comment ajouté la clause where pas plus! Plus, bien évidemment, l'ajouter dans une fonction dans un modèle et pas dans le contrôleur.


    Cordialement,
    Ahmed.

  2. #22
    Membre averti
    Inscrit en
    Juin 2010
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 34
    Par défaut
    Je vais pas trop vous en demander non plus, mais bon...

    Au niveau des instanciations je suis pas très bon ça serait possible d'avoir un petit code d'exemple svp ?

  3. #23
    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 :
    Tu ne précise pas dans quel contexte tu as, mais j'ai l'impression qu'on est dans ton modèle de table ( tu n'aurais pas fais de méthode comme celle-la dans un contrôleur, t'as pas fais ça hein ?!!! ).
    Partant de ce postulat, tu n'utilise pas l'objet $this pour définir le from. Tu appel l'adapteur de Zend_Db_Table puis fais un micmac monumental pour instancier un objet Zend_Db_Select , alors que tu pourrais faire simplement :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $select = $this->select() // retourne Zend_Db_Table_Select
    Pour reprendre ce que j'ai dis : compliqué et moche, ça c'est visuel :p
    Ça casse le système MVC dans la mesure où tu définis des paramètres qui affectent ta méthode dans le modèle lui-même ( cf. ton prototype : public function listCommunautes($field = 'email', $value= '', $banni = 'all') )
    Et enfin pas sécurisé dans la mesure où tu concatène directement la variable $field dans ton appel de la méthode where (au lieu de la binder comme $value.

  4. #24
    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
    Merci @Feng-Huang

  5. #25
    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 : la question est-elle " qu'est-ce qu'une instanciation ? "
    Si oui alors ceci :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    $DbTable = new Model_DbTable_Foo;
    Est une instanciation de la classe Model_DbTable_Foo. Cette instanciation, ce traduit par la création d'un objet de type Model_DbTable_Foo qui est désormais contenu dans la variable $DbTable.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $instance1 = new Une_Classe_Bidon('foo');
    $instance2 = new Une_Classe_Bidon('bar');
    Alors les deux objets sont des instances Une_Classe_Bidon mais ces deux objets sont différents, car ils représentent chacun une instance différente.
    Si tu construit 2 maisons avec le même plan, alors tu as 2 instances du plan.

    Concernant ta requête tomtom94500 , ouvre un nouveau sujet dans la secion appropriée du forum SGBD -> SGBD & Sql -> <ton_sgbd>. Une fois que tu as ta requête, reviens ici et ouvre un sujet dans la section Zend_Db pour transformer ta requête SQL brute en objet Zend_Db_Table_Select

  6. #26
    Membre averti
    Inscrit en
    Juin 2010
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 34
    Par défaut
    Oui d'accord je vois à peu près... Mais moi je suis toujours sur le meme probleme : aller rechercher le pseudo de mon gagnant en fonction de l'id de l'enchere car je n'y arrive pas !

    Bon je balance mes pages pour que ça soit plus simple :
    models/DbTable/Encheres.php
    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';
    }
    models/DbTable/Gagnants.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <?php
     
    class Model_DbTable_Gagnants extends Zend_Db_Table_Abstract
    {
        protected $_name = gagnant;
    }
    EnchereCocoController.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
    19
    20
    21
    <?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 DESC');
            $this->view->encheres = $enchere->fetchAll($sql);
    
    // Comment faire pour aller chercher le pseudo de mon gagnant
            $gagnant = new Model_DbTable_Gagnants();
            $sql = $gagnant->select()
                           ->where('id=?',2);
            $this->view->gagnants = $gagnant->fetchRow($sql);
        }
    }
    views/scripts/enchere-coco/index.phtml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <?php foreach($this->encheres as $enchere) : ?>
    id :<? echo $this->escape($enchere->id); ?>
    titre :<? echo $this->escape($enchere->titre); ?>
    Comment ressortir ici le pseudo de mon gagnant en fonction de l'id de l'enchere
    <?php endforeach; ?>

  7. #27
    Membre averti
    Inscrit en
    Juin 2010
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 34
    Par défaut
    débloquez moi svp^

  8. #28
    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
    Ne connaissant pas ta BD, on ne va pas pouvoir t'aider.
    A un moment donné il te faut récupérer l'id du gagnant pour aller récupérer son pseudo. Si tu n'as pas cette info dans ta table enchere, tu dois la récupérer par un autre moyen.

    Mais dans tous les cas tu dois récupérer l'id du gagnant et appeler la méthode adéquat pour avoir le pseudo.

  9. #29
    Membre averti
    Inscrit en
    Juin 2010
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 34
    Par défaut
    Ma BD est très simple !!!!

    dans ma table gagnant j'ai enregistré l'id de l'enchere (id_enchere) et l'id du gagnant (id_gagnant)

    J'aimerais retrouver id_gagnant en fonction de l'id_enchere dans ma boucle foreach...
    voila c'est tou

  10. #30
    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
    Il te suffit donc de récupérer l'id du gagnant dans un premier temps.
    Puis tu récupères le pseudo dans une autre table je suppose.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public function getIdGagnant($idEnchere){
    $select = $this->_db->select();
    $select->from($this->_name,'id_gagnant')
    ->where('idEnchere=?',$idEnchere);
     
    return $this->_db->fetchRow($select);
    }
    Puis tu fais la même chose une fois que tu as l'id du gagnant.

  11. #31
    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
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT * FROM encheres LEFT JOIN gagnants ON encheres.id = gagnants.enchere_id
    Soit en version Zend :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $select = $this->select()->setIntegrityCheck(false)
    ->from($this,array('id','nom_produit'))
    ->joinLeft('gagnants','encheres.id = gagnants.enchere_id',array('id'))
    ->order('enchere.date DESC')
    Youhou

  12. #32
    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 : tu fais des étapes inutiles dans ton modèle (outre le fait qu'il faut faire une jointure et pas une requête pour chaque enchère) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public function getIdGagnant($idEnchere){
    $select = $this->select();
    $select->from($this,'id_gagnant')
    ->where('idEnchere=?',$idEnchere);
     
    return $this->fetchRow($select);
    }
    C'est plus court et donne le même résultat

  13. #33
    Membre averti
    Inscrit en
    Juin 2010
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 34
    Par défaut
    Bon d'accord je vois la démarche a effectuer... cependant j'insere la fonction getIdGagnant dans mon controller ? ou dans mon models ?
    Et comment je fais pour m'en servir de cette fonction par la suite dans mon index.phtml ? (jsuis vraiment un foutu débutant très nul)

  14. #34
    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
    On a tous été un foutu débutant très nul :p

    Comme je l'ai dis plutôt, pas de sql dans un contrôleur, il va de soit que ce n'est pas dans la vue évidemment, donc c'est dans ton modèle

    Dans ton modèle :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    public function getFullList(){
    $select = $this->select()->setIntegrityCheck(false)
        ->from($this,array('id','nom_produit'))
        ->joinLeft('gagnants','encheres.id = gagnants.enchere_id',array('id'))
        ->order('enchere.date DESC')
     
    return $this->fetchAll($select);
    }
    Dans ton contrôleur :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    $DbTable = new Model_DbTable_Encheres;
    $this->view->encheres = $DbTable->getFullList()
    Enfin dans ta vue :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    foreach($this->encheres AS $enchere){
    echo '<tr><td>',$enchere->nom_produit,'</td><td>',$enchere->gagnant_id,'</td></tr>';
    }
    Et la tu vois que tu dois encore faire une jointure pour récupérer le pseudo du membre (oui l'ID n'est pas très parlant pour l'utilisateur :p ).
    Tu essaye de modifier le modèle ?

  15. #35
    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
    Citation Envoyé par Feng-Huang Voir le message
    @godzinho : tu fais des étapes inutiles dans ton modèle (outre le fait qu'il faut faire une jointure et pas une requête pour chaque enchère) :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    public function getIdGagnant($idEnchere){
    $select = $this->select();
    $select->from($this,'id_gagnant')
    ->where('idEnchere=?',$idEnchere);
     
    return $this->fetchRow($select);
    }
    C'est plus court et donne le même résultat
    Tu m'en apprends encore.
    Merci pour tes conseils.

    Sinon tomtom94500 devrait s'en être tiré avec ce que tu viens de lui proposer.

  16. #36
    Membre averti
    Inscrit en
    Juin 2010
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 34
    Par défaut
    Bon moi je ne veux pas utiliser la méthode de jointure c'est trop compliqué, tandis que créer une fonction pour récupérer l'id dans ma tête ça passe mieux

    Bon je suis loin d'avoir réussi, je vais bientot craqué, merci de m'avoir suivi en tout cas, mais surfer entre les bases de données c'est ce qui fait qu'un site est un site internet !
    Donc si j'arrive pas a surfer entre les base de données, je laisse tomber et je reste en php4.

    Dernièr essai je balance mes pages parceque là j'en peux plus :

    EnchereCocoController.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 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 DESC');
            $this->view->encheres = $enchere->fetchAll($sql);
    
    De quelle manière je dois faire appelle à la fonction getIdGagnant() ??????
    
        }
    }
    index.phtml
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    <?php foreach($this->encheres as $enchere) : ?>
    id :<? echo $enchere->id; ?>
    titre :<? echo $enchere->titre; ?>
    De quelle manière j'affiche l'ID du gagnant (enfonction de l'id de l'enchere blabla.....) !
    <?php endforeach; ?>
    models/DbTable/Encheres.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
     
    <?php
     
    class Model_DbTable_Encheres extends Zend_Db_Table_Abstract
    {
        protected $_name = 'enchere';
     
            public function getIdGagnant($idEnchere)
            {
                $sql = $gagnant->select()
                               ->from($gagnant,'id_gagnant')
                               ->where('id_enchere=?',$idEnchere);
            return $gagnant->fetchRow($sql);
            }
    }
    models/DbTable/Gagnants.php
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
     
    <?php
     
    class Model_DbTable_Gagnants extends Zend_Db_Table_Abstract
    {
        protected $_name = 'gagnant';
    }




    Bref si des gens sur Paris sont dispo pour me donner un cours particulier je suis preneur...

    Et si vous me dépannez beinh ça serait bien merci

  17. #37
    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
    Boucler pour récupérer les gagnants un à un est tellement scandaleux que je ne t'aiderai pas pour ça.

  18. #38
    Membre averti
    Inscrit en
    Juin 2010
    Messages
    34
    Détails du profil
    Informations forums :
    Inscription : Juin 2010
    Messages : 34
    Par défaut
    @Feng-Huang j'ai l'impression que les messages privés ne marchent pas, tu as reçu mon message privé ou pas ??????

  19. #39
    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
    Il me semble que tu t'offusques vite Feng-Huang. Tout le monde a le droit à ses débuts...

    @tomtom94500 : pour appeler la fonction getIdGagnant dans ton contrôleur. Tu instancies un objet sur la classe des encheres et tu fais appels à la méthode depuis cette instance.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    class EnchereCocoController extends Zend_Controller_Action
    {
        function indexAction()
        {
            ...
            $enchere = new Model_DbTable_Encheres();
            $idGagnant = $enchere->getIdGagnant($idEnchere);
            $this->view->idGagnant = $idGagnant; // on envoi à la vue
        }
    }
    Puis dans la vue tu fais comme d'habitude :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    idGagnant :<? echo $enchere->idGagnant; ?>

  20. #40
    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
    Est-ce que tu te rends compte de ce que ça représente une requête dans une boucle ? Quand il affichera la page des gagnants, mettons qu'il mette 20 enchères par page, ça veut dire 21 requêtes, rien que pour le corps de la page. Même avec des requêtes préparées, ça craind. Et plus si il refuse la jointures ça veut dire une requête de plus pour récupérer le pseudo du gagnant. Soit 41 requêtes, la où on peut en faire 1 seule.
    Ce n'est pas s'offusquer, c'est juste que je veux bien apporter mon aide, mais pas encourager à faire des bétises.

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, 13h33
  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, 13h04
  3. Réponses: 1
    Dernier message: 12/02/2007, 13h43
  4. Utiliser les touches flèche dans un controle Edit
    Par Henri dans le forum Windows
    Réponses: 6
    Dernier message: 26/05/2006, 23h32
  5. Réponses: 8
    Dernier message: 17/12/2004, 16h58

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