le nombre d'élémaent dans une ligne peut s'obtenir par
mysql_num_fields(result)<http://dev.mysql.com/doc/refman/5.0/en/mysql-num-fields.html>
.
tu as aboslument besoin de vérifier que tu n'accède pas à plus d'éléments
qu'il y en a dans la réponse.

http://dev.mysql.com/doc/refman/5.0/en/mysql-fetch-row.html

Le 2 juin 2010 11:06, Vincent BRACH <[email protected]> a écrit :

> Salut Patrice
>
> > #include <mysql/mysql.h>
> > #include <string.h>
> > #include <stdio.h>
> > #include <stdlib.h>
> >
> > void main(){
> >
> > MYSQL *mysql;
> > MYSQL_RES *res;
> > MYSQL_ROW row;
> > char *query,string[2500];
> > //char *query1;
> > int t,r;
> > mysql_init(mysql);
> > if (!
> > mysql_real_connect(mysql,"localhost","user","mdp","base",0,NULL,0))
> > {
> > printf( "Error connecting to database: %s\n",mysql_error(mysql));
> > }
> > else printf( "c'est bon ....");
> > query="select n1,n2,n3,n4,n5,n6,n7,n8,n9,n10 from keno";
> > if (mysql_query(mysql, query))
> > {
> > fprintf(stderr, "%s\n", mysql_error(mysql));
> > exit(0);
> > }
> > res = mysql_use_result(mysql);
> >
> >
> ICI je pense que tu devrais tester ton pointeur "res" savoir s'il n'est
> pas NULL car si un problème est survenu pendant la requette (genre le
> n11 qui n'existe pas) tu peux te retrouver à passer à ta fonction
> suivante (mysql_fetch_row) un res=NULL
> >
> > while ((row = mysql_fetch_row(res)) != NULL)
> > {
> >      printf(
> > "%s|%s|%s|%s|%s|%s|%s|%s|%s|%s
> >
> \n",row[0],row[1],row[2],row[3],row[4],row[5],row[6],row[7],row[8],row[9]);
> > }
> > mysql_free_result(res);
> > mysql_close(mysql);
> > }
> >
> Perso je n'ai (mais beaucoup) travaillé qu'avec postgresql en C (et pas
> mysql en C) mais ça à l'air assez similaire.
>
> En tout état de cause je pense qu'un petit nettoyage de ton source est
> nécessaire à plusieurs niveau :
>
> - query="select n1,n2,n3,n4,n5,n6,n7,n8,n9,n10 from keno"; << pas propre
> du tout me mettre un char * = "une chaine"; surtout que ton pointeur
> query n'est jamais alloué, contrairement à ton tableau de caractère
> string qui est alloué statiquement (2500 en taille ça va c'est
> peinard...)
> Dans ce genre de cas privilégie plutôt quelque chose comme ça :
> char query[2500];
> sprintf(query, "select n1,n2,n3,n4,n5,n6,n7,n8,n9,n10 from
> keno"); //stdio.h
> ou
> strcpy(query, "select n1,n2,n3,n4,n5,n6,n7,n8,n9,n10 from
> keno"); //string.h
>
> - il serait plus propre également d'utiliser un peu plus les boucles
> for ;) :
> à la place de printf( "%s|%s|%s|%s|%s|%s|%s|%s|%s|%s
> \n",row[0],row[1],row[2],row[3],row[4],row[5],row[6],row[7],row[8],row[9]);
> plutôt faire un :
> for (i=0;i<10;i++)
>  printf("%s|", row[i]); // << certe tu auras un '|' pour le dernier
> mais bon...
> printf("\n");
>
> - Tu pourrais faire une requette du type "select * from keno" et ensuite
> récupérer le résultat et identifier indépendamment chacun de tes champs
>
> - Je pense également qu'il serait grandement préférable qu'à chaque
> appel de fonction (surtout issue de lib C Sql) il faut récupérer et
> tester le retour de la fonction (pointeur ou valeur) ce que tu ne fais
> pas pour la variable "res" (retour de mysql_use_result) que tu passe
> directement à mysql_fetch_row.
> Également tester les retour de 'mysql_free_result' et de 'mysql_close'
> même si moins critique mais évite d'ignorer les fuites mémoires en cas
> de soucis...
>
> Voila, j'espère que ça pourra t'aider un peu.
>
> @+
> Vincent
> >
> >
>
>
>
>
>
>  Diffusez cette liste aupres de vos relations :-)
>    Linux Azur : http://www.linux-azur.org
>    Vous etes responsable de vos propos.
> *** Merci de rediger sans SMS, ni HTML ni PJ ***
>
>
>
>

 Diffusez cette liste aupres de vos relations :-)
    Linux Azur : http://www.linux-azur.org
    Vous etes responsable de vos propos.
*** Merci de rediger sans SMS, ni HTML ni PJ ***



Répondre à