Précédent   Forum des professionnels en informatique > PHP > Outils > Zend > Zend Framework > Zend_Db
Zend_Db Forum d'entraide pour le composant Zend_Db du Zend Framework (création de requêtes, abstraction, ORM etc.). Avant de poster -> FAQ Zend_Db.
Partagez cette discussion sur d'autres réseaux sociaux : Viadeo Twitter Google Facebook Digg Delicious MySpace Yahoo
Réponse Proposer ce sujet en actualité
 
Outils de la discussion
Publicité
'
Vieux 28/09/2007, 11h03   #1
Expert Confirmé
 
Avatar de sekaijin
 
Femme
Urbaniste
Inscription : juillet 2004
Messages : 1 426
Détails du profil
Informations personnelles :
Sexe : Femme
Âge : 48
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Urbaniste
Secteur : Santé

Informations forums :
Inscription : juillet 2004
Messages : 1 426
Points : 2 813
Points : 2 813
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 :
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 :
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 :
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 :
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
sekaijin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 28/09/2007, 11h04   #2
Expert Confirmé
 
Avatar de sekaijin
 
Femme
Urbaniste
Inscription : juillet 2004
Messages : 1 426
Détails du profil
Informations personnelles :
Sexe : Femme
Âge : 48
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Urbaniste
Secteur : Santé

Informations forums :
Inscription : juillet 2004
Messages : 1 426
Points : 2 813
Points : 2 813
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 :
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 :
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
sekaijin est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 13/10/2007, 17h19   #3
Expert Confirmé
 
Avatar de sekaijin
 
Femme
Urbaniste
Inscription : juillet 2004
Messages : 1 426
Détails du profil
Informations personnelles :
Sexe : Femme
Âge : 48
Localisation : France, Yvelines (Île de France)

Informations professionnelles :
Activité : Urbaniste
Secteur : Santé

Informations forums :
Inscription : juillet 2004
Messages : 1 426
Points : 2 813
Points : 2 813
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 --
sekaijin est déconnecté   Envoyer un message privé Réponse avec citation 00
Réponse Proposer ce sujet en actualité Cette discussion est résolue.
Outils de la discussion



Fuseau horaire GMT +2. Il est actuellement 06h09.


 
 
 
 
Partenaires

Hébergement Web