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_Db PHP Discussion :

[Débutant] SELECT avec condition WHERE + précisions [ZF 1.9]


Sujet :

Zend_Db PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Inscrit en
    Septembre 2009
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 43
    Par défaut [Débutant] SELECT avec condition WHERE + précisions
    Bonjour à tous,

    Je débute sous ZF et je galère un peu pour la partie base de donnée, sélection des données, affichage de ces données.

    J'ai bien lu le tutoriel pour débutant de helmi dridi. Ça m'a permis de comprendre comment faire une requête et un affichage simple.

    Le problème c'est qu'aujourd'hui j'aurais besoin de faire une condition dépendant d'une variable, et je ne vois pas du tout comment faire ?

    J'ai regardé la présentation du Zend Framework par Julien Pauli, notamment la partie sur le zend_db qui m'a laissé encore plus perplexe, et l'atelier sur "la puissance des modèles" par Julien Pauli aussi, de même que la FAQ Zend...

    Et la je dois me rendre à l'évidence : j'pige pas...
    Pourtant je ne cherche pas à faire quelque chose de complexe : j'ai deux tables, une "programmes" et une "videos". Comme un programme peut contenir plusieurs vidéos, ma table "videos" contient un champs "prog_id" selon l'id du programme auquel elle se réfère.

    Je voudrais donc récupérer le nom, la ville, la description du programme ainsi que la ou les vidéos (source, hauteur, largeur) dont le prog_id correspond à l'id du programme actuellement en cours de traitement.
    En gros quelque chose du genre :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    SELECT programme.nom, programme.ville, programme.description, videos.src, videos.height, video.width FROM programme, videos WHERE videos.prog_id = programme.id
    Pour ensuite afficher à l'aide d'une boucle chaque programme suivi d'un lien menant vers la/les vidéos associés.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    While($key => $val) {
       echo 'nom : '.$val["programme.nom"].'etc etc, video : '.$val["videos.src"].'etc etc';
    }
    Y aurait-il un exemple simple et compréhensible que j'aurai raté ? Un que je pourrai copier, tester et comprendre ?

    J'aurai tout de même retenu qu'il ne faut pas faire de requête SQL dans le contrôleur... très bien, mais ou dois-je les mettre alors ? Tout dans le modèle ?
    Au jour d'aujourd'hui j'ai deux modèles (mes deux tables, programmes et videos) , mes contrôleurs font appel à ces modèles (require_once 'blablabla'; ) et envoie des tableaux à la vue ( $this->view->prog = $prog->fetchall()->toArray(); ) puis affichage dans la vue ( <?php echo '<h2>'.$this->escape($val['ville']).'</h2>'; ?> )
    Est-ce correct ?

    Par avance merci pour toutes les précisions que vous pourriez m'apportez.

  2. #2
    Membre confirmé
    Inscrit en
    Septembre 2009
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 43
    Par défaut
    Problème "semi" résolu grâce à la doc.

    Voila comment j'ai procédé :
    *Dans mon boot :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    $db = Zend_Db::factory ( $config->database ); 
    $db->getConnection ();
    Zend_Registry::set ('db',$db);
    Zend_Db_Table::setDefaultAdapter ( $db );
    *Dans mon controller :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    $db = Zend_Registry::get('db'); 
    $select = $db->select()
        ->from(array('p' => 'programmes'), array('id','nom','ville','description'))
        ->joinLeft(array('v' => 'videos'), "v.prog_id = p.id" , array('src') );
    $row = $db->fetchAll($select);
    $this->view->prog = $row;
    *Dans ma view :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    foreach ($this->prog as $key => $val):
       echo '<h2>'.$this->escape($val['ville']).'</h2>
       <h3>"'.$this->escape($val['nom']).'"</h3>
       <p>'.nl2br($this->escape($val['description'])).'</p>' ;
    //etc etc
    endforeach;
    Cela fonctionne, MAIS je n'utilise actuellement plus de modèle...
    Je pense donc que je ne procède pas comme il le faudrait, mais je ne vois toujours pas comment faire... des pistes ?

    Merci d'avance

  3. #3
    Membre Expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Par défaut
    Tu pourrais utiliser des objets héritant de Zend_Db_Table_Abstract avec un mapping des dépendances.
    Par exemple :

    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    <?php
    class Model_DbTable_Programme extends Zend_Db_Table_Abstract {
     
        protected $_name    = 'programme';
        protected $_primary = 'id';
        protected $_dependentTables = array('Model_DbTable_Videos');
     
        public function getById($id) {
            return $this->find($id)->current();
        }
     
        public function getRows() {
            $rows = $this->fetchAll( $this->select()->order('nom ASC') );
            return $rows;
        }
     
     
    }
     
     
    <?php
    class Model_DbTable_Videos extends Zend_Db_Table_Abstract {
     
        protected $_name    = 'videos';
        protected $_primary = 'id';
     
        protected $_referenceMap    = array(
            'programme' => array(
                'columns'           => array('prog_id'),
                'refTableClass'     => 'Model_DbTable_Programme',
                'refColumns'        => array('id')
            )
        );
     
        public function getById($id) {
            return $this->find($id)->current();
        }
     
        public function getRows() {
            $rows = $this->fetchAll( $this->select()->order('id ASC') );
            return $rows;
        }
     
     
    }
    Et ensuite utiliser les fonctionnalités de ZF pour récupérer les enregistrements enfants (findDependentRowset).
    Mais est-ce plus performant que ta méthode, je ne suis pas sûr.

  4. #4
    Membre confirmé
    Inscrit en
    Septembre 2009
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 43
    Par défaut
    Merci pour la réponse. Je vais regarder cela et vous tient au courant.

    Mais est-ce plus performant que ta méthode, je ne suis pas sûr.
    Le problème de la méthode que j'utilise n'est pas tellement la performance. C'est juste que comme je me sers d'une bdd je devrais utiliser des modèles (ou du moins il me semble que ce devrait être comme ça selon MVC) et que je n'en utilise pas. Cela me semble bizarre.

  5. #5
    Membre confirmé
    Inscrit en
    Septembre 2009
    Messages
    43
    Détails du profil
    Informations forums :
    Inscription : Septembre 2009
    Messages : 43
    Par défaut
    Me revoilà ,

    Je met donc en résolu, ce que j'ai me satisfaisant.

    Modèle (J'ai utilisé la méthode de s.n.a.f.u) :
    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
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    <?php
    require_once 'Zend/Db/Table/Abstract.php';
     
    class Model_DbTable_Programme extends Zend_Db_Table_Abstract {
      protected $_name = 'programme';
      protected $_primary = 'id';
      protected $_dependentTables = array('Model_DbTable_Videos');
     
      //Ici la fonction me permettant de récupérer tout mes programmes
      //Au lieu de la mettre dans le controleur  
      public function allProgs() {
       $db = Zend_Registry::get('db'); 
       $select = $db->select()
       ->from(array('p'=>'programmes'),array('id','nom','ville','etc'))
       ->joinLeft(array('v'=>'videos'),"v.prog_id=p.id",array('src','type','etc'))
       ->order(array('p.id DESC','v.id'));
       $row = $db->fetchAll($select);
       return $row;
     }  
    }
     
     
    class Model_DbTable_Videos extends Zend_Db_Table_Abstract {
      protected $_name = 'videos';
      protected $_primary = 'id';
     
      protected $_referenceMap = array(
        'programme' => array(
          'columns'           => array('prog_id'),
          'refTableClass'     => 'Model_DbTable_Programme',
          'refColumns'        => array('id')
        )
      );  
    }?>
    Contrôleur :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    <?php
    require_once '../application/models/Db_Table.php';
     
    class InvestirController extends Zend_Controller_Action {
      function projetAction() {
        // On fait appel au modèle pour selectionner nos programmes   
        //Et on envoie le tout à la vue
        $row = Model_DbTable_Programme::allProgs();
        $this->view->prog = $row;
     
      }
    }?>
    Vue :
    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
    <?
    //On boucle pour les programmes
    foreach ($this->prog as $key => $val):
    ?>
     
      <div class='boite'>
        <?php 
        echo '<h2>'.$this->escape($val['ville']).'</h2>
        <h3>"'.$this->escape($val['nom']).'"</h3>
        <p>Type : '.$this->escape($val['genre']).'</p>
        <p>'.$this->translate->_( trim($val['description']) ).'</p>'; 
        //etc etc pour l'affichage de nos données
        ?>
      </div>
     
    <?php
    endforeach;
    ?>
    Boot :
    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
    <?php
    //Le necessaire pour la base de données
    // Création d'un objet à partir du fichier ini 
    $configPath = 'mon/chemin/de/config/config.ini';  
    $config = new Zend_Config_Ini ( $configPath, 'prog' );
     
    // Construction d'un objet $db permettant d'utiliser la base de données
    $db = Zend_Db::factory ( $config->database );
    $db->getConnection ();
     
    //On stock la valeur dans le registre
    Zend_Registry::set ('db',$db);
     
    //DB par default 
    Zend_Db_Table::setDefaultAdapter ( $db );
    ?>
    Fichier .ini :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    [prog]
    database.adapter = pdo_mysql
    database.params.host = 127.0.0.1
    database.params.username = username
    database.params.password = pass
    database.params.dbname =  myDataBase
    Voila, tout le nécessaire pour les suivants qui auraient le même (genre de) problème

  6. #6
    Membre Expert
    Avatar de s.n.a.f.u
    Homme Profil pro
    Développeur Web
    Inscrit en
    Août 2006
    Messages
    2 760
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 50
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Août 2006
    Messages : 2 760
    Par défaut
    Merci pour le suivi et le code d'exemple !

    Ah, si tout le monde pouvait faire ça...

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Problème avec condition WHERE dans commande SELECT
    Par Badouba76 dans le forum Objective-C
    Réponses: 3
    Dernier message: 08/11/2013, 18h19
  2. [Débutant] pb avec clause WHERE
    Par bogsy15 dans le forum Langage SQL
    Réponses: 3
    Dernier message: 11/08/2006, 09h49
  3. Réponses: 3
    Dernier message: 16/02/2006, 16h58
  4. [HyperFile] requete de selection avec condition de comptage
    Par pierre.zelb dans le forum HyperFileSQL
    Réponses: 1
    Dernier message: 16/02/2006, 10h20
  5. Réponses: 6
    Dernier message: 08/06/2004, 14h51

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