Consultez la FAQ sur le ZF avant de poster une question
Vous n'êtes pas identifié.
un petit problème que je ne vois pas comment régler.
Bon j'ai pas encore fini de tout lire mais si kk1 à déjà eut le pb ou si par la suite je trouve cela permettra à tous de trouver la solution.
voici donc le top
je lit dans la base un Zend_Db_Table_Row object que je modifie ensuite j'appelle la méthode update
Zend_Db crée alors une requête
UPDATE USR SET usr_ident = ?, usr_pwd = ?, usr_name = ?, usr_firstname = ?, usr_mail = ?, usr_begin_dt = ?, usr_end_dt = ? WHERE ("USR".usr_id = '1')
jusque là rien d'extraordinaire sauf qu'Oracle ne supporte pas les paramètres positionnels
la question est comment lui dire de me générer des requêtes avec des paramètres nommés ?
UPDATE USR SET usr_ident = :id, usr_pwd = :pwd, usr_name = :name, usr_firstname = :first, usr_mail = :mail, usr_begin_dt = :begin, usr_end_dt = :end WHERE ("USR".usr_id = '1')
Je m'imagine mal devoir redéfinir toutes les requêtes générée automatiquement par ZF car là je commence à me dire que si je dois en passer par là alors mieux vaut m'en passer.
A+JYT
Hors ligne
salut je n'ai rien trouvé pour que Zend_Db n'utilise pas les requête avec paramètres positionnels
je suis allé voir dans Zend_Db_Adapter_Abstract (là où est généré la requête) ligne 452 pour insert et 448 pour update
et sans aucun paramétrage la requête est généré avec ?
à moins de changer toutes les valeur de l'objet par des Zend_Db_Expr la requête sera généré avec des ?
J'ai fait un Hack pour vérifier et effectivement c'est le code
foreach ($bind as $col => $val) { if ($val instanceof Zend_Db_Expr) { $val = $val->__toString(); unset($bind[$col]); } else { $val = '?'; } $set[] = $this->quoteIdentifier($col, true) . ' = ' . $val; }
$val = '?'; qui est en cause. sans lui plus de problèmes.
je poursuit donc mes investigations
j'ai surchargé la méthode _doUpdate
j'ai ajouté la création d'expression dans la constitution des membres ayant changé
if (count($diffData) > 0) { Zend_Loader::loadClass('Zend_Db_Expr'); $db = $this->_getTable()->getAdapter(); foreach ($diffData as $key=>$value) { $diffData[$key] = new Zend_Db_Expr($db->quote($value)); } $result = $this->_getTable()->update($diffData, $where); }
le tableau de valeur n'est plus simplement une liste de valeur mais un liste d'expression
ainsi la requête généré n'est plus faite avec des ? mais avec les valeurs des expressions.
A+JYT
Dernière modification par sekaijin (01-09-2008 17:55:31)
Hors ligne
Hello,
C'est déjà surchargé dans Zend_Db_Adapter_Oracle. SVN4736 du 7 mai 2007. Tu utilises quelle version du ZF ?
A+
Hors ligne
je suis en 1.0.4 et j'utilise PDO
Zend_Db_Adapter_Pdo_Oci
A+JYT
Hors ligne
Hello,
Faut ouvrir une issue sur le sujet. Si tu veux, je peux l'ouvrir.
Juste pour info : pq n'utilises-tu pas Zend_Db_Adapter_Oracle ?
A+
Hors ligne
ben le même code est utilisé pour pdo_mySql et Pdo_Oracle
le tout étant déjà fonctionnel en Pdo_Mysql je ne voulais pas trop m'en éloigner et je suis donc passé à Pdo_OCi
je ne sais pas s'il y a beaucoup de différence au niveau de Zend si j'utilise l'adapter oracle.
A+JYT
Hors ligne
Hello,
je ne sais pas s'il y a beaucoup de différence au niveau de Zend si j'utilise l'adapter oracle.
C'était la question que je me posais. Ce qui avait motivé ton choix de pdo_oci. Je pense que tu peux essayer l'adaptateur Oracle.
Cependant je ne sais pas si pdo_oci par exemple permet le paramètre case_folding. Parce que que si tu l'utilises avec pdo_oci en lowercase, c'est sûr que cela ne fonctionne pas actuellement avec l'adaptateur Oracle.
A+
Hors ligne
j'ai effectivement eut un pb avec le case_folding mais j'ai trouvé comment le régler.
c'est une option à passer au driver.
à tout hasard sais-tu comment dire au moteur de la base que je travaille en anglais ???
il semble qu'on m'ait paramétré le truc en français et dans une application polyglote ce n'est pas simple car ZF et mon appli son en anglais
mes vue adaptent la chose dans la langue de l'utilisateur
mais mes données remonte de la base formaté en français du coup je dois dans le métier sans arrêt les transformer pour que ce soit homogène avec le reste de l'appli (tout en anglais) pour qu'ensuite les vue remettent tout ça dans la langue de l'utilisateur.
Merci
A+JYT
Hors ligne
Hello,
Je vais te répondre pour Windows. Dans mes variables d'environnement, j'ai :
NLS_LANG = FRENCH_FRANCE.WE8ISO8859P15 NLS_NUMERIC_CHARACTERS = . NLS_DATE_FORMAT = YYYY-MM-DD HH24:MI:SS
Pour le case-folding, c'est l'option :
db.params.options.caseFolding = 2
Mais elle ne fonctionne pas avec l'adaptateur Oracle.
Au mieux si tu as mis l'option :
db.params.options.autoQuoteIdentifiers = 0
tu auras tout en majuscules.
J'ai surchargé Zend_Db_Adapter_Oracle pour implanter un array_change_key_case recursif qui me passe tout en minuscule (pas bien pour les perfs ).
A+
Hors ligne
merci pour les params
Hors ligne