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 03/10/2011, 17h29   #1
Membre Expert
 
Avatar de gwinyam
 
Homme Mathieu ROBIN
Développeur Web
Inscription : mai 2006
Messages : 1 116
Détails du profil
Informations personnelles :
Nom : Homme Mathieu ROBIN
Âge : 25
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : mai 2006
Messages : 1 116
Points : 2 142
Points : 2 142
Par défaut Zend_Db_Select convertit mes chaînes de caractères

Salut,

J'ai un souci qui va me faire devenir chauve. En gros : J'ai un modèle de type Zend_Db_Table_Abstract. Je créé un objet Zend_Db_Select grâce à celui-ci.

Dans cet objet $select, je rajoute différent where comme ceci :
Code :
1
2
3
4
5
6
$id_client = 2;
$status = 'ouvert';
$oTicket = new Support_Model_Tickets();
$select = $oTicket->select()->from('tickets', 'id');
$select->where('id_client = ?', $id_client);
$select->where('etat LIKE "?" ', $status);
Le souci, c'est qu'il me le traduit comme ça :
Citation:
SELECT `tickets`.`id` FROM `tickets` WHERE (id_client = 2) AND (etat LIKE "'ouvert'" )
J'ai essayé dans tous les sens avec des simples ou doubles quotes, sans, ou échappées, avec/sans la variable (valeur écrite en dure dans la requête), avec un = ou un LIKE, avec where, avec quoteInto. Pas moyen, ça me génère systématiquement une requête pourrie. Dès que je compare une colonne avec une string, c'est foutu, il fait n'importe quoi. C'est comme si un html_special_chars passé par là mais non pourtant.

Avez-vous une idée ?

Merci d'avance !
PS : Je suis en PHP 5.2.6
__________________
Mon blog techno et son billet hebdomadaire sur l'actualité jQuery. Et mon blog cuisine pour une personne.
Le bouton ne masse pas les pieds, mais ça aide la communauté.
gwinyam est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 03/10/2011, 17h36   #2
Modérateur
 
Inscription : septembre 2010
Messages : 7 131
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 131
Points : 8 491
Points : 8 491
normalement c'est juste etat LIKE ? non ?
__________________
http://blog.stealth35.com/
stealth35 est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/10/2011, 00h04   #3
Membre Expert
 
Avatar de gwinyam
 
Homme Mathieu ROBIN
Développeur Web
Inscription : mai 2006
Messages : 1 116
Détails du profil
Informations personnelles :
Nom : Homme Mathieu ROBIN
Âge : 25
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : mai 2006
Messages : 1 116
Points : 2 142
Points : 2 142
Quand je fais ce que tu me suggères, il me pond ça :
Citation:
SELECT `tickets`.`id` FROM `tickets` WHERE (id_client = 2) AND (etat LIKE 'ouvert' )
Je ne comprends pas.
__________________
Mon blog techno et son billet hebdomadaire sur l'actualité jQuery. Et mon blog cuisine pour une personne.
Le bouton ne masse pas les pieds, mais ça aide la communauté.
gwinyam est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/10/2011, 00h42   #4
Modérateur
 
Inscription : septembre 2010
Messages : 7 131
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 131
Points : 8 491
Points : 8 491
un var_dump($status) te rend quoi ?
__________________
http://blog.stealth35.com/
stealth35 est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/10/2011, 09h36   #5
Membre Expert
 
Avatar de gwinyam
 
Homme Mathieu ROBIN
Développeur Web
Inscription : mai 2006
Messages : 1 116
Détails du profil
Informations personnelles :
Nom : Homme Mathieu ROBIN
Âge : 25
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : mai 2006
Messages : 1 116
Points : 2 142
Points : 2 142
Une chaîne tout ce qu'il y a de plus banal. Voici les combinaisons testées :

