magicrincevent et 6 utilisateurs inconnus

 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[C++] Classe Mysql

n°4821
DarkBears
j'aime le miel put1 d'abeilles
Posté le 18-01-2005 à 15:24:56  profilanswer
 

Voilà je suis en train de développer un programme simple constitué de 3 fichiers qui permet de ce connecter à une base de données et faire une requête !
 
cmysql.h => contient la classe CMysql
cmysql.cpp => contient le développement des méthodes
main.cpp => pour faire le test !!
 
J'ai une erreur : segmentation fault
 
Je voudrais alors savoir si vous connaissez des classes mysql en C++ déjà faite que je puisse modifier.
 
Merci d'avance  :)

mood
Google
Posté le 18-01-2005 à 15:24:56  profilanswer
 

n°4822
Deather2
OpenBSD: the way to go!
Posté le 18-01-2005 à 15:41:23  profilanswer
 

Ben poste nous plutôt le code, en indiquant où il segfault, qu'on t'aide à le corriger :)

n°4823
DarkBears
j'aime le miel put1 d'abeilles
Posté le 18-01-2005 à 15:45:46  profilanswer
 

oauis je vais faire ça !!!

n°4824
DarkBears
j'aime le miel put1 d'abeilles
Posté le 18-01-2005 à 15:51:42  profilanswer
 

Code :
  1. // cmysql.h
  2. #include <iostream>
  3. #include <string.h>
  4. #include <mysql/mysql.h>
  5. class CMysql
  6. {
  7. private :
  8.  MYSQL *mysql;
  9.  MYSQL_RES *resultat;
  10.  MYSQL_FIELD *champs;
  11.  MYSQL_ROW ligne;
  12. public :
  13.  CMysql();
  14.  ~CMysql();
  15.  void ConnectBD();
  16.  void DeconnectBD();
  17.  void Requete(MYSQL *mysql, char *query);
  18. };


 

Code :
  1. // cmysql.cpp
  2. #include <iostream>
  3. #include <stdlib.h>
  4. #include "cmysql.h"
  5. using namespace std;
  6. CMysql::CMysql()
  7. {
  8. }
  9. CMysql::~CMysql()
  10. {
  11. }
  12. void CMysql::ConnectBD()
  13. {
  14. mysql = mysql_init(NULL);
  15. if(!mysql_real_connect(mysql, "localhost", "C'est un", "secret", "sevre et marais", 0, NULL, 0))
  16. {
  17.      cout << "Impossible de se connecter a la base de donnees.\n Erreur : " << mysql_error(mysql) << "\n";
  18. }
  19. else
  20. {
  21.  cout << "Connexion a la base de donnees ... \n";
  22. }
  23. }
  24. void CMysql::DeconnectBD()
  25. {
  26. mysql_close(mysql);
  27. cout << "Deconnexion ...\n";
  28. }
  29. void CMysql::Requete(MYSQL *mysql, char *query)
  30. {
  31. int i, j, k, test;
  32. char *req1;
  33. req1 = (char *) malloc(500);
  34. cout << "Insertion de valeurs ...\n";
  35. for (i = 0; i < 2 ; i++)
  36. {
  37.  sprintf(req1, "INSERT INTO Barrage (ID, NomSite, NiveauAmont, Numero) VALUES (%d, Niort, 1.5, 0549000000)", i);
  38.  cout << req1 << "\n";
  39.  mysql_real_escape_string(mysql, query, req1, strlen(req1) );
  40.  cout << query << "\n";
  41.  test = mysql_real_query(mysql, query, (unsigned int) strlen(query));
  42.  if (test)
  43.  {
  44.   cout << "Erreur de la requete \n" << mysql_error(mysql) << "\n";
  45.  }
  46.  else
  47.  {
  48.   cout << "Requete effectuee ...\n";
  49.  }
  50.  sleep(1);
  51. }
  52. free(req1);
  53. }


 

Code :
  1. // main.cpp
  2. #include <iostream>
  3. #include "cmysql.h"
  4. using namespace std;
  5. int main()
  6. {
  7. MYSQL *mysql;
  8. char *query;
  9. CMysql barrage;
  10. barrage.ConnectBD();
  11. barrage.Requete(mysql, query);
  12. barrage.DeconnectBD();
  13. return 0;
  14. }

