[c][Mysql]Récuppérer une donnée en c de Mysql

Récuppérer une donnée en c de Mysql [c][Mysql] - C - Programmation

Marsh Posté le 17-04-2006 à 16:32:06    

Bonjour
 
J'essaye de recuppérer une donnée (nb_tour) en c dans une base mysql.
Mon problème c'est que je récupère une valeur différente que celle qui est dans ma base.
Je ne comprend pas pourquoi.
Voici ma fonction :
 
 

Citation :

int get_nb_tour(idcourse)
{
MYSQL *conn;
MYSQL_RES *res;
MYSQL_ROW ligne;
char *debut;
int nb_tour;
 
if (DEBUG==1) printf("  Fonction Get Nb Course\n" );
 
// initialisation
if((conn = mysql_init(NULL)) == NULL)
  {
  printf("Erreur d'initialisation\n" );
  return -1;
  }
 
// connexion au serveur (ici, en local)
if(mysql_real_connect(conn,"localhost","yoyo","tX56JBHD89","course",0,NULL,0)==NULL)
 {
 printf("Erreur de connexion\n" );
 return -1;
 }
debut = malloc(100);
sprintf(debut,"SELECT nb_tour  FROM course WHERE idcourse=%d",idcourse);
if (mysql_query(conn,debut))
    {
      printf("  Erreur dans la requête : %s\n",debut);
      return -1;
    }
else
    {
 if (DEBUG==1) printf("  Requete OK\n" );
 if ((res = mysql_store_result(conn)) != NULL)
    {
  if (DEBUG==1) printf("  MySQL Store Result OK\n" );
  if ((ligne = mysql_fetch_row(res)) != NULL )
     {
   if (DEBUG==1) printf("  MySQL Fetch Row OK\n" );
   nb_tour = *ligne[0];
     }
  else
     {
   if (DEBUG==1) printf("  MySQL Fetch Row KO\n" );
   nb_tour = -1;
     }
    }
 else
    {
  if (DEBUG==1) printf("  MySQL Store Result KO\n" );
  nb_tour = -1;
    }
    }
mysql_close(conn);
return(nb_tour);
}

Reply

Marsh Posté le 17-04-2006 à 16:32:06   

Reply

Marsh Posté le 17-04-2006 à 22:21:17    

> debut = malloc(100);  
- je ne vois pas de free() sur cette variable. utilise plutot:
char debut[128];  
qui est plus rapide qu'un malloc, et se libère automatiquement à la fin de la fonction.
 
> res = mysql_store_result(conn)
cette ligne alloue aussi de la mémoire, interne à la librairie mysql client, que tu as oublié de libérer, tu as probablement une fuite mémoire dans ton code
 
> nb_tour = *ligne[0];
si mes souvenirs sont bons, les type MYSQL_ROW est une liste de chaînes de caratères, aussi avec ton code, tu mets le numéro ASCII du premier caractère du premier champs dans nb_tour (un chiffre, c'est de 64 à 74). Ce qu'il faut faire, c'est transformer cette représentation sous forme de chaîne en un nombre. Pour celà je te conseilles de vérifier quel est le type entier utilisé par ton champs (int,bigint...) et quelle est sa longueur (cette dernière info est dans la doc mysql, chapitre type entiers). Très vraisemblablement, tu devra utiliser l'une des fonctions atoi(), atol(), atoll():
nb_tour = atoll(*ligne[0]);
 
Une dernière remarque, si tu doit éxécuter plusieurs requêtes, ouvre et ferme la BDD en dehors de ta fonction, au début et à la fin du programme par exemple.

Reply

Marsh Posté le 17-04-2006 à 22:56:17    

errata: petite erreur de copier/collé: il fallait lire bien sûr:
nb_tour = atoll(ligne[0]);

Reply

Marsh Posté le 17-04-2006 à 23:15:30    

utilises plutot strtol qui permet de controller la validitée de la conversion, et les fonctions ato* sont dépréciées par les fonctions strto*

Reply

Marsh Posté le 20-04-2006 à 23:54:09    

Merci de vos reponses, cela m'a fortement aidé et j'ai reussi a réaliser ce que je cherchai a faire
merci
 :hello:

Reply

Sujets relatifs:

Leave a Replay

Make sure you enter the(*)required information where indicate.HTML code is not allowed