Code :
1
2
3
4
5
6
$select->where('etat LIKE "?" ', $status); // (etat LIKE "'ouvert'" )
$select->where('etat LIKE "?" ', 'ouvert'); // (etat LIKE 'ouvert' )
$select->where('etat LIKE "ouvert" '); // (etat LIKE & quot;ouvert& quot; )
$select->where("etat LIKE \"ouvert\" "); // (etat LIKE & quot;ouvert& quot; )
$select->where('etat LIKE "?" ', "ouvert"); // (etat LIKE & quot;ouvert& quot; )
$select->where(\"etat LIKE \"?\" ", $status); // (etat LIKE & quot;ouvert& quot; )
Et la même chose en remplaçant LIKE par =.
__________________
Mon blog techno et son billet hebdomadaire sur l'actualité jQuery. Et mon blog cuisine pour une personne.
Le bouton ne masse pas les pieds, mais ça aide la communauté.
gwinyam est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/10/2011, 09h45   #6
Modérateur
 
Inscription : septembre 2010
Messages : 7 131
Détails du profil
Informations forums :
Inscription : septembre 2010
Messages : 7 131
Points : 8 491
Points : 8 491
Citation:
Envoyé par gwinyam Voir le message
Une chaîne tout ce qu'il y a de plus banal. Voici les combinaisons testées :

Code :
1
2
3
4
5
6
$select->where('etat LIKE "?" ', $status); // (etat LIKE "'ouvert'" )
$select->where('etat LIKE "?" ', 'ouvert'); // (etat LIKE 'ouvert' )
$select->where('etat LIKE "ouvert" '); // (etat LIKE & quot;ouvert& quot; )
$select->where("etat LIKE \"ouvert\" "); // (etat LIKE & quot;ouvert& quot; )
$select->where('etat LIKE "?" ', "ouvert"); // (etat LIKE & quot;ouvert& quot; )
$select->where(\"etat LIKE \"?\" ", $status); // (etat LIKE & quot;ouvert& quot; )
Et la même chose en remplaçant LIKE par =.
EDIT : il me semble qu'il faille utiliser Zend_Db_Expr

et
Code :
$select->where('etat LIKE ? ', "ouvert");
__________________
http://blog.stealth35.com/
stealth35 est actuellement connecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/10/2011, 10h58   #7
Membre Expert
 
Avatar de gwinyam
 
Homme Mathieu ROBIN
Développeur Web
Inscription : mai 2006
Messages : 1 116
Détails du profil
Informations personnelles :
Nom : Homme Mathieu ROBIN
Âge : 25
Localisation : France, Paris (Île de France)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Opérateur de télécommunications

Informations forums :
Inscription : mai 2006
Messages : 1 116
Points : 2 142
Points : 2 142
J'ai aussi essayé et j'avais le même problème. Au passage, j'ai trouvé la solution. Le coupable n'était pas ZF.

L'erreur venait que pour debug, je renvoyais ma requête à la fin de mon tableau de résultat. Jusque là pas de problème. Sauf quand ça passe entre deux par un webservice et là forcément, il traduit certains caractères. Ceux concernés par mon souci.

Un bête error_log sur le serveur m'a suffit à voir mon erreur.

On va dire que c'était la fatigue
__________________
Mon blog techno et son billet hebdomadaire sur l'actualité jQuery. Et mon blog cuisine pour une personne.
Le bouton ne masse pas les pieds, mais ça aide la communauté.
gwinyam est déconnecté   Envoyer un message privé Réponse avec citation 00
Vieux 04/10/2011, 19h14   #8
Modérateur
 
Homme Loïc
Développeur Web
Inscription : février 2011
Messages : 678
Détails du profil
Informations personnelles :
Nom : Homme Loïc
Âge : 26
Localisation : France, Hérault (Languedoc Roussillon)

Informations professionnelles :
Activité : Développeur Web
Secteur : High Tech - Multimédia et Internet

Informations forums :
Inscription : février 2011
Messages : 678
Points : 1 041
Points : 1 041
Tu devrais par contre faire attention à comment tu construits tes requêtes.

tes where devraient être ainsi :
Code :
1
2
$where = $this->_db->quoteInto("$this->_db->quoteIdentifier('etat') LIKE ?", $status); 
$select->where($where);
Le premier quoteInto n'est pas obligatoire ça dépend de commen tu prépare ta requête.

L'interêt d'une telle pratique et que tu pourras changer de SGBD plus simplement et les quotes seront mis comme ils doivent l'être en fonction du SGBD
5h4rk 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 19h23.


 
 
 
 
Partenaires

Hébergement Web