n°4825
DarkBears
j'aime le miel put1 d'abeilles
Posté le 18-01-2005 à 15:53:30  profilanswer
 

Ca ce connecte à la base
Ca affiche : " Insertion des données "
Ca affiche la requete et juste aprés segmentation fault

n°4826
Deather2
OpenBSD: the way to go!
Posté le 18-01-2005 à 16:06:04  profilanswer
 

Déjà, dans la méthode Requete, remplace le (char*)malloc(500); par new char[500];
Et le free par delete [] req1;
 
Mais bon bref ça changera pas le comportement du prog, c'est juste plus propre.
 
À mon avis le problème viens lors du free, car ptet le pointeur a été modifié et ne pointe plus au même endroit, et ut peux pas libérer le nouvo pointeur (faut comprendre :D)
 
Sinon compile avec l'option -g et utilise gdb pour voir où exactement il segfault ;)

n°4827
DarkBears
j'aime le miel put1 d'abeilles
Posté le 18-01-2005 à 16:08:21  profilanswer
 

non mais le segmentation fault il apparait seulement quand je lance le programme !!! pas quand je compile !

n°4828
Deather2
OpenBSD: the way to go!
Posté le 18-01-2005 à 16:09:29  profilanswer
 

Lol je me doute bien :D
Compile le en rajoutant l'option -g, puis tu fais: gdb ./le_programme
ensuite tu tappes run, tu il te mettra la ligne où ça segfault ;)

n°4829
DarkBears
j'aime le miel put1 d'abeilles
Posté le 18-01-2005 à 16:16:06  profilanswer
 

alors alors !
je suis pas spécialiste du décriptage !!
 

Code :
  1. [sevre@Sevre Mysql test]$ gdb ./mysql
  2. GNU gdb 5.3-25mdk (Mandrake Linux)
  3. Copyright 2002 Free Software Foundation, Inc.
  4. GDB is free software, covered by the GNU General Public License, and you are
  5. welcome to change it and/or distribute copies of it under certain conditions.
  6. Type "show copying" to see the conditions.
  7. There is absolutely no warranty for GDB.  Type "show warranty" for details.
  8. This GDB was configured as "i586-mandrake-linux-gnu"...
  9. (gdb) run
  10. Starting program: /home/sevre/Mysql test/mysql
  11. Connexion a la base de donnees ...
  12. Insertion de valeurs ...
  13. INSERT INTO Barrage (ID, NomSite, NiveauAmont, Numero) VALUES (0, Niort, 1.5, 0549000000)
  14. Program received signal SIGSEGV, Segmentation fault.
  15. 0x40269063 in _IO_stdin_ () from /lib/i686/libc.so.6
  16. (gdb) Quit

n°4830
DarkBears
j'aime le miel put1 d'abeilles
Posté le 18-01-2005 à 16:29:21  profilanswer
 

si j'enleve la fonction
mysql_real_escape_string(mysql, query, req1, strlen(req1) );  
ça marche alors je sais pas ce que j'ai fais de mal dedans :S

n°4831
Deather2
OpenBSD: the way to go!
Posté le 18-01-2005 à 16:38:38  profilanswer
 

Pas de problème pour gdb je peux t'aider, j'y ai touché un peu.
donc là en gros, c'est la fonction mysql_real machin qui plante?
essaye de rajouter avant la fonction le code suivant:

Code :
  1. if(req1==NULL)
  2. {
  3.    cerr << "Erreur, le pointeur vaut NULL, tu as trouvé ton segfault :) << endl;
  4.    exit(1);
  5. } else
  6. {
  7.    cout << "L'erreur ne viens pas de là :(" << endl;
  8. }


Message édité par Deather2 le 18-01-2005 à 16:39:14
n°4832
DarkBears
j'aime le miel put1 d'abeilles
Posté le 18-01-2005 à 16:42:51  profilanswer
 

Réponse : L'erreur ne viens pas de là :(

