Forum |  HardWare.fr | News | Articles | PC | S'identifier | S'inscrire | Shop Recherche
1188 connectés 

  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [PostgreSQL et C] Requête rebelle

 


 Mot :   Pseudo :  
 
Bas de page
Auteur Sujet :

[PostgreSQL et C] Requête rebelle

n°1558223
SangJun
Posté le 10-05-2007 à 16:43:32  profilanswer
 

Bonjour,
 
Je n'arrive pas à exécuter 2 requêtes, la première passe sans problème. La seconde me met un Segmentation Fault.
Quand je rentre la requête manuellement, pas de soucis, lorsque je l'ajoute par "calcul", ça ne marche plus.
 
C'est-à-dire que :
 

Code :
  1. strcpy(maRequete,"" );
  2.        strcat(maRequete,"SELECT SOURCE_ID, TARGET_ID FROM ROUTES WHERE ID = " );
  3.        sprintf(resultChar,"%f\0",result);
  4.        strcat(maRequete,resultChar);
  5.        printf("%s\n",maRequete);
  6.        res = PQexec(conn,maRequete);
  7.        printf("OK\n" );


 
Sur le terminal, j'ai comme résultat :  

Code :
  1. SELECT SOURCE_ID, TARGET_ID FROM ROUTES WHERE ID = 62500001887857.000000
  2. Erreur de segmentation


 
Tandis que si je change le code par :  

Code :
  1. strcpy(maRequete,"" );
  2.        strcat(maRequete,"SELECT SOURCE_ID, TARGET_ID FROM ROUTES WHERE ID = 62500001887857.000000" );
  3.        strcat(maRequete,resultChar);
  4.        printf("%s\n",maRequete);
  5.        res = PQexec(conn,maRequete);
  6.        printf("OK\n" );


cela m'affiche :

Code :
  1. SELECT SOURCE_ID, TARGET_ID FROM ROUTES WHERE ID = 62500001887857.000000
  2. OK


 
 
 
 
Les chaînes de caractères sont pourtant identiques  :heink:

mood
Publicité
Posté le 10-05-2007 à 16:43:32  profilanswer
 

n°1558247
AlphaZone
Posté le 10-05-2007 à 16:54:11  profilanswer
 

A mon avis, il y a des chances pour que l'erreur vienne de ta chaine de caractères maRequete ou res.

 

Tu lui as donné quelle taille ?
Tu as essayé de débugger ton programme ?


Message édité par AlphaZone le 10-05-2007 à 16:55:07
n°1558270
SangJun
Posté le 10-05-2007 à 17:02:49  profilanswer
 

J'ai mis char maRequete[250], ce que je ne saisis pas c'est que PQexec(conn,maRequete) fonctionne dans un cas mais pas dans un autre qui semble identique (conn ne change pas, maRequete semble identique).

n°1558298
Elmoricq
Modérateur
Posté le 10-05-2007 à 17:17:04  profilanswer
 

Comportement aléatoire => l'erreur se situe ailleurs. Donne-nous la fonction complète.

 

Néanmoins, plusieurs remarques :

  • je ne vois pas l'intérêt d'initialiser ta chaîne avec strcpy(), surtout avec un strcat juste après. Utilise par exemple strcpy() directement plutôt que strcat() sur la première chaîne ;
  • sprintf() ajoute tout seul un \0, inutile de lui en donner un ;
  • utilise plutôt strncpy(), strncat() et snprintf() pour ajouter des contrôles de taille. Pour les deux premières fonctions, lis attentivement les manpages car il y a des petites subtilités.


Message édité par Elmoricq le 10-05-2007 à 17:18:22
n°1558306
ZeBix
edit > preview
Posté le 10-05-2007 à 17:20:00  profilanswer
 

Est-ce que ce ne serait pas un problème de transtypage ?  
 
Je veux dire ton result est manifestement calculé en variables numériques, et tu le mets ici comme string et le problème se situe là ...

n°1558309
Elmoricq
Modérateur
Posté le 10-05-2007 à 17:21:46  profilanswer
 

ZeBix a écrit :

Est-ce que ce ne serait pas un problème de transtypage ?  
 
Je veux dire ton result est manifestement calculé en variables numériques, et tu le mets ici comme string et le problème se situe là ...


Euh, non, parce que sprintf(). [:el g]

n°1558861
SangJun
Posté le 11-05-2007 à 13:29:38  profilanswer
 

Je m'en suis sorti avec sprintf(resultChar,"%.0f",result);

n°1558864
Elmoricq
Modérateur
Posté le 11-05-2007 à 13:37:57  profilanswer
 

Non, tu as seulement une configuration qui ne déclenche pas de segfault sur ton problème de gestion mémoire. [:moule_bite]
 
Le C c'est pas magique, hein. C'est pas en touchant à des trucs au hasard que ça va fonctionner.
 
Je subodore que resultChar est une cause possible de ton problème.  
Montre ta fonction.

n°1558878
Taz
bisounours-codeur
Posté le 11-05-2007 à 13:57:50  profilanswer
 

utilise PQexecParams

 

ou prepare ExecPrepared


Message édité par Taz le 11-05-2007 à 13:59:05
n°1558917
SangJun
Posté le 11-05-2007 à 14:46:18  profilanswer
 

resultChar n'apparaît qu'en début de fonction :
 

Code :
  1. char resultChar[16]; strcpy(resultChar,"" );


 
et dans le bout de code que j'ai copié en début de topic :
 

Code :
  1. strcpy(maRequete,"" );
  2.       strcat(maRequete,"SELECT SOURCE_ID, TARGET_ID FROM ROUTES WHERE ID = " );
  3.       sprintf(resultChar,"%f\0",result);
  4.       strcat(maRequete,resultChar);
  5.       printf("%s\n",maRequete);
  6.       res = PQexec(conn,maRequete);
  7.       printf("OK\n" );

Message cité 1 fois
Message édité par SangJun le 11-05-2007 à 14:47:23
mood
Publicité
Posté le 11-05-2007 à 14:46:18  profilanswer
 

n°1558920
Elmoricq
Modérateur
Posté le 11-05-2007 à 14:50:23  profilanswer
 

SangJun a écrit :

resultChar n'apparaît qu'en début de fonction :

 
Code :
  1. char resultChar[16]; strcpy(resultChar,"" );



 

Ah, quand même !

 

Bon.
resultChar pèse 16, donc 15 caractères libres + 1 caractère terminateur.
"62500001887857.000000" mesure... 21 ! Il faut au minimum une chaîne de 22 caractères de long pour contenir ce nombre sous forme de chaînes de caractères.

 


Donc, tu as un dépassement de capacité, et tu dois empiéter sur une zone mémoire utilisée par autre chose. D'où les segmentation fault aléatoires, qui disparaissent quand tu n'utilises plus resultChar.


Message édité par Elmoricq le 11-05-2007 à 14:50:49
n°1558926
SangJun
Posté le 11-05-2007 à 14:53:51  profilanswer
 

Mais pourquoi je ne l'ai pas vu avant !!!!!
 
Désolé de vous avoir faire perdre votre temps sur quelque chose d'aussi basique.

n°1558927
SangJun
Posté le 11-05-2007 à 14:54:17  profilanswer
 

Mais pourquoi je ne l'ai pas vu avant !!!!!
 
Désolé de vous avoir faire perdre votre temps sur quelque chose d'aussi basique  :sweat:

n°1558932
Elmoricq
Modérateur
Posté le 11-05-2007 à 14:58:48  profilanswer
 

d'où l'intérêt d'utiliser des fonctions comme snprintf(), strncat(), strncpy() etc.

n°1558943
AlphaZone
Posté le 11-05-2007 à 15:09:35  profilanswer
 

Ah ! Je savais bien que c'était un problème de tableau, sauf que je n'avais pas très bien situé l'erreur [:-slash-]

n°1558944
Taz
bisounours-codeur
Posté le 11-05-2007 à 15:09:44  profilanswer
 

ouais enfin cette méthode de zouave pour faire des requêtes c'est de l'injection SQL

n°1558961
Elmoricq
Modérateur
Posté le 11-05-2007 à 15:22:12  profilanswer
 

Ouais, après c'est sûr qu'il vaut mieux composer avec les fonctions spécificiques de l'API postgresql...

n°1558994
zecrazytux
Posté le 11-05-2007 à 15:56:15  profilanswer
 

et les palce holders peuvent sauver, pour les plus grosses requetes ^^


---------------
Blog photo/récits activités en montagne http://planetcaravan.net

Aller à :
Ajouter une réponse
  FORUM HardWare.fr
  Programmation
  SQL/NoSQL

  [PostgreSQL et C] Requête rebelle

 

Sujets relatifs
[Résolu][Débutant C#] - Requete SQLQuelle requête est la plus rapide?
Exporter une base MySQL vers PostgreSQLAide creation requete oracle
problème de requete sqlproblème de requete en fonction de l'url de la page
[MySQL] Requête avec jointure qui fonctionne pas avec MySQL5 Savoir si requete bien executée + prob CDO
Requête préparée en insert et colonne "not null"Afficher le résultat d'une requête mysql sous forme d'hyperlien
Plus de sujets relatifs à : [PostgreSQL et C] Requête rebelle


Copyright © 1997-2022 Hardware.fr SARL (Signaler un contenu illicite / Données personnelles) / Groupe LDLC / Shop HFR