Partage
  • Partager sur Facebook
  • Partager sur Twitter

Requête avec paramètres - MySQL - C++

passer des parametres à une requete

    14 novembre 2007 à 20:55:26

    Bonjour,

    Je suis vraiment désespéré, je suis connecté à ma base mysql à partir d'un programme en C++ ( grâce à l'api de mysql) sur borland C++ builder 6.

    Seulement lorsue je veux interroger la base de donnée à partir d'une requête avec un ou plusieurs paramètres. J'arrive à faire des requêtes simple grâce a mysql_query. Mais je n'arrive pas a passer de paramètres à ma commande.

    Exemple:
    mysql_query(mySQL, "select * from Joueur where Pseudo = 'BOB'") ;<-- cette requete me retourne les infos du joueur BOB

    Problème:
    string NomDuJoueur;
    NomDuJoueur="BOB";
    mysql_query(mySQL, "select * from Joueur where Pseudo = " NomDuJoueur);

    Voila j'espere avoir des réponses :)
    Merci à tous ceux qui se pencheront sur mon problème
    • Partager sur Facebook
    • Partager sur Twitter
      14 novembre 2007 à 21:00:55

      1. #include <sstream>
      2. std::ostringstream Query;
      3. Query << "select * from Joueur where Pseudo = " << NomDuJoueur;
      4. mysql(&MySQL, Query.str());
      • Partager sur Facebook
      • Partager sur Twitter
        15 novembre 2007 à 12:30:01

        Merci pour ta réponse Meiv.

        Cependant lorsque je tape ton code cela me donne plusieurs erreurs:

        - 'operator<<' non implémenté dans le type '_STL::ostream' pour les arguments de type 'AnsiString'

        pour la ligne : Query << "select * from Joueur where Pseudo = " << NomDuJoueur;


        - Appel à une fonction non définie 'mysql'

        - Symbole 'MySQL' non défini
        Pour la deuxieme ligne de code.

        Je suis désolé si cela te semble simple mais j'ai du mal! XD

        • Partager sur Facebook
        • Partager sur Twitter
        Anonyme
          15 novembre 2007 à 16:35:42

          Le code donné par Chlab_lak n'est pas là pour compiler, tu dois le modifier pour qu'il marche dans ton projet. On évite sur ce site de donner un code prêt à l'emploi pour une simple raison : tu n'apprendrais rien.

          • Partager sur Facebook
          • Partager sur Twitter
            15 novembre 2007 à 16:56:08

            lol, je vous comprend cependant pouvez-vous m'indiquer la direction à prendre ^^

            Je pense qu'il faut surcharger l'operateur << mais je ne sais pas du tout comment faire... :s

            Mais pour le symbole &MySQL je ne vois pas du tout ce qu'il signifie!

            Encore désolé de ma zéronité :)
            • Partager sur Facebook
            • Partager sur Twitter
            Anonyme
              15 novembre 2007 à 16:58:59

              MySQL est une variable, le '&' signifie qu'on passe son adresse à la fonction mysql.

              Pour l'autre problème (avec Query), j'avoue que je sèche. As-tu inclus iostream? (Je vois pas d'où ça peut venir sinon...)
              • Partager sur Facebook
              • Partager sur Twitter
                15 novembre 2007 à 17:11:12

                Je viens d'include <iostream>, ça ne marche toujours pas. Toujours les 3 mêmes erreurs...

                • Partager sur Facebook
                • Partager sur Twitter
                  15 novembre 2007 à 17:17:48

                  Qu'entends tu par "le code"?
                  • Partager sur Facebook
                  • Partager sur Twitter
                    15 novembre 2007 à 17:22:02

                    1. #define __WIN__
                    2. #include "mysql.h"
                    3. #include <vcl.h>
                    4. #pragma hdrstop
                    5. #include "Unit1.h"
                    6. #include <string>
                    7. #include <sstream>
                    8. //---------------------------------------------------------------------------
                    9. #pragma package(smart_init)
                    10. #pragma resource "*.dfm"
                    11. TForm1 *Form1;
                    12. MYSQL_ROW myROW;
                    13. MYSQL_RES *myRES;
                    14. AnsiString aStr;
                    15. MYSQL *mySQL;
                    16. //---------------------------------------------------------------------------
                    17. __fastcall TForm1::TForm1(TComponent* Owner)
                    18. : TForm(Owner)
                    19. {
                    20. mySQL = mysql_init(NULL);
                    21. if (!mysql_real_connect(mySQL, "127.0.0.1", "root", "*****", "fmp\_test", 0, NULL, 0))
                    22. {
                    23. ShowMessage("Connexion Echouée");// la connection a échoué
                    24. }
                    25. else
                    26. {
                    27. ShowMessage("Connexion Réussie");// la connection a réussi
                    28. }
                    29. }
                    30. //---------------------------------------------------------------------------
                    31. void __fastcall TForm1::Button1Click(TObject *Sender)
                    32. {
                    33. ListBox1->Items->Clear();
                    34. myRES = mysql_list_tables(mySQL, NULL);
                    35. if (myRES)
                    36. {
                    37. for(unsigned int i = 0; i < myRES->row_count; i++)
                    38. {
                    39. myROW = mysql_fetch_row(myRES);
                    40. for(unsigned int j = 0; j < mysql_num_fields(myRES); j++)
                    41. {
                    42. aStr.sprintf("%s", myROW[j]);
                    43. ListBox1->Items->Add(aStr);
                    44. }
                    45. }
                    46. mysql_free_result(myRES);
                    47. }
                    48. }
                    49. //---------------------------------------------------------------------------
                    50. void __fastcall TForm1::Button2Click(TObject *Sender)
                    51. {
                    52. mysql_close(mySQL);
                    53. Close();
                    54. }
                    55. //---------------------------------------------------------------------------
                    56. void __fastcall TForm1::Button3Click(TObject *Sender)
                    57. {
                    58. ListBox2->Items->Clear();
                    59. String NomDuJoueur;
                    60. NomDuJoueur="Clyde";
                    61. String S = AnsiString("select * from Joueur where Pseudo = ")+ NomDuJoueur;
                    62. mysql_query(mySQL, S);
                    63. /*
                    64. if (!mysql_query(mySQL, "select * from Joueur where Pseudo = 'Clyde'"))
                    65. {
                    66. myRES = mysql_store_result(mySQL);
                    67. if (myRES)
                    68. {
                    69. for(unsigned int i = 0; i < myRES->row_count; i++)
                    70. {
                    71. myROW = mysql_fetch_row(myRES);
                    72. for(unsigned int j = 0; j < mysql_num_fields(myRES); j++)
                    73. {
                    74. aStr = myROW[j];
                    75. ListBox2->Items->Add(aStr);
                    76. }
                    77. }
                    78. mysql_free_result(myRES);
                    79. }
                    80. }*
                    • Partager sur Facebook
                    • Partager sur Twitter
                    Anonyme
                      15 novembre 2007 à 17:25:14

                      Les balises pardi!!
                      Elle sont la pour qqch.
                      Lis le post-it du forum pour les règles de présentation.
                      • Partager sur Facebook
                      • Partager sur Twitter
                        15 novembre 2007 à 17:31:50

                        1. String S = AnsiString("select * from Joueur where Pseudo = ")+ NomDuJoueur;


                        c'est quoi cette classe AnsiString et String, je n'y pas pas l'interet

                        1. std::string S = "select * from Joueur where Pseudo = " + NomDuJoueur;


                        • Partager sur Facebook
                        • Partager sur Twitter
                        Anonyme
                          15 novembre 2007 à 17:35:43

                          Pour le ansi c'est pas avec le préfixe 'L' devant une chaîne w_tchar? (Je demande, je n'affirme rien.)
                          • Partager sur Facebook
                          • Partager sur Twitter
                            15 novembre 2007 à 17:57:33

                            Je suis vraiment désolé je n'ai pas trouvé comment mettre les balises... :euh:

                            J'ai essayé d'arranger mon code, il ne plante plus mais il ne fais rien lorsque j'appui sur le bouton.

                            Code actuel:

                            1. ListBox2->Items->Clear();
                            2. std::string NomDuJoueur;
                            3. NomDuJoueur="Clyde";
                            4. std::string S = "select * from Joueur where Pseudo = " + NomDuJoueur;
                            5. if (!mysql_query(mySQL, S.c_str()))
                            6. {
                            7.     myRES = mysql_store_result(mySQL);
                            8.     if (myRES)
                            9.     {
                            10.         for(unsigned int i = 0; i < myRES->row_count; i++)
                            11.         {
                            12.             myROW = mysql_fetch_row(myRES);
                            13.             for(unsigned int j = 0; j < mysql_num_fields(myRES); j++)
                            14.             {
                            15.                   aStr = myROW[j];
                            16.                   ListBox2->Items->Add(aStr);
                            17.             }
                            18.         }
                            19.     }
                            20.     mysql_free_result(myRES);
                            21. }
                            • Partager sur Facebook
                            • Partager sur Twitter
                              15 novembre 2007 à 18:14:12

                              Merci de ton aide. Je vais essayé d'y arriver la prochaine fois que je rentre un code :D

                              Pour mon problème actuel, j'ai fais des tests et je m'aperçois que l'on ne rentre pas dans mon "if"
                              Ce qui signifie que ma requete n'a pas aboutie (code de retour différent de 0)
                              • Partager sur Facebook
                              • Partager sur Twitter
                                15 novembre 2007 à 18:19:38

                                Citation : clyde1021

                                Merci de ton aide. Je vais essayé d'y arriver la prochaine fois que je rentre un code :D



                                Tu peux modifier tes messages tu sais? Alors modifie moi ça immédiatement et n'oublis pas d'indenter ton code!
                                • Partager sur Facebook
                                • Partager sur Twitter
                                  19 novembre 2007 à 22:34:50

                                  Voila j'ai essayé de faire de mon mieux :)

                                  Pour ceux que sa intéresse j'ai trouvé un tutoriel sur Le site du zero ^^

                                  Le code ressemble à ceci:

                                  1. std::string pseudo="Goliate";
                                  2. std::string pass="123456";
                                  3. std::string mail="aha@aha.com";
                                  4. std::string com="test";
                                  5. sprintf(requete,"INSERT INTO Joueur (PSEUDO, PASSWORD, EMAIL, COMMENTAIRE, nbpartieJouee, NbPartieGagnee, NbPoint) VALUES ('%s','%s','%s','%s','0','0','0')", pseudo, password, mail, comm);
                                  6. std::cout << requete << std::endl;
                                  7. mysql_query(mySQL, requete);


                                  Cependant, ce code marche avec un passa ge de parametre dans le sprintf! Mais le passage des autres parametres ne marche pas!
                                  En effet, la recopie du premier paramètre est ok mais la recopie des autres donne un résultat bizarre: les caractères se tranforme en caractère spéciaux très inattendus! et qui ne correspondes à rien!

                                  Si quelqu'un a une solution! :)
                                  • Partager sur Facebook
                                  • Partager sur Twitter
                                    20 novembre 2007 à 4:34:45

                                    Voila le code que j'utilise :

                                    1. void execute(char* sql,...)
                                    2. {
                                    3.         va_list args;
                                    4.         va_start(args, sql);
                                    5.         char SQL[2048]="";
                                    6.         vsprintf(SQL,sql, args);
                                    7.         va_end(args);
                                    8.         mysql_query(&mysql, SQL);
                                    9. }


                                    En esperant avoir aide.
                                    • Partager sur Facebook
                                    • Partager sur Twitter
                                      20 novembre 2007 à 9:30:08

                                      Merci de ton aide!

                                      Inclus-tu une librairie pour utiliser ta va_list?
                                      et comment entres-tu tes paramètres dans celle-ci?

                                      Merci :)
                                      • Partager sur Facebook
                                      • Partager sur Twitter
                                      Anonyme
                                        20 novembre 2007 à 16:45:53

                                        1. sprintf(requete,"INSERT INTO Joueur (PSEUDO, PASSWORD, EMAIL, COMMENTAIRE, nbpartieJouee, NbPartieGagnee, NbPoint) VALUES ('%s','%s','%s','%s','0','0','0')", pseudo, password, mail, comm);
                                        Dommage de ne pas utiliser que l'outil std::string. Pas besoin de cette fonction C!
                                        1. std::string requete = "INSERT INTO Joueur (PSEUDO, PASSWORD, EMAIL, COMMENTAIRE, nbpartieJouee, NbPartieGagnee, NbPoint) VALUES ('";
                                        2. requete.append(pseudo);
                                        3. requete.append(password);
                                        4. requete.append(mail);
                                        5. requete.append(comm);
                                        6. mysql_query(mySQL, requete.c_str());
                                        • Partager sur Facebook
                                        • Partager sur Twitter
                                          20 novembre 2007 à 18:23:07

                                          Désolé Chlab_lak mais ton premier code me laisse perplexe ^^

                                          Si tu penses qu'il est mieux peut tu essayer de me l'expliquer plus en détail.

                                          Merci huria avec un ti arrangement de ton code ma requete marche niquel! Un peu long mais sa marche lol!
                                          • Partager sur Facebook
                                          • Partager sur Twitter
                                            20 novembre 2007 à 18:36:25

                                            std::ostringstream est (comme son nom l'indique) un flux ('<<' parcqu'il y a le prefixe std::o...), ca marche comme les std::ostream (std::cout)

                                            1. //l'header pour utiliser std::ostringstream
                                            2. #include <sstream>
                                            3. int main(void)
                                            4. {
                                            5.     //...    
                                            6.     //on créer notre objet oss
                                            7.     std::ostringstream Query;
                                            8.     //quelques variables a mettre dans 'Query'
                                            9.     std::string Prenom = "Patrick";
                                            10.     std::string Nom = "Dupond";
                                            11.     std::string Email = "pat.dup@mail.com";
                                            12.     //on met en forme notre requete (comme avec un std::ostream)
                                            13.     Query << "INSERT INTO Table (PRENOM, NOM, EMAIL) VALUES ('"
                                            14.           << Prenom << "', '"
                                            15.           << Nom << "', '"
                                            16.           << Email << "')";
                                            17.     //on fait la requete  en recuperant la chaine avec std::ostringstream::str(void)::c_str(void)
                                            18.     mysql_query(MySQL, Query.str().c_str());
                                            19.     //...
                                            20.     return 0;
                                            21. }
                                            • Partager sur Facebook
                                            • Partager sur Twitter
                                              20 novembre 2007 à 18:49:23

                                              hiura -> fonctionnera pas

                                              je supporte le code de Chlab_lak
                                              • Partager sur Facebook
                                              • Partager sur Twitter
                                              Anonyme
                                                20 novembre 2007 à 18:50:30

                                                Effectivement ta solution est "plus jolie". Mais il faut faire une petit modif je crois :
                                                1. mysql_query(MySQL, Query.str().c_str());
                                                • Partager sur Facebook
                                                • Partager sur Twitter
                                                  20 novembre 2007 à 19:00:49

                                                  Il y'a un code qui y ressemble un peu !

                                                  1. std::string RequeteInscription = "INSERT INTO Joueur (PSEUDO, PASSWORD, EMAIL, COMMENTAIRE, nbpartieJouee, NbPartieGagnee, NbPoint) VALUES ('" + pseudo + "','"+ password+"','"+mail+"','"+comm+"','0','0','0')";
                                                  2. mysql_query(Mysql, RequeteInscription.c_str()))
                                                  • Partager sur Facebook
                                                  • Partager sur Twitter
                                                  Anonyme
                                                    20 novembre 2007 à 19:03:56

                                                    sauf erreur c'est moi rapide que avec les sstream. Me trompe-je?
                                                    • Partager sur Facebook
                                                    • Partager sur Twitter
                                                      20 novembre 2007 à 19:05:13

                                                      Je ne sais pas du tout. Avis aux pro de la mémoire!
                                                      • Partager sur Facebook
                                                      • Partager sur Twitter

                                                      Requête avec paramètres - MySQL - C++

                                                      × 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