n°4833
DarkBears
j'aime le miel put1 d'abeilles
Posté le 18-01-2005 à 16:43:40  profilanswer
 

il pourrai pas aussi y avoir un problème avec query ?

n°4834
Deather2
OpenBSD: the way to go!
Posté le 18-01-2005 à 16:50:49  profilanswer
 

C'que j'te conseil de faire, c'est de mettre un contrôle d'erreur entre chaque ligne de programme
genre moi pour débug à la bourrin sans m'embêter avec gdb, j'fais:

Code :
  1. #define DEBUG printf("debug" );


Puis je met des DEBUG un peu partout, et à l'execution bah je suis en même temps avec le code source :lol:
J'en entend qui rigole [:grut]
 
Mais sinon, tu peux le faire avec gdb, c'est plus propre.
Tu lances gdb avec le programme en argument, puis tu peut poser tes breakpoint, genre:

Code :
  1. (gdb) b NomDeLafonction
  2. (gdb) b NumeroDeLigne


Puis une fois arrivé sur un breakpoint, il s'arrête et te donne la main, t'indiquant la prochaine ligne de code qu'il va executer.
Là tu peux tapper next pour l'executer, step pour rentrer dedans, ou continue pour continuer l'execution du programme.
Si ça peut t'aider, gdb est très puissant pour débugger des programmes, et pas difficile d'utilisation du tout.
 
Pour afficher une variable, tu fais "print NomDeLaVariable", pour modifier sa valeur, "set NomVar=valeur'...
J'te conseille de faire ça pour voir d'où ça viens exactement.
au début, fais des next (si tu fais une fois next, ensuite t'as juste à appuyer sur entrée au prompt, ça refera next, t'emmerde pas à le retapper à chaque fois ;))
je te conseille pas de faire step lors d'un apel à une routine mysql, tu comprendrais rien au code.
À ce moment, si ça segfault bien DANS la routine mysql, il faut regarder les arguments que tu lui passe à l'aide de print.


Message édité par Deather2 le 18-01-2005 à 16:51:16
n°4835
DarkBears
j'aime le miel put1 d'abeilles
Posté le 18-01-2005 à 16:53:36  profilanswer
 

Merci !
Je vais te laisser refroidir le cerveau :D
Bonne journée ++

n°4836
Deather2
OpenBSD: the way to go!
Posté le 18-01-2005 à 16:54:50  profilanswer
 

Bon courage :D
Si tu veux faire chauffer le tien:

Code :
  1. (gdb) set disassembly-flavor intel
  2. (gdb) disassemble main


[:grut]

n°4838
Deadog
Dain Bramaged
Posté le 18-01-2005 à 19:59:12  profilanswer
 

avec gdb, une fois que ça a planté, tu fais bt (pour backtrace)

n°4907
MaNTA2003
Posté le 29-01-2005 à 14:34:53  profilanswer
 

[citation]

Code :
  1. [sevre@Sevre Mysql test]$ gdb ./mysql
  2. GNU gdb 5.3-25mdk (Mandrake Linux)
  3. Copyright 2002 Free Software Foundation, Inc.
  4. GDB is free software, covered by the GNU General Public License, and you are
  5. welcome to change it and/or distribute copies of it under certain conditions.
  6. Type "show copying" to see the conditions.
  7. There is absolutely no warranty for GDB.  Type "show warranty" for details.
  8. This GDB was configured as "i586-mandrake-linux-gnu"...
  9. (gdb) run
  10. Starting program: /home/sevre/Mysql test/mysql
  11. Connexion a la base de donnees ...
  12. Insertion de valeurs ...
  13. INSERT INTO Barrage (ID, NomSite, NiveauAmont, Numero) VALUES (0, Niort, 1.5, 0549000000)
  14. Program received signal SIGSEGV, Segmentation fault.
  15. 0x40269063 in _IO_stdin_ () from /lib/i686/libc.so.6
  16. (gdb) Quit

[/citation]
 
Doit y avoir moyen de faire un ptit exploit par return into libc, là... ;)

mood
Google
Posté le 29-01-2005 à 14:34:53  profilanswer
 


Aller à :
Ajouter une réponse
 

Hit Parade