Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
Pages: 1
Bonjour,
J'ai un problème pour mettre à jour une table en utilisant la méthode update() de l'objet Zend_Db_Table.
En dépliant le code source, je m'aperçois que dans la classe Zend_Db_Adapater_Abstract, la méthode update foire (ligne 526 du fichier Zend/Db/Adapter/Abstract.php)
En y regardant de plus près (vive zend_studio pour le débug!), cette méthode appelle Zend_Db_Statement->execute($params) qui utilise Zend_Db_Statement_Mysqli->_execute($params).
Les paramètres sont corrects (nom des champs de la table + valeur) : le pb semble provenir du membre _smt de Zend_Db_Statement_Mysqli qui est null. En effet, lors de l'appel de la méthode Zend_Db_Statement_Mysqli->_execute($params), un test est effectué sur $this->_smt pour vérifier qu'il n'est pas nul avant d'exécuter la requête. PB : ce membre est null!! Donc la requête d'update n'est jamais exécutée.
De plus, aucune erreur n'est retournée : il faut bcp de recherche pour comprendre le pb.
Quelqu'un a t il eu ce pb ou une idée?
J'ai probablement oublié un truc
merci
Yoong
Dernière modification par kiminox (15-07-2008 22:15:56)
Hors ligne
pourrais tu nous donner ton code d'appel comment du créé ton objet et comment tu t'en sert
a+JYT
Hors ligne
Pour résumer l'appel :
- dans l'action :
initialisation de l'objet $table, héritant de Zend_Db_Table.
requete pour récupérer le contenu de la table à modifier.
A la fin, l'objet est sauvegardé en session.
Lors de la soumission du formulaire : récupération de l'objet en session et on peuple son contenu avec les données du formulaire
- dans mon service (oui j'utilise une couche service qui se fonde sur des business object, class héritant de Zend_Db_Table) :
après des contrôles métier, je fais simplement $table->update($dataNotNull, $where); où $dataNotNull est un tableau de nomChamp->valeur et $where=$table->getAdapter()->quoteInto('champClePrimaire = ?', $idRecupereDuForm);
Exactement ce qu'indique la doc : http://framework.zend.com/manual/fr/zen … ble.update
Mais j'ai sans doute oublié un truc.
Je te donne aussi mes logs d'erreur :
2008-07-15T21:48:15+02:00 ERR (3): [2008-07-15 21:48:15]-[N°2][Alerte] : mysqli::real_escape_string() [<a href='function.mysqli-real-escape-string'>function.mysqli-real-escape-string</a>]: Couldn't fetch mysqli => D:\yoong\sites\gdb\lib\Zend\Db\Adapter\Mysqli.php - 102
2008-07-15T21:48:15+02:00 ERR (3): [2008-07-15 21:48:15]-[N°2][Alerte] : mysqli::real_escape_string() [<a href='function.mysqli-real-escape-string'>function.mysqli-real-escape-string</a>]: Couldn't fetch mysqli => D:\yoong\sites\gdb\lib\Zend\Db\Adapter\Mysqli.php - 102
2008-07-15T21:48:15+02:00 ERR (3): [2008-07-15 21:48:15]-[N°2][Alerte] : mysqli::prepare() [<a href='function.mysqli-prepare'>function.mysqli-prepare</a>]: Couldn't fetch mysqli => D:\yoong\sites\gdb\lib\Zend\Db\Statement\Mysqli.php - 77
2008-07-15T21:48:15+02:00 ERR (3): [2008-07-15 21:48:15]-[N°2][Alerte] : Zend_Db_Statement_Mysqli::_prepare() [<a href='function.Zend-Db-Statement-Mysqli--prepare'>function.Zend-Db-Statement-Mysqli--prepare</a>]: Couldn't fetch mysqli => D:\yoong\sites\gdb\lib\Zend\Db\Statement\Mysqli.php - 79
2008-07-15T21:48:15+02:00 ERR (3): [2008-07-15 21:48:15]-[N°2][Alerte] : Zend_Db_Statement_Mysqli::rowCount() [<a href='function.Zend-Db-Statement-Mysqli-rowCount'>function.Zend-Db-Statement-Mysqli-rowCount</a>]: Couldn't fetch mysqli => D:\yoong\sites\gdb\lib\Zend\Db\Statement\Mysqli.php - 358
Yoong
Dernière modification par kiminox (15-07-2008 21:48:41)
Hors ligne
Bonsoir,
en écrivant le précédent post, j'ai du retracé et détaillé mes actions pour que sekaijin comprenne ce que j'ai fait...et j'ai trouvé mon problème.
En effet, je récupère le business objet, class spécialisée de Zend_Db_Table, depuis...la session!!
En effet, je stocke mon objet correctement initialisé (notamment concernant la connexion à la base) en session : aussi quand je le récupère, ma connexion est perdue.
Pour information à tous ceux qui pourraient être concernés (stockage des objets de session) : L'utilisation de connexions persistantes n'est pas supporté, ni conseillé, par le composant Zend_Db.
cf. article http://framework.zend.com/manual/fr/zend.db.html, chapitre 10.1.8. Fermer une connexion.
ou chapitre concernant la sérialisation (automatique dans les sessions) 10.6.4.3. Reconnecter l'objet Row à la Table
La solution à mon problème de l'objet récupéré depuis la session en lecture seule : il faut donc le reconnecter à la base, par exemple en faisant un refresh sur l'objet en cours de modification avant de modifier ses valeurs récupérées depuis le form.
Yoong
Hors ligne
Pages: 1