IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Zend_Db PHP Discussion :

Zend_Db_Select convertit mes chaînes de caractères [ZF 1.11]


Sujet :

Zend_Db PHP

  1. #1
    Membre chevronné
    Avatar de gwinyam
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    1 162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    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 162
    Points : 2 015
    Points
    2 015
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 :
    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
    Comparez la qualité et le prix du matériel de bricolage ou de maison avant d'acheter : MatosMaison
    Le bouton ne masse pas les pieds, mais ça aide la communauté.

  2. #2
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    normalement c'est juste etat LIKE ? non ?

  3. #3
    Membre chevronné
    Avatar de gwinyam
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    1 162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    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 162
    Points : 2 015
    Points
    2 015
    Par défaut
    Quand je fais ce que tu me suggères, il me pond ça :
    SELECT `tickets`.`id` FROM `tickets` WHERE (id_client = 2) AND (etat LIKE 'ouvert' )
    Je ne comprends pas.
    Comparez la qualité et le prix du matériel de bricolage ou de maison avant d'acheter : MatosMaison
    Le bouton ne masse pas les pieds, mais ça aide la communauté.

  4. #4
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    un var_dump($status) te rend quoi ?

  5. #5
    Membre chevronné
    Avatar de gwinyam
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    1 162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    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 162
    Points : 2 015
    Points
    2 015
    Par défaut
    Une chaîne tout ce qu'il y a de plus banal. Voici les combinaisons testées :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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 =.
    Comparez la qualité et le prix du matériel de bricolage ou de maison avant d'acheter : MatosMaison
    Le bouton ne masse pas les pieds, mais ça aide la communauté.

  6. #6
    Expert éminent sénior

    Profil pro
    Inscrit en
    Septembre 2010
    Messages
    7 920
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Septembre 2010
    Messages : 7 920
    Points : 10 726
    Points
    10 726
    Par défaut
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    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 : Sélectionner tout - Visualiser dans une fenêtre à part
    $select->where('etat LIKE ? ', "ouvert");

  7. #7
    Membre chevronné
    Avatar de gwinyam
    Homme Profil pro
    Développeur Web
    Inscrit en
    Mai 2006
    Messages
    1 162
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 37
    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 162
    Points : 2 015
    Points
    2 015
    Par défaut
    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
    Comparez la qualité et le prix du matériel de bricolage ou de maison avant d'acheter : MatosMaison
    Le bouton ne masse pas les pieds, mais ça aide la communauté.

  8. #8
    Membre éprouvé
    Avatar de 5h4rk
    Homme Profil pro
    CTO at TabMo
    Inscrit en
    Février 2011
    Messages
    813
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 38
    Localisation : France, Hérault (Languedoc Roussillon)

    Informations professionnelles :
    Activité : CTO at TabMo
    Secteur : High Tech - Multimédia et Internet

    Informations forums :
    Inscription : Février 2011
    Messages : 813
    Points : 1 297
    Points
    1 297
    Par défaut
    Tu devrais par contre faire attention à comment tu construits tes requêtes.

    tes where devraient être ainsi :
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    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

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 8
    Dernier message: 12/02/2013, 01h08
  2. Réponses: 5
    Dernier message: 06/11/2010, 19h46
  3. le caractère > coupe mes chaînes
    Par whims dans le forum Langage
    Réponses: 6
    Dernier message: 29/07/2010, 10h15
  4. [MySQL] fonctions qui convertit les chaînes de caractères en entier
    Par poyoland dans le forum PHP & Base de données
    Réponses: 8
    Dernier message: 02/03/2007, 11h36
  5. Réponses: 3
    Dernier message: 09/05/2002, 01h39

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo