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

C Discussion :

Problème utilisation API MySQL


Sujet :

C

  1. #1
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 6
    Points : 5
    Points
    5
    Par défaut Problème utilisation API MySQL
    Bonjour,

    je cherche à utiliser une base de données mysql dans du code C dans le cadre d'une identifcation d'utilisateur.
    Lorsque j'effectue la requête et qu'un utilisateur est dans la table, pas de problème! Mais quand je rentre un utilisateur qui n'est pas dans la table et dont le login fait plus de 9 caractères, le programme plante et me donne ce message d'erreur :

    *** glibc detected *** free(): invalid next size (fast): 0x08875180 ***
    Abandon

    Je suppose que c'est une erreur de grandeur d'un buffeur de mysql mais je ne sais pas lequel ni comment le modifier.

    Merci,




    Voici mon code C qui contient les descriptions des tables en commentaire:

    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
     
    #include <stdio.h>
    #include<string.h>
    #include<stdlib.h>
    #include <mysql.h>
     
     
    using namespace std;
    extern "C"
    {
    static char *server_args[] = {
      "this_program",       /* this string is not used */
      "--basedir=/usr/local/mysql/",
      "--datadir=/usr/local/mysql/var"
    //  "--key_buffer_size=32M"
    };
    static char *server_groups[] = {
      "embedded",
      "server",
      "this_program_SERVER",
      (char *)NULL
    };
    }
    int recherche_id_user(MYSQL* mysql, const char * login)
    {
        char * query = (char*) malloc(sizeof("select id from USER where (login = '"));
     
        strcpy(query,"select id from USER where (login = '");
        strcat(query,login);
        strcat(query,"')");
     
        printf("%s\n",query);
     
        printf("%d\n",mysql_real_query(mysql,query,strlen(query)));
        MYSQL_RES * resultat=NULL;
        resultat = mysql_store_result(mysql);
        if (mysql_num_rows(resultat)==1)
        {
            MYSQL_ROW row;
     
            printf("nombre de row dans le set : %d \n",mysql_num_rows(resultat));
            row= mysql_fetch_row(resultat);
     
            mysql_free_result(resultat);
            return atoi(row[0]);
        }
        else 
        {
     
        mysql_free_result(resultat);
            return 0;
        }
    }
     
    extern "C"
    {
    int main(void) {
      if (mysql_server_init(sizeof(server_args) / sizeof(char *),
                            server_args, server_groups))
        exit(1);
        const char * login = "Gillain";
        const char * fct = "AJOUT";
        int id_usr=0,id_fct=0;
        MYSQL_RES* resultat = NULL;
      /* Use any MySQL API functions here */
        mysql_init(NULL);
        MYSQL* mysql = NULL;   
        MYSQL_ROW row ;
        mysql=mysql_init(NULL);
        mysql_options(mysql, MYSQL_READ_DEFAULT_GROUP, "libmysqld_client");
        mysql_options(mysql, MYSQL_OPT_USE_EMBEDDED_CONNECTION, NULL);
        mysql=mysql_real_connect(mysql,"localhost","root","","ACCESS",0,NULL,0);
        id_usr=recherche_id_user(mysql,login);
        if(id_usr != 0)
          {
      //  id_fct=rechercher_id_fct(mysql,fct);
     
        printf("connection à la base de données effectuée %d\n",id_usr);
        printf(" voila le code de la connexion a ACCESS!\n");
          }
      mysql_close(mysql);
     
      mysql_server_end();
     
      return EXIT_SUCCESS;
    }
    }
    // +------------------+
    // | Tables_in_ACCESS |
    // +------------------+
    // | DROIT |
    // | FCT |
    // | MODULE |
    // | USER |
    // +------------------+
    // 4 rows in set (0,00 sec)
    //
    // mysql> describe FCT
    // -> ;
    // +----------+--------------+------+-----+---------+----------------+
    // | Field | Type | Null | Key | Default | Extra |
    // +----------+--------------+------+-----+---------+----------------+
    // | id | mediumint(9) | | PRI | NULL | auto_increment |
    // | nom | char(30) | YES | | NULL | |
    // | moduleid | mediumint(9) | | | 0 | |
    // +----------+--------------+------+-----+---------+----------------+
    // 3 rows in set (0,02 sec)
    //
    // mysql> describe DROIT;
    // +--------+--------------+------+-----+---------+-------+
    // | Field | Type | Null | Key | Default | Extra |
    // +--------+--------------+------+-----+---------+-------+
    // | iduser | mediumint(9) | | | 0 | |
    // | idfct | mediumint(9) | | | 0 | |
    // +--------+--------------+------+-----+---------+-------+
    // 2 rows in set (0,00 sec)
    //
    // mysql> describe MODULE;
    // +-------------+--------------+------+-----+---------+----------------+
    // | Field | Type | Null | Key | Default | Extra |
    // +-------------+--------------+------+-----+---------+----------------+
    // | id | mediumint(9) | | PRI | NULL | auto_increment |
    // | nom | varchar(30) | YES | | NULL | |
    // | description | varchar(120) | YES | | NULL | |
    // +-------------+--------------+------+-----+---------+----------------+
    // 3 rows in set (0,00 sec)
    //
    // mysql> describe USER;
    // +-------+--------------+------+-----+---------+----------------+
    // | Field | Type | Null | Key | Default | Extra |
    // +-------+--------------+------+-----+---------+----------------+
    // | id | mediumint(9) | | PRI | NULL | auto_increment |
    // | login | char(30) | | | | |
    // +-------+--------------+------+-----+---------+----------------+
    // 2 rows in set (0,00 sec)
    [Balises codes ajoutées par fearyourself, merci d'y penser la prochaine fois]

  2. #2
    Membre émérite Avatar de Maximil ian
    Profil pro
    Inscrit en
    Juin 2003
    Messages
    2 622
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2003
    Messages : 2 622
    Points : 2 973
    Points
    2 973
    Par défaut
    Je déplace vers le forum C. Quelle est la ligne qui plante ?
    Pensez au bouton

  3. #3
    Membre expérimenté
    Avatar de Gruik
    Profil pro
    Développeur Web
    Inscrit en
    Juillet 2003
    Messages
    1 566
    Détails du profil
    Informations personnelles :
    Âge : 40
    Localisation : France

    Informations professionnelles :
    Activité : Développeur Web

    Informations forums :
    Inscription : Juillet 2003
    Messages : 1 566
    Points : 1 727
    Points
    1 727
    Par défaut
    Tu accedes à une zone qui a été libérée

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    mysql_free_result(resultat);
    return atoi(row[0]);

  4. #4
    Futur Membre du Club
    Profil pro
    Inscrit en
    Mars 2006
    Messages
    6
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Mars 2006
    Messages : 6
    Points : 5
    Points
    5
    Par défaut
    mmmmh désolé ... j'ai trouver mon erreur après qq heure de recherche... pour finalement me dire que j'etais variment bete confondre un sizeof avec un strlen lors d'un malloc ca fais un peu mal ... lol
    enfin voila quoi .... merci valgrind !!!!

  5. #5
    zul
    zul est déconnecté
    Membre éclairé Avatar de zul
    Profil pro
    Inscrit en
    Juin 2002
    Messages
    498
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Juin 2002
    Messages : 498
    Points : 699
    Points
    699
    Par défaut
    Même en modifiant le sizeof en strlen, le code reste faux. Tu va fatalemeent ecrire plsu que la taille de ton buffer.
    tu alloue un buffer de longueur debut_requete et tu essaye de stocker dedans debut_requete + login + un petit truc derriere.

    Quelques autres remarques au passage :
    il ne sert a rien de caster le retour de malloc en C
    la mémoire associé a query n'est jamais liberé.

    Perso j'utiliserai plutot un buffer statique et snprintf, cela me parait plus sur.

Discussions similaires

  1. TMemoryStream vers BLOB en utilisant l'API Mysql
    Par Dj_Will dans le forum Bases de données
    Réponses: 17
    Dernier message: 10/11/2017, 16h08
  2. Réponses: 21
    Dernier message: 21/04/2010, 17h22
  3. (Problème) Utilisation de l'API mySQL [Delphi 2005 Perso]
    Par will-scs dans le forum Bases de données
    Réponses: 2
    Dernier message: 08/08/2005, 18h26
  4. Problème d'utilisation de Mysql avec dev-c++
    Par Watchi dans le forum Dev-C++
    Réponses: 10
    Dernier message: 06/08/2004, 14h35
  5. Utilisation des API MySQL // ADO ou BDE ? (sujet 2)
    Par rohstev dans le forum C++Builder
    Réponses: 8
    Dernier message: 07/11/2003, 10h50

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