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 :

[BUG] Zend_Db_Select query method


Sujet :

Zend_Db PHP

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Expert confirmé
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Par défaut [BUG] Zend_Db_Select query method
    Salut à tous je pense qu'il y a un BUG dans Zend_Db
    la classe Zend_Db_Select défini une methode query
    celle-ci permet de spécifier le mode de retour des donnés Zend_Db::FETCH_OBJ Zend_Db::FETCH_ASSOC etc.
    le peut de commentaire dispos disent que le retour est un Zend_Db_Statement (ou son équivalent PDO)

    mais en regardant de plus près le code cette méthode ne crée pas un Statement mais appelle la méthode query de l'adaptateur. qui lui exécute la requête et ne fixe le FetchMode qu'après.

    Si la requête contient des paramètres cette méthode sur Zend_Db_Select ne permet pas de passer le binding du coup on obtient un "Invalid parameter number: no parameters were bound"

    si j'en crois le commentaire cette méthode ne devrait pas exécuter la requête mais retourner un statement.
    et sur ce dernier je pourrais faire un execute.
    ainsi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
          $select = $this->_db->select(); // @var $select Zend_Db_Select
          $select
          ->from('workgroup', array(
             'id'=>'wkg_id', 
             'ident'=>'wkg_code', 
             'name'=>'wkg_label'))
          ->where('wkg_id > :_param');
          $statment = $select->query(Zend_Db::FETCH_OBJ);
          $statment->execute(array('_param', 5));
    mais dans les faits query exécute la requête.
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
        /**
         * @param integer $fetchMode OPTIONAL
         * @return PDO_Statement|Zend_Db_Statement
         */
        public function query($fetchMode = null)
        {
            $stmt = $this->_adapter->query($this); // <== On exécute ici la requête SANS le binding
            if ($fetchMode == null) {
                $fetchMode = $this->_adapter->getFetchMode();
            }
            $stmt->setFetchMode($fetchMode); // <== On fixe le fetchMode
            return $stmt;
        }
    Si par contre je suis la logique des méthodes query des diverses classe de Zend_Db query doit exécuter la requête. il manque alors à cette méthode le paramètre binding pour faire ainsi
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
          $select = $this->_db->select(); // @var $select Zend_Db_Select
          $select
          ->from('workgroup', array(
             'id'=>'wkg_id', 
             'ident'=>'wkg_code', 
             'name'=>'wkg_label'))
          ->where('wkg_id > :_param');
          $statment = $select->query(array('_param', 5),Zend_Db::FETCH_OBJ);
    dans ce cas la méthode query doit être
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
        /**
         * @param integer $fetchMode OPTIONAL
         * @return PDO_Statement|Zend_Db_Statement
         */
        public function query($bind = array(), $fetchMode = null)
        {
            $stmt = $this->_adapter->query($this, $bind); // <== On exécute ici la requête AVEC le binding
            if ($fetchMode == null) {
                $fetchMode = $this->_adapter->getFetchMode();
            }
            $stmt->setFetchMode($fetchMode); // <== On fixe le fetchMode
            return $stmt;
        }
    toujours est-il qu'il y a là une incohérence qui interdit d'utiliser la méthode query sur un select paramétré ce qui est une sacrée limitation car il faut alors systématiquement en passer par d'autres opérations plus complexes.
    A+JYT

  2. #2
    Expert confirmé
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Par défaut
    voici les deux solution que j'ai trouvé pour palier à cette difficulté
    la première consiste à garder sous le coude le fetchMode d'utiliser la méthode fetchAll de l'adaptateur
    puis de restituer le fetchMode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
          $fetchMode = $this->_db->getFetchMode();
          $this->_db->setFetchMode(Zend_Db::FETCH_OBJ);
     
          $select = $this->_db->select(); // @var $select Zend_Db_Select
          $select
          ->from('workgroup', array(
             'id'=>'wkg_id', 
             'ident'=>'wkg_code', 
             'name'=>'wkg_label'))
          ->where('wkg_id > :_param');
          $groups = $this->_db->fetchAll($select, array('_lowNameStart' => strtolower($nameStart).'%',
                                                        '_upNameStart' => strtoupper($nameStart).'%'));
          $this->_db->setFetchMode($fetchMode);
    la seconde consiste à passer par un statement qui lui aura sont propre fetchMode
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
          $select = $this->_db->select(); // @var $select Zend_Db_Select
          $select
          ->from('workgroup', array(
             'id'=>'wkg_id', 
             'ident'=>'wkg_code', 
             'name'=>'wkg_label'))
          ->where('wkg_id > :_param');
          $statment = $this->_db->prepare($select);
          $statment->setFetchMode(Zend_Db::FETCH_OBJ);
          $statment->execute(array('_lowNameStart' => strtolower($nameStart).'%',
                                   '_upNameStart' => strtoupper($nameStart).'%'));
          $groups = $statment->fetchAll();
    A+JYT

  3. #3
    Expert confirmé
    Avatar de sekaijin
    Homme Profil pro
    Urbaniste
    Inscrit en
    Juillet 2004
    Messages
    4 205
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 61
    Localisation : France, Yvelines (Île de France)

    Informations professionnelles :
    Activité : Urbaniste
    Secteur : Santé

    Informations forums :
    Inscription : Juillet 2004
    Messages : 4 205
    Par défaut
    je reporte ici la réponse de julien à ce post sur le forum de Zend
    A+JYT

    Citation Envoyé par julien
    Ok j'ai analysé ton code et je comprends.
    query() execute la requête, ça a toujours été ainsi, mais il est vrai que la méthode query() de Zend_Db_Select diffère de celle de l'adapter; et qu'on ne peut pas lui passer de paramètres pour un binding.
    C'est incohérent comme tu le soulignes, j'ouvre un ticket improvement sur le tracker (bug ZF-2017)

    Merci :-)

    PS : c'est pas array('_param', 5) , mais array('_param'=>5) ^^
    _________________
    Membre AFUP -- Formateur PHP/ZF chez Anaska -- Contributeur au Zend Framework --

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

Discussions similaires

  1. [PDO] Undefined Method query()
    Par Philosophiste dans le forum PHP & Base de données
    Réponses: 3
    Dernier message: 09/05/2013, 13h42
  2. [Objective-C] bug avec class NSDictionnary, methode bug
    Par manonthemoon dans le forum Objective-C
    Réponses: 1
    Dernier message: 21/09/2012, 10h53
  3. Réponses: 6
    Dernier message: 13/06/2011, 12h08
  4. Réponses: 2
    Dernier message: 13/05/2009, 13h43
  5. methode pack bug :(
    Par panthere_noire dans le forum Tkinter
    Réponses: 3
    Dernier message: 04/09/2008, 23h31

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