Problème code C et requête sql

bonjour all,
petit problème de requête sql dans un code C…
Voilà mon code (que la partie consernant la requête…):

[code]case 4:

printf(“Entrez une requête:\n”);
scanf("%s", argv[6]);
sprintf(query, “%s”,argv[6]);
if (!mysql_real_query(mysql, query, strlen(query)))
{
resultat=mysql_store_result(mysql);
if(resultat==NULL)
{
fprintf(stderr,“Aucune ligne retournée par la requête\n”);
exit(0);
}
while((Rqrow=mysql_fetch_row(resultat))!=NULL)
{
for(i=0;i<mysql_num_fields(resultat);i++)
fprintf(stderr, “%s”, Rqrow[i]!=NULL? Rqrow[i]:“NULL”);
fprintf(stderr, “\n”);
}
mysql_free_result(resultat);
}

break;[/code]
mon problème est le suivant:
ce code ne maffiche pas la requête sql que je tape

[code] |====MENU====|

1-Lister les tables de la base de données
2-Accéder aux données de la table
3-Lister la structure d’une table
4-Taper et afficher le résultat d’une requête

Votre choix?:4

Entrez une requête:
select host from user

Deconnexion en cours …
Déconnecté.
arnaud-laptop:/home/arnaud/projetmysql#

[/code]
si je remplace le %s de la ligne sprintf(query, "%s",argv[6]); par une requête sql comme select host from user cela marche …

[code]Vous avez sélectionné la base suivante: mysql
|====MENU====|

1-Lister les tables de la base de données
2-Accéder aux données de la table
3-Lister la structure d’une table
4-Taper et afficher le résultat d’une requête

Votre choix?:4

Entrez une requête:
select host from user
localhost
localhost

Deconnexion en cours …
[/code]
je pense que j’ai un problème d’allocation mémoire mais je ne vois pas comment résoudre mon problème …
help me :smiley:

deja un truc qui me choque:

scanf("%s", argv[6]); sprintf(query, "%s",argv[6]);
pourquoi diable ecrire dans les arguments de ton programme? surtout si c’est pour aller recopier ca juste apres dans ta variable juste apres…
argv n’est pas fait pour ca.
je ne sais pas comment tu alloues query mais fais en sorte qu’il puisse contenir ta requete (en général 256 ca suffit, mais bon avec 1024 t’es peinard et 1ko c’est pas la mort sur une machine qui a moins de 10 ans)

donc utilises plutot ca:

[code]case 4:

printf(“Entrez une requête:\n”);
scanf("%s", query);
if (!mysql_real_query(mysql, query, strlen(query)))
{

[/code]

Sans vouloir ralentir les solutions à ton problème (que je ne pourrais pas solutionner) je voudrais juste dire que un code indenté serais un plus : plus agréble. c’est quand même plus beau ça :

[code]printf(“Entrez une requête:\n”);
scanf("%s", argv[6]);
sprintf(query, “%s”,argv[6]);
if (!mysql_real_query(mysql, query, strlen(query))) {
resultat=mysql_store_result(mysql);
if(resultat==NULL) {
fprintf(stderr,“Aucune ligne retournée par la requête\n”);
exit(0);
}
while((Rqrow=mysql_fetch_row(resultat))!=NULL) {
for(i=0;i<mysql_num_fields(resultat);i++)
fprintf(stderr, “%s”, Rqrow[i]!=NULL? Rqrow[i]:“NULL”);
fprintf(stderr, “\n”);
}
mysql_free_result(resultat);
}

break;[/code]
Après moi ce que j’en dis. Au moins je vois ce qui est imbriqué dans quoi.

@+

A la place de scanf je te conseillerais vivement fgets :

fgets(query, sizeof(query), stdin);

Quelque chose de ce genre, je n’ai pas testé. Cela a le mérite de limiter le nombre de caractère chargés en mémoire à la taille adéquate de la chaîne.

C’est un peu comme faire un printf("%u-%u", mon_octet1, mon_octetc2) sans caster les octets en 16 bits.

[quote=“thialme”]A la place de scanf je te conseillerais vivement fgets :
[/quote]
tout a fait d’accord! et comme fgets retourne NULL si il y a un probleme, on peut faire

if (NULL == fgets(query, sizeof(query), stdin)){
  eprintf("Erreur a la saisie");
  exit (1);
}

Merci thialme, je connaissais pas !

[quote=“gbx”][quote=“thialme”]A la place de scanf je te conseillerais vivement fgets :
[/quote]
tout a fait d’accord! et comme fgets retourne NULL si il y a un probleme, on peut faire

if (NULL == fgets(query, sizeof(query), stdin)){
  eprintf("Erreur a la saisie");
  exit (1);
}

Merci thialme, je connaissais pas ![/quote]

Le “NULL == fgets(query, sizeof(query)” ça sens l’habitué qui s’est déjà fait avoir par un “=” au lieu d’un “==” :smiley:

@+

Ca se voit tant que ca ? :laughing:
c’est le genre de connerie qu’on met des heures a trouver (surtout apres une certaine heure…) C’est devenu une habitude j’y fais meme plus attention :smiley: