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
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 $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));
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
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; }
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 $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);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.
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; }
A+JYT
Partager