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

Bases de données Discussion :

Le pilote MySQL plante lors de l'écriture d'une chaîne de caractères avec des apostrophes


Sujet :

Bases de données

  1. #1
    Invité
    Invité(e)
    Par défaut Le pilote MySQL plante lors de l'écriture d'une chaîne de caractères avec des apostrophes
    Salut, j'essaye d'écrire une chaîne de caractère avec le driver MySQL de QT.

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
     
    if (!query.exec("INSERT INTO TEST_DESCRIPTIONS (DESCRIPTION, USER_ID) VALUES('L\'animateur ...',"+QString(id)+");")) {
                QSqlError error = query.lastError();
                QMessageBox::critical(nullptr, "Write Error", "Failed to save information to database"+error.text());
            }
    Mais il me sort une erreur de syntaxe près de animateur.

    Pourtant j'ai exécuté cette commande avec mysql client command line et ça m'insère la ligne dans la table sans broncher.

  2. #2
    Responsable Qt & Livres


    Avatar de dourouc05
    Homme Profil pro
    Ingénieur de recherche
    Inscrit en
    Août 2008
    Messages
    26 617
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France, Val de Marne (Île de France)

    Informations professionnelles :
    Activité : Ingénieur de recherche
    Secteur : Enseignement

    Informations forums :
    Inscription : Août 2008
    Messages : 26 617
    Points : 188 587
    Points
    188 587
    Par défaut


    Ça serait plus propre d'utiliser des requêtes préparées (et Qt gérerait pour toi les affres des apostrophes) : http://doc.qt.io/qt-5/qsqlquery.html...binding-values. Sinon, l'erreur pourrait être que le compilateur échappe le caractère ', de telle sorte que MySQL reçoit la requête

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    INSERT INTO TEST_DESCRIPTIONS (DESCRIPTION, USER_ID) VALUES('L'animateur', 5);
    Que se passe-t-il avec un double échappement (\\', qui deviendrait \' dans ton application, après compilation) ?
    Vous souhaitez participer aux rubriques Qt (tutoriels, FAQ, traductions) ou HPC ? Contactez-moi par MP.

    Créer des applications graphiques en Python avec PyQt5
    Créer des applications avec Qt 5.

    Pas de question d'ordre technique par MP !

  3. #3
    Invité
    Invité(e)
    Par défaut
    Bonjour, avec un double échappement ça passe donc c'est le compilateur qui échappe le caractère.

    Par contre, lorsque j'essaye d'écrire ceci :

    Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
     if (!query.exec("INSERT INTO TEST_DESCRIPTIONS (DESCRIPTION, USER_ID) VALUES('"+description[i]+"',"+QString(id)+");"))

    Ou description[i] vaut ceci :

    Code cpp : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
     
     QString((i+1)+"\\) "+it2->second+" : "+"Optimiste, parfois jusqu\\'à l\\'insouciance,\n"
                         "le philosophe voit les choses du bon côté\n"
                         "et prend assez facilement du recul par rapport\n"
                         "aux petits problèmes et tracas du quotidien.\n"
     
                         "Il pense que, généralement, les choses finissent par s\\'arranger.\n"
                         "Il sait faire preuve de souplesse, s\\'adapter et dédramatiser\n"
                         "afin de retrouver authenticité et sérénité,\n"
                         "deux valeurs qui lui tiennent particulièrement à coeur.\n"
                         "Patient, calme, ouverture et sens du consensus figurent également parmi ses atouts.\n"
     
                         "Beaucoup le considèrent comme une personne ressource grâce à sa bonne humeur\n"
                         "communicative, sa capacité à instaurer un bon\n"
                         "\"état d\\'esprit\", ses aptitudes à l\\'acceuil, à la psychologie ou au management d\\'équipe.\n"
                         "Peu soucieux de son image, il aime la simplicité sociale,\n"
                         "donc l\\'amitié sans fard, et ce qui touche à la nature, terroir compris.\n");

    Il me dit que j'ai une erreur de syntaxe près de la ), pour insérer un int dans une chaîne de caractères c'est bien QString(id) hein ?

    Avec les requêtes préparée ça n'insère rien dans la table ...

  4. #4
    Invité
    Invité(e)
    Par défaut
    Bon j'ai trouvé en fait il fallait utiliser QString::number

  5. #5
    Invité
    Invité(e)
    Par défaut
    Bon du coup maintenant j'ai le \' qui s'affiche dans mes QLabel à cause du double échappement, n'y a t'il pas une fonction qui permet de rajouter deux \ devant les ' ?

    ...La fonction replace pourrait faire l'affaire...

  6. #6
    Invité
    Invité(e)
    Par défaut
    Ouais, cartonne!

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    query.exec("INSERT INTO TEST_DESCRIPTIONS (DESCRIPTION, USER_ID) VALUES('"+description[i].replace("'", "\\'").replace(")","\\)")+"',"+QString::number(id)+");");

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

Discussions similaires

  1. [Débutant] Visual studio plante lors de l'ajout d'une source de données
    Par Belwen dans le forum C#
    Réponses: 2
    Dernier message: 16/01/2012, 14h06
  2. [Débuter] Problème lors de l'écriture dans une socket
    Par kek's dans le forum Réseau
    Réponses: 1
    Dernier message: 11/02/2011, 09h56
  3. Réponses: 4
    Dernier message: 13/01/2011, 11h12
  4. écriture d'une requete avec des apostrophes
    Par freestyler dans le forum Delphi
    Réponses: 2
    Dernier message: 10/10/2006, 12h00
  5. Réponses: 11
    Dernier message: 05/03/2006, 17h02

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