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 ***
