Partage
  • Partager sur Facebook
  • Partager sur Twitter

Requete SQL mal interpréter par mysql

    30 août 2011 à 11:33:00

    Bonjour,
    je rencontre aujourd'hui un problème sur lequel j'ai bataillé toute la matinée et qui commence a me monter à la tête...

    Je vous explique le problème :
    je gère un site de e-commerce dont les produits sont mis a jours par import csv.

    Aprés recherches, j'en est déduis que le problème venait de l’interprétation que mysql fait de ma requette.

    je précise qu'avant chaque import en csv j'exécute un truncate tables peel_produits

    Voici la requette d'un produit en particulier qui pose problème :
    INSERT INTO peel_produits SET id = '1303', reference = '43506', nom_fr = 'Cocotte ovale noire 290 mm ', descriptif_fr = ' En fonte émaillée, avec couvercle de même épaisseur que la cocotte pour une répartition uniforme de la chaleur. Poignées étudiées pour une bonne prise en main. Email cuit à 790ºC pour une longévité accrue. Très lisse il se nettoie très facilement. Bouton Haute Température résistant à la chaleur sans limite de température pour le bouton métal. Fond ultra-lisse. Compatible avec toutes les sources de chaleur y compris l''induction. Contenance : 4,70 l pour 6 personnes ', description_fr = '', nom_en = 'Nom anglais', descriptif_en = 'DescriptifAng', description_en = 'Description ang', image1 = '43506-Image 1.jpg', image2 = '', image3 = '', image4 = '', image5 = '', image6 = '', image7 = '', image8 = '', image9 = '', image10 = '', prix = '208.31', prix_revendeur = '0', prix_flash = '0', prix_achat = '0', poids = '0', date_insere = '2011-07-25', date_maj = '2011-07-25', promotion = '0', tva = '19.6', etat = '1', on_stock = '0', delai_stock = '', seuil_stock = '0', stock = '3', affiche_stock = '1', on_promo = '0', on_new = '0', on_rollover = '0', on_special = '0', on_perso = '0', on_top = '0', position = '0', meta_titre = ' Cocotte ovale noire 290 mm ', meta_desc = ' En fonte émaillée, avec couvercle de même épaisseur que la cocotte pour une répartition uniforme de la chaleur. Poignées étudiées pour une bonne prise en main. Email cuit à 790ºC pour une longévité accrue. Très lisse il se nettoie très facilement. Bouton Haute Température résistant à la chaleur sans limite de température pour le bouton métal. Fond ultra-lisse. Compatible avec toutes les sources de chaleur y compris l''induction. Contenance : 4,70 l pour 6 personnes ', meta_key = 'Fonte emaillee, cocotte, noire, 29 cm, le creuset ', on_flash = '1', flash_start = '2011-07-26 00:00:00', flash_end = '2011-08-26 00:00:00', id_marque = '00000000021', etat_stock = '0', on_rupture = '0', lang = '', prix_promo = '0', paiement = '', type_prix = ''
    


    j'exécute cette requette en php avec un mysql_query ($req) or die(mysql_error()) et la fonction ne me retourne aucune erreur.

    Aprés vérification, le produit est bien insérer dans la base de données à un détail prés : on_flash n'est pas égal à 1 mais à 0, et les dates flash_start et flash_end sont également à 0000-00-00 00:00:00.

    encore plus fort, si je copie-colle cette requête directement dans phpmyadmin, là le produit est correctement insérer dans la base de donnée avec les bonnes valeurs pour on_flash, flash_start et flash_end.

    Il n'y a aucun doute sur le fait que c'est bien la même requête qui est exécuté par php.
    les champs sont de types suivant :
    on_flash : tinyint(4)
    flash_start et flash_end : datetime

    La version utilisée est MySQL: 5.0.22 sous microsoft server 2003

    la je ne comprend vraiment pas d'où peut venir le problème et je me tourne donc vers vous, en espérant que quelqu'un puisse m'aider,

    @++
    fab
    • Partager sur Facebook
    • Partager sur Twitter
      30 août 2011 à 11:39:36

      MODE :sors le fouet: ON :diable:

      Comment peux-tu mélanger la syntaxe d'un UPDATE avec celui d'un INSERT ?

      UPDATE peel_produits SET id = '1303', reference = '43506' -- etc...
      


      MODE :sors le fouet: OFF :-°
      • Partager sur Facebook
      • Partager sur Twitter
        30 août 2011 à 12:04:40

        Ce n'est pas moi qui est écrit cette requête et sa m'a également choqué au premier abord, mais, après l'avoir copié collé dans phpmyadmin, cette requête marche, donc je ne pense pas que le problème vienne de cette syntaxe, même si j’admets qu'elle n'est pas très conventionnelle

        EDIT : a priori pas si peut conventionnel que sa d'ailleurs apparemment :
        http://dev.mysql.com/doc/refman/5.0/fr/insert.html
        • Partager sur Facebook
        • Partager sur Twitter
          30 août 2011 à 12:25:19

          1/ En effet, cette syntaxe existe, mais uniquement avec MySQL

          2/ Même si y a aucun doute, ça t'nnuyerais de nous donner le code PHP qui génère et exécute cetet requête ?
          • Partager sur Facebook
          • Partager sur Twitter
            30 août 2011 à 12:31:05

            echo $request;
                $db->execute($request);
            

            Le echo donne la requête qui se trouve dans mon premier post, donc le problème n'est pas lié a la génération (si vous y tenez vraiment je peut mettre le code qui génère la requête mais sa représente un paquet de ligne)

            et la fonction execute est la suivante :
            public function execute($request)
              {
                $result = mysql_query($request) or die (mysql_error().'<br/>'.$request);
                return new RecordSet($result);
              }">
            


            merci
            • Partager sur Facebook
            • Partager sur Twitter
              30 août 2011 à 19:28:01

              1. Je ne sais pas si utiliser le mot "execute" est une bonne idée pour créer une fonction.

              2. Que signifie "new RecordSet([parametre])" ?

              3. Est-ce que c'est normal que ta fonction se termine par "> ?
              • Partager sur Facebook
              • Partager sur Twitter
                30 août 2011 à 20:54:14

                1.C'est une classe toute faite que je n'ai pas codé et qui fonctionne pour le reste, vus que c'est une fonction membre, le terme execute ne gène normalement pas.

                2.en ce qui concerne le new RecordSet([parametre]) c'est l'instanciation d'une autre classe que je n'est pas détaillé vus que de toute façon je n'interprete pas la valeur de retour de cette fonction...

                3.et quand au > c'est une faute de frappe lors du copié collé.
                • Partager sur Facebook
                • Partager sur Twitter
                  30 août 2011 à 21:00:44

                  INSERT INTO peel_produits 
                  SET id = '1303'
                    , reference = '43506'
                    , nom_fr = 'Cocotte ovale noire 290 mm '
                    , descriptif_fr = ' En fonte émaillée, avec couvercle de même épaisseur que la cocotte pour une répartition uniforme de la chaleur. Poignées étudiées pour une bonne prise en main. Email cuit à 790ºC pour une longévité accrue. Très lisse il se nettoie très facilement. Bouton Haute Température résistant à la chaleur sans limite de température pour le bouton métal. Fond ultra-lisse. Compatible avec toutes les sources de chaleur y compris l''induction. Contenance : 4,70 l pour 6 personnes '
                    , description_fr = ''
                    , nom_en = 'Nom anglais'
                    , descriptif_en = 'DescriptifAng'
                    , description_en = 'Description ang'
                    , image1 = '43506-Image 1.jpg'
                    , image2 = ''
                    , image3 = ''
                    , image4 = ''
                    , image5 = ''
                    , image6 = ''
                    , image7 = ''
                    , image8 = ''
                    , image9 = ''
                    , image10 = ''
                    , prix = '208.31'
                    , prix_revendeur = '0'
                    , prix_flash = '0'
                    , prix_achat = '0'
                    , poids = '0'
                    , date_insere = '2011-07-25'
                    , date_maj = '2011-07-25'
                    , promotion = '0'
                    , tva = '19.6'
                    , etat = '1'
                    , on_stock = '0'
                    , delai_stock = ''
                    , seuil_stock = '0'
                    , stock = '3'
                    , affiche_stock = '1'
                    , on_promo = '0'
                    , on_new = '0'
                    , on_rollover = '0'
                    , on_special = '0'
                    , on_perso = '0'
                    , on_top = '0'
                    , position = '0'
                    , meta_titre = ' Cocotte ovale noire 290 mm '
                    , meta_desc = ' En fonte émaillée, avec couvercle de même épaisseur que la cocotte pour une répartition uniforme de la chaleur. Poignées étudiées pour une bonne prise en main. Email cuit à 790ºC pour une longévité accrue. Très lisse il se nettoie très facilement. Bouton Haute Température résistant à la chaleur sans limite de température pour le bouton métal. Fond ultra-lisse. Compatible avec toutes les sources de chaleur y compris l''induction. Contenance : 4,70 l pour 6 personnes '
                    , meta_key = 'Fonte emaillee, cocotte, noire, 29 cm, le creuset '
                    , on_flash = '1'
                    , flash_start = '2011-07-26 00:00:00'
                    , flash_end = '2011-08-26 00:00:00'
                    , id_marque = '00000000021'
                    , etat_stock = '0'
                    , on_rupture = '0'
                    , lang = ''
                    , prix_promo = '0'
                    , paiement = ''
                    , type_prix = ''
                  


                  1) les 3 attributs qui te posent problème contiennent le mot "flash" ... ca ne serait pas un mot réservé dans une page PHP ?

                  (j'essaye au hasard, même si ca me semble tres bizarre...)

                  D'autres champs que les 3 cités sont-ils touchés par ton problème ?

                  2) Est-ce que le problème se pose avec tous les ajouts de produits ou juste pour certains produit spécifiques ?

                  3) Est-ce que cela a marché un jour ou bien jamais ?

                  4) Je ne me souviens plus de la syntaxe pour mettre une quote dans un ' ' ... Ici je vois 'l''induction'; ce n'est pas 'l\'induction' ?

                  5) le mot "position" a l'air d'être un mot réservé du langage SQL puisqu'il est coloré dans le BBCode du SDZ... (mais a priori, ca n'influerait pas que sur les 3 champs que tu cites... )
                  • Partager sur Facebook
                  • Partager sur Twitter
                    31 août 2011 à 9:31:05

                    la reqmarque 1 j'y avait pensé aussi, mais comme tu dit sa parrait étonant et je n'est rien trouver sur google a ce sujet.
                    A priori seuls ces 3 champs seraient concernés par le problème vus que dans tous les cas l'id_marque est le bon aprés insertion.

                    2) tous les produits sont a priori concernés vus qu'un
                    SELECT * FROM peel_produits WHERE on_flash=1
                    

                    ne me retourne aucun résultat.

                    3) Oui sa fonctionnait, peut être que les produits remplissent aujourd'hui une condition particulière qui fait que sa fou l'importation en l'air, notament l'apparition de quotes et c'est là que je te tire mon chapeau pour la remarque 4 : je vais essayer de rajouter un petit addslashes dans la requête

                    et le mot position n'influence a priori pas ma requete...

                    je regarde comment résoudre le problème n°4 et je vous tien au courant
                    Merci beaucoup

                    EDIT :
                    avec un addslashes c'est malheureusement la même chose :(
                    retour à la case départ...

                    c'est vraiment bizarre ce problème. comment ce fait il que phpmyadmin et mysql_query n'aient pas la même interprétation d'une même requête
                    • Partager sur Facebook
                    • Partager sur Twitter
                      31 août 2011 à 22:07:05

                      Tu as fait des modifications récemment ?
                      La seule explication, c'est les mots clés de PHP...

                      Tu as pensé à poster un topic dans le forum PHP pour demander si un spécialiste php ne reconnaitrait pas des mots clés dans ta page ?
                      • Partager sur Facebook
                      • Partager sur Twitter
                        1 septembre 2011 à 21:51:44

                        J'ai pensé à un bug d'ENUM, mais apparemment la colonne est en tinyint.

                        Exécute la requête qui pose problème, et regarde si elle retourne des warnings (par exemple tape SHOW WARNINGS dans la console mysql juste après).

                        essaie ça :

                        SELECT on_flash, count(*) FROM peel_produits GROUP BY on_flash

                        ça renvoie quoi ?
                        • Partager sur Facebook
                        • Partager sur Twitter

                        Requete SQL mal interpréter par mysql

                        × Après avoir cliqué sur "Répondre" vous serez invité à vous connecter pour que votre message soit publié.
                        × Attention, ce sujet est très ancien. Le déterrer n'est pas forcément approprié. Nous te conseillons de créer un nouveau sujet pour poser ta question.
                        • Editeur
                        • Markdown