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

Bibliothèques C++ Discussion :

C++ et mysql ( sous wamp serveur) insertion de données


Sujet :

Bibliothèques C++

  1. #1
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Bonjour , Je ne sais pas si c'est le bon lieu pour poster cette aide .
    Pour mon projet j 'ai connecté codeblocks a ma base de donnée mysql sous wamp.
    Code : 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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
     
    #include <iostream>
    #include "Facturation.h"
    #include <string>
    #include <winsock.h>
    #include "MYSQL\mysql.h"
     
     
    #define def_nom_hote NULL // hote auquel se connecte le prog localhost
    #define def_nom_utilisateur NULL // par defaut le mien
    #define def_motdepasse NULL
     
    int c= 11;
     
    using namespace std;
     
    int main()
    {
     
     
     MYSQL *ptconn;
     
      ptconn=mysql_init(NULL);
     
    	if(mysql_real_connect(ptconn,"localhost","root","","facturation",0,NULL,0)){cout<< "all gud"<<endl;} else{ cout<<"toto"<<endl;}
     
     
         int a=11;
      string b="today";
        int  c=1;
     string d="achatdetomate ";
      float e=50.7;
      string f="today";
      float g=21.4;
     
     
     
    if( mysql_query(ptconn, "INSERT INTO facture(numfact,date) VALUES ('c','b')")==0)
     {  cout<<"gud insert"<<endl;}
     else
    { cout<<"toto1"<<endl;cout << mysql_error(ptconn) << endl;}
     
       if( mysql_query(ptconn, " SELECT * from facture")==0)
         {  cout<<"gud select"<<endl; }
       else{ cout<<" toto"<<endl;
       cout << mysql_error(ptconn) << endl;}
     
     
    MYSQL_RES *result = NULL;
     
    result = mysql_use_result(ptconn);
     
    if(result == NULL)
    {
    cout << "Résultat vide" << endl;
    cout << mysql_error(ptconn) << endl;
    }
    //On récupère le nombre de champs
     
    unsigned int nb_champs = mysql_num_fields(result);
    if(nb_champs != 3) cout << "C'est bizarre" << endl;
    // lecture du resultat
    MYSQL_ROW row;
     
    while ((row = mysql_fetch_row(result)))
    {
    cout << "ID : " << row[0] << ", Nom : " << row[1]
    << ", Prenom : " << row[2] << endl;
    }
     
    mysql_free_result(result);
     
    mysql_close(ptconn);
     
     
        return 0;
     
    }
    J 'arrive à me connecter, à lister les élements de la table(select) mais je n'arrive pas a rentrer des valeurs dans la table(insert) .
    A la place de int ou float j'ai 0 dans le tableau et la place des string j'ai un espace vide

  2. #2
    Membre confirmé
    Inscrit en
    Août 2004
    Messages
    556
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 556
    Points : 588
    Points
    588
    Par défaut
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    if( mysql_query(ptconn, "INSERT INTO facture(numfact,date) VALUES ('c','b')")==0)
    Tu insères ici 'c' et 'b' dans ta table, et non les valeurs de c et de b.

    Vois du côté de stringstream (FAQ).

    Si tu as des 0, c'est probablement parce que le type des données que tu insères n'est pas celui des attributs de ton tuple. (ce qui, ici, est normal, je suppose que numfact est de type entier et que date est de type date, or, 'c' et 'b' ne sont ni l'un ni l'autre)

  3. #3
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    J'ai regardé sur les entrées sorties de c++.Les int des c++ sont les memes int de mysql,
    ici c=1;

    Désolée pour mon impolitesse je suis assez droit au but, lool merci pour ta réponse et tu dois avoir raison .Neanmoins comme je l'ai dit ils ont normalement la meme taille

  4. #4
    Membre confirmé
    Inscrit en
    Août 2004
    Messages
    556
    Détails du profil
    Informations forums :
    Inscription : Août 2004
    Messages : 556
    Points : 588
    Points
    588
    Par défaut
    Tu n'as pas compris.

    Dans ta requête, tu insères le caractère 'c' et le caractère 'b', et non la valeur de ces variables.

  5. #5
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Je vois sauf que je n'ai pas trouvé le moyen d'envoyer ce qu'il y a dans ma variable .J'ai essayer de changer les quotes mais la ca me cause des erreurs de codes c++.

    Il faudrait créer un string dans lequel on aurai placé directement les valeur dont on a besoin.
    En plus clair

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    string quer="INSERT INTO facturation(numfact,date) VALUES('";
     
    //transformer en chaine de caractere ce dont on a besoin et directement les //ajouter
     
    quer+=toto;
    quer+="','";

  6. #6
    Membre émérite
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Points : 2 799
    Points
    2 799
    Par défaut
    Non, il ne faut pas.

    Quand on fait ça, on s'expose fatalement à des problèmes d'injection SQL, parce que ça n'est pratiquement jamais fait correctement (ne serait-ce qu'à cause des problèmes d'encodage).

    Donc on fait du parameter binding. En plus, c'est plus performant .

    Un petit lien avec un exemple : http://dev.mysql.com/doc/refman/5.0/...t-execute.html

  7. #7
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    Thanx

  8. #8
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    J'ai utilisé mysql_stmt_execute() , mysql_stmt_init() et g des bug
    undefined reference to _mysql_stmt_init@4, mysql_stmt_prepare@12
    et cela continue ainsi pour toute les fonction mysql_stmt que j'ai utilisé
    voici le code
    Code : 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
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    133
    134
    135
    136
    137
    138
    139
    140
    141
    142
    143
    144
    145
    146
    147
    148
    149
    150
    151
    152
    153
    154
    155
    156
    157
    158
    159
    160
    161
    162
    163
    164
    165
     
    #include <iostream>
    #include <string>
    #include <cstring>
     
    #include <winsock.h>
    #include <stdio.h>
    #include <MYSQL\mysql.h>
    // j'ai supprimé les espaces pr ke le code ne soit pas affiché en rouge 
     
    #defineINSERT_SAMPLE"INSERTINTOfacture(numfact,date,prestation)VALUES(?,?,?)"
     
     
    using namespace std;
     
    int main()
    {
         MYSQL *ptconn;
         int  param_count;
         int  int_data;
         char str_data[50];
         char st_data[50];
         unsigned long str_length;
         unsigned long st_length;
         my_ulonglong  affected_rows;
         my_bool       is_null;
         MYSQL_BIND    bind[3];
     
        ptconn=mysql_init(NULL);
     
    	if(mysql_real_connect(ptconn,"localhost","root","","facturation",0,NULL,0)){cout<< "all gud"<<endl;}
    	MYSQL_STMT    *stmt;
        stmt = mysql_stmt_init(ptconn);
     
        if (!stmt)
    {
      fprintf(stderr, " mysql_stmt_init(), out of memory\n");
      exit(0);
    }
     
    if (mysql_stmt_prepare(stmt, INSERT_SAMPLE, strlen(INSERT_SAMPLE)))
    {
      fprintf(stderr, " mysql_stmt_prepare(), INSERT failed\n");
      fprintf(stderr, " %s\n", mysql_stmt_error(stmt));
      exit(0);
    }
     
    fprintf(stdout, " prepare, INSERT successful\n");
     
       /// Get the parameter count from the statement
    param_count= mysql_stmt_param_count(stmt);
    fprintf(stdout, " total parameters in INSERT: %d\n", param_count);
     
    if (param_count != 3) /* validate parameter count */
    {
      fprintf(stderr, " invalid parameter count returned by MySQL\n");
      exit(0);
    }
     
    /* Bind the data for all 3 parameters */
     
    memset(bind, 0, sizeof(bind));
     
    /* INTEGER PARAM */
    /* This is a number type, so there is no need
       to specify buffer_length */
    bind[0].buffer_type= MYSQL_TYPE_LONG;
    bind[0].buffer= (char *)&int_data;
    bind[0].is_null= 0;
    bind[0].length= 0;
     
    /* STRING PARAM */
    bind[1].buffer_type= MYSQL_TYPE_STRING;
    bind[1].buffer= (char *)str_data;
    bind[1].buffer_length= 50;
    bind[1].is_null= 0;
    bind[1].length= &str_length;
     
     
    /* STRING PARAM */
    bind[2].buffer_type= MYSQL_TYPE_STRING;
    bind[2].buffer= (char *)st_data;
    bind[2].buffer_length=50;
    bind[2].is_null= 0;
    bind[2].length= &st_length;
     
     
    /* Bind the buffers */
    if (mysql_stmt_bind_param(stmt, bind))
    {
      fprintf(stderr, " mysql_stmt_bind_param() failed\n");
      fprintf(stderr, " %s\n", mysql_stmt_error(stmt));
      exit(0);
    }
     
    /* Specify the data values for the first row */
    int_data= 10;             /* integer */
    str_length= strlen(str_data);
    strcpy(str_data, "MySQL"); /* string  */
    st_length= strlen(st_data);
    strcpy(st_data, "helooooooo"); /* string  */
     
     
    /* Execute the INSERT statement - 1*/
    if (mysql_stmt_execute(stmt))
    {
      fprintf(stderr, " mysql_stmt_execute(), 1 failed\n");
      fprintf(stderr, " %s\n", mysql_stmt_error(stmt));
      exit(0);
    }
     
    /* Get the total number of affected rows */
    affected_rows= mysql_stmt_affected_rows(stmt);
    fprintf(stdout, " total affected rows(insert 1): %lu\n",
                    (unsigned long) affected_rows);
     
    if (affected_rows != 1) /* validate affected rows */
    {
      fprintf(stderr, " invalid affected rows by MySQL\n");
      exit(0);
    }
     
    /* Specify data values for second row,
       then re-execute the statement */
    int_data= 1000;
    strcpy(str_data, "The most");
    str_length= strlen(str_data);
     
    strcpy(st_data, "The most popular Open Source database");
    st_length= strlen(st_data);
     
     
    is_null= 0;               /* reset */
     
    /* Execute the INSERT statement - 2*/
    if (mysql_stmt_execute(stmt))
    {
      fprintf(stderr, " mysql_stmt_execute, 2 failed\n");
      fprintf(stderr, " %s\n", mysql_stmt_error(stmt));
      exit(0);
    }
     
    /* Get the total rows affected */
    affected_rows= mysql_stmt_affected_rows(stmt);
    fprintf(stdout, " total affected rows(insert 2): %lu\n",
                    (unsigned long) affected_rows);
     
    if (affected_rows != 1) /* validate affected rows */
    {
      fprintf(stderr, " invalid affected rows by MySQL\n");
      exit(0);
    }
     
    /* Close the statement */
    if (mysql_stmt_close(stmt))
    {
      fprintf(stderr, " failed while closing the statement\n");
      fprintf(stderr, " %s\n", mysql_stmt_error(stmt));
      exit(0);
    }
     
     
     
        return 0;
    }

  9. #9
    Membre émérite
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Points : 2 799
    Points
    2 799
    Par défaut
    undefined reference, c'est une erreur de link. Il faut que tu rajoutes la lib mysql lors du link.

    gcc ... -lmysql

  10. #10
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    j'ai rajoutée libmysqlclient.a et ca na rien changé

  11. #11
    Membre émérite
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Points : 2 799
    Points
    2 799
    Par défaut
    Donne la ligne exacte que tu utilises pour compiler, ton environnement, et la sortie complète du compilateur. Là, il manque trop d'infos.

  12. #12
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    J'utilise code blocks et pour rajouter une lib je l'ajoute ds code blocks en le mettant dans mingw et dans le dossier include de code blocks

    je n'ai jamais "linké" en ligne de cmd

  13. #13
    Candidat au Club
    Profil pro
    Inscrit en
    Mai 2009
    Messages
    8
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Mai 2009
    Messages : 8
    Points : 2
    Points
    2
    Par défaut
    undefined reference to mysql_stmt_init@4
    undefined reference to mysql_stmt_prepared@12
    undefined reference to mysql_stmt_param_count@4
    undefined reference to mysql_stmt_bind_param@8
    undefined reference to mysql_stmt_error@4
    undefined reference to mysql_stmt_execute@4
    undefined reference to mysql_stmt_affexted_rows@4

    voila les seuls erreurs que j'ai a la compilation

  14. #14
    Membre émérite
    Avatar de white_tentacle
    Profil pro
    Inscrit en
    Novembre 2008
    Messages
    1 505
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2008
    Messages : 1 505
    Points : 2 799
    Points
    2 799
    Par défaut
    Euh...

    Qu'est-ce qui n'est pas clair dans :
    Donne la ligne exacte que tu utilises pour compiler, ton environnement, et la sortie complète du compilateur. Là, il manque trop d'infos.
    Code Blocks ne te donne pas cette info ? (je n'utilise pas cet EDI).

    Tu dois bien avoir moyen d'avoir l'output détaillé (avec le gcc ... ), non ? Sans ça, ça va être difficile de voir ce qui ne va pas.

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

Discussions similaires

  1. [Wamp] Plantage Apache lors de la déconnexion à MySQL sous Wamp Server
    Par Gigagun dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 1
    Dernier message: 26/09/2009, 18h23
  2. [Wamp] Script PHP-MySQL sous Wamp
    Par od.dev dans le forum EDI, CMS, Outils, Scripts et API
    Réponses: 9
    Dernier message: 28/08/2008, 14h57
  3. Connexion depuis Unix sur serveur Mysql sous Windows
    Par krlou dans le forum Installation
    Réponses: 4
    Dernier message: 01/02/2008, 18h32
  4. Serveur mysql sous linux ou Windows?
    Par gnaoui_9999 dans le forum Installation
    Réponses: 5
    Dernier message: 11/10/2006, 14h28

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