Contenu | Rechercher | Menus

Annonce

Si vous rencontrez des soucis à rester connecté sur le forum (ou si vous avez perdu votre mot de passe) déconnectez-vous et reconnectez-vous depuis cette page, en cochant la case "Me connecter automatiquement lors de mes prochaines visites".
Test de l'ISO d'Ubuntu francophone : nous avons besoin de testeurs pour la version francophone d'Ubuntu 14.04. Liens et informations ici.

Attention, une faille de sécurité dans bash a récemment été rapportée, il est recommandé de mettre à jour son système (plus de détails)

#1 Le 26/02/2013, à 18:48

mauribilis

code C connection à mysql

j'ai écris un code qui se connecte à une bdd pour aller récupérer une valeur, l'afficher puis l'envoyer par mail :

#include <mysql.h>
#include <stdio.h>

main() {
  MYSQL *conn;
  MYSQL_RES *res;
  MYSQL_ROW row;

  char *server = "localhost";
  char *user = "root";
 
  char *password = "mot_de_passe";
  char *database = "composant";

  conn = mysql_init(NULL);

  
  if (!mysql_real_connect(conn, server,
        user, password, database, 0, NULL, 0)) {
      fprintf(stderr, "%s\n", mysql_error(conn));

  }

  
  if (mysql_query(conn, "SELECT temperature FROM processeur WHERE id LIKE '1'")) {
      fprintf(stderr, "%s\n", mysql_error(conn));

  }

  res = mysql_use_result(conn);

  
  printf("Temperature :\n");
  while ((row = mysql_fetch_row(res)) != NULL)
  printf("%s °C\n", row[0]);

char s_Mail[] = "echo row[0] | mail -s \"Rapport Journalier du système\" destinataire@domaine.com -- -f expediteur@domaine.com";
        system(s_Mail);
 
  mysql_free_result(res);
  mysql_close(conn);
}

 

la partie connexion bdd + récupération + affichage, marche mais lors de l'envoie par mail la fonction row[0] qui est censée contenir la valeur récupérée dans la bdd est affichée en claire dans le mail, (ce n'es pas la température qui s'affiche dans le mail mais "row[0]") .
Cela doit être dû à un problème de variable, pouvez vous m'aider ?

merci d'avance

Hors ligne

#2 Le 26/02/2013, à 18:50

Maisondouf

Re : code C connection à mysql

Je n'emploie pas la syntaxe du langage C parce je ne m'en rappelle plus.
mais cela devrait te mettre sur la voie.

char s_Mail[] = "echo "+row[0]+" | mail -s \"Rapport Journalier du système\" destinataire@domaine.com -- -f expediteur@domaine.com";

ASUS M5A88-v EVO avec AMD FX(tm)-8120 Eight-Core Processor,  OS principal Precise 12.04.1 LTS 63bits½
Bricoleur, menteur, inculte, inadapté social et mythomane, enfin d'après certains....
"the secret of my form is summed up in two words, no sport" (Winston Churchill)

Hors ligne

#3 Le 26/02/2013, à 19:37

mauribilis

Re : code C connection à mysql

désolé ça ne me parle pas

Hors ligne

#4 Le 26/02/2013, à 20:09

Maisondouf

Re : code C connection à mysql

C'est simple, dans ta ligne, tu rempli ta variable avec une string contenant les caractères row[0], c'est normal que tu le retrouve dans le mail.
Il faut que tu concatènes les strings entre elles avec le contenu de row[0].


ASUS M5A88-v EVO avec AMD FX(tm)-8120 Eight-Core Processor,  OS principal Precise 12.04.1 LTS 63bits½
Bricoleur, menteur, inculte, inadapté social et mythomane, enfin d'après certains....
"the secret of my form is summed up in two words, no sport" (Winston Churchill)

Hors ligne

#5 Le 26/02/2013, à 21:12

mauribilis

Re : code C connection à mysql

#include <mysql.h>
#include <stdio.h>

main() {
  MYSQL *conn;
  MYSQL_RES *res;
  MYSQL_ROW row;

  char *server = "localhost";
  char *user = "root";
 
  char *password = "mot_de_passe";
  char *database = "composant";

  conn = mysql_init(NULL);

  
  if (!mysql_real_connect(conn, server,
        user, password, database, 0, NULL, 0)) {
      fprintf(stderr, "%s\n", mysql_error(conn));

  }

  
  if (mysql_query(conn, "SELECT temperature FROM processeur WHERE id LIKE '1'")) {
      fprintf(stderr, "%s\n", mysql_error(conn));

  }

  res = mysql_use_result(conn);

  
  printf("Temperature :\n");
  while ((row = mysql_fetch_row(res)) != NULL)
  printf("%s °C\n", row[0]);

char s_Mail[] = "echo "+row[0]+" | mail -s \"Rapport Journalier du système\" destinataire@domaine.com -- -f expediteur@domaine.com";
        system(s_Mail);
 
  mysql_free_result(res);
  mysql_close(conn);
}

test_mysql.c: In function ‘main’:
test_mysql.c:38:24: erreur: invalid operands to binary + (have ‘char *’ and ‘char *’)

Hors ligne

#6 Le 26/02/2013, à 21:43

:!pakman

Re : code C connection à mysql

Si c'est en C, c'est normal, tu tentes en faite d'additionner des pointeurs il me semble.
Tu dois avoir des fonctions pour manipuler des chaines, pour pouvoir concaténer plusieurs chaines ensembles.


...

Hors ligne

#7 Le 26/02/2013, à 21:55

mauribilis

Re : code C connection à mysql

justement je cherche une fonction mais je ne n'es pas souvenir et je ne trouve das les livres ni sur google si quelqu'un sait, je suis preneur  big_smile

Hors ligne

#8 Le 26/02/2013, à 22:00

grim7reaper

Re : code C connection à mysql

Salut,

Un coup de man et ça repart wink

Hors ligne

#9 Le 26/02/2013, à 23:00

mauribilis

Re : code C connection à mysql

merci de ton aide grim7reaper mais je ne vois pas comment adapter ça à mon code pourrais tu m'aider

Hors ligne

#10 Le 26/02/2013, à 23:16

:!pakman

Re : code C connection à mysql

Tu auras surement des exemples sur cette page (site du zero, chaines de caractères en C).

Dernière modification par :!pakman (Le 26/02/2013, à 23:16)


...

Hors ligne

#11 Le 26/02/2013, à 23:27

mauribilis

Re : code C connection à mysql

#include <mysql.h>
#include <stdio.h>

main() {
  MYSQL *conn;
  MYSQL_RES *res;
  MYSQL_ROW row;

  char *server = "localhost";
  char *user = "root";
 
  char *password = "mot_de_passe";
  char *database = "composant";

  conn = mysql_init(NULL);

  
  if (!mysql_real_connect(conn, server,
        user, password, database, 0, NULL, 0)) {
      fprintf(stderr, "%s\n", mysql_error(conn));

  }

  
  if (mysql_query(conn, "SELECT temperature FROM processeur WHERE id LIKE '1'")) {
      fprintf(stderr, "%s\n", mysql_error(conn));

  }

  res = mysql_use_result(conn);

  
  printf("Temperature :\n");
  while ((row = mysql_fetch_row(res)) != NULL)
  printf("%s °C\n", row[0]);

char s_Mail[] = "echo %d | mail -s \"Rapport Journalier du système\" destinataire@domaine.com -- -f expediteur@domaine.com", row[0];
        system(s_Mail);
 
  mysql_free_result(res);
  mysql_close(conn);
}

test_mysql.c: In function ‘main’:
test_mysql.c:38:1: erreur: initialisation invalide

Hors ligne

#12 Le 26/02/2013, à 23:34

Maisondouf

Re : code C connection à mysql

regardes la fct sprintf


ASUS M5A88-v EVO avec AMD FX(tm)-8120 Eight-Core Processor,  OS principal Precise 12.04.1 LTS 63bits½
Bricoleur, menteur, inculte, inadapté social et mythomane, enfin d'après certains....
"the secret of my form is summed up in two words, no sport" (Winston Churchill)

Hors ligne

#13 Le 27/02/2013, à 00:21

:!pakman

Re : code C connection à mysql

En regardant ça à l'arrache, ta ligne avec char s_Mail[] = "echo ..., vers la toute fin, est invalide.

Tu sépare 2 éléments avec une virgule, ça ne veut rien dire.
Pour concaténer, il faut appeler la fonction, je crois que c'est ce que tu as oublié de faire, en fait tu passes des paramètres en les séparant avec une virgule sans appeler la fonction j'ai l'impression...

Dernière modification par :!pakman (Le 27/02/2013, à 00:22)


...

Hors ligne

#14 Le 27/02/2013, à 00:24

mauribilis

Re : code C connection à mysql

#include <mysql.h>
#include <stdio.h>
#include <string.h>
main() {
  MYSQL *conn;
  MYSQL_RES *res;
  MYSQL_ROW row;

  char *server = "localhost";
  char *user = "root";
  char *password = ""; 
  char *database = "composant_live";
    char variable[256];  
  conn = mysql_init(NULL);


  if (!mysql_real_connect(conn, server,
        user, password, database, 0, NULL, 0)) {
      fprintf(stderr, "%s\n", mysql_error(conn));

  }


  if (mysql_query(conn, "SELECT temperature_eau_sortante FROM capteurs_solaire WHERE id LIKE '1'")) {
      fprintf(stderr, "%s\n", mysql_error(conn));

  }

  res = mysql_use_result(conn);


  printf("Temperature de l\'eau sortante des panneaux solaires :\n");
  while ((row = mysql_fetch_row(res)) != NULL)
  printf("%s °C\n", row[0]);


   sprintf(variable, "echo %s mail -s \"Rapport Journalier du système\" expediteur@domaine.com -- -f destinataire@domaine.com", row[0]);  
       system(variable);

  mysql_free_result(res);
  mysql_close(conn);
}

Erreur de segmentation (core dumped)

Hors ligne

#15 Le 27/02/2013, à 00:44

Maisondouf

Re : code C connection à mysql

Tentes le cast.... sprintf ne sait pas quoi faire d'une variable MYSQL_ROW.

sprintf(variable, "echo %s mail -s \"Rapport Journalier du système\" expediteur@domaine.com -- -f destinataire@domaine.com", (string)(row[0]) );

ASUS M5A88-v EVO avec AMD FX(tm)-8120 Eight-Core Processor,  OS principal Precise 12.04.1 LTS 63bits½
Bricoleur, menteur, inculte, inadapté social et mythomane, enfin d'après certains....
"the secret of my form is summed up in two words, no sport" (Winston Churchill)

Hors ligne

#16 Le 27/02/2013, à 09:28

pingouinux

Re : code C connection à mysql

Bonjour,
Pour aller dans le même sens que Maisondouf #15, voici un peu de doc : C API Data Structures, dont voici un extrait :

MYSQL_ROW

This is a type-safe representation of one row of data. It is currently implemented as an array of counted byte strings. (You cannot treat these as null-terminated strings if field values may contain binary data, because such values may contain null bytes internally.) Rows are obtained by calling mysql_fetch_row().

Hors ligne

#17 Le 27/02/2013, à 11:21

mauribilis

Re : code C connection à mysql

#include <mysql.h>
#include <stdio.h>
#include <string.h>
main() {
  MYSQL *conn;
  MYSQL_RES *res;
  MYSQL_ROW row;

  char *server = "localhost";
  char *user = "root";
  char *password = ""; 
  char *database = "composant_live";
    char variable[256];  
  conn = mysql_init(NULL);


  if (!mysql_real_connect(conn, server,
        user, password, database, 0, NULL, 0)) {
      fprintf(stderr, "%s\n", mysql_error(conn));

  }


  if (mysql_query(conn, "SELECT temperature_eau_sortante FROM capteurs_solaire WHERE id LIKE '1'")) {
      fprintf(stderr, "%s\n", mysql_error(conn));

  }

  res = mysql_use_result(conn);


  printf("Temperature de l\'eau sortante des panneaux solaires :\n");
  while ((row = mysql_fetch_row(res)) != NULL)
  printf("%s °C\n", row[0]);


sprintf(variable, "echo %s mail -s \"Rapport Journalier du système\" expediteur@domaine.com -- -f destinataire@domaine.com", (string)(row[0]) );
       system(variable);

  mysql_free_result(res);
  mysql_close(conn);
}

test_mysql.c: In function ‘main’:
test_mysql.c:39:127: erreur: ‘string’ undeclared (first use in this function)
test_mysql.c:39:127: note: each undeclared identifier is reported only once for each function it appears in

Hors ligne

#18 Le 27/02/2013, à 20:09

Maisondouf

Re : code C connection à mysql

si il ne connaît pas 'string' mets 'char *' à la place...


ASUS M5A88-v EVO avec AMD FX(tm)-8120 Eight-Core Processor,  OS principal Precise 12.04.1 LTS 63bits½
Bricoleur, menteur, inculte, inadapté social et mythomane, enfin d'après certains....
"the secret of my form is summed up in two words, no sport" (Winston Churchill)

Hors ligne

#19 Le 27/02/2013, à 21:43

mauribilis

Re : code C connection à mysql

#include <mysql.h>
#include <stdio.h>
#include <string.h>
main() {
  MYSQL *conn;
  MYSQL_RES *res;
  MYSQL_ROW row;

  char *server = "localhost";
  char *user = "root";
  char *password = ""; 
  char *database = "composant_live";
    char variable[256];  
  conn = mysql_init(NULL);


  if (!mysql_real_connect(conn, server,
        user, password, database, 0, NULL, 0)) {
      fprintf(stderr, "%s\n", mysql_error(conn));

  }


  if (mysql_query(conn, "SELECT temperature_eau_sortante FROM capteurs_solaire WHERE id LIKE '1'")) {
      fprintf(stderr, "%s\n", mysql_error(conn));

  }

  res = mysql_use_result(conn);


  printf("Temperature de l\'eau sortante des panneaux solaires :\n");
  while ((row = mysql_fetch_row(res)) != NULL)
  printf("%s °C\n", row[0]);


sprintf(variable, "echo %s mail -s \"Rapport Journalier du système\" expediteur@domaine.com -- -f destinataire@domaine.com", (char *)(row[0]) );
       system(variable);

  mysql_free_result(res);
  mysql_close(conn);
}


Erreur de segmentation (core dumped)

Hors ligne

#20 Le 27/02/2013, à 21:53

Braun

Re : code C connection à mysql

Bonsoir,
Le message

Erreur de segmentation (core dumped)

apparaît il lors de la compilation ou à l'exécution?
Dans ce dernier cas cela semblerait logique, ton tableau row[0] n'est pas une chaîne et ne possède donc pas de délimiteur de fin.

En ligne

#21 Le 27/02/2013, à 22:29

Maisondouf

Re : code C connection à mysql

C'est ce que disait pingouinux, pas de zero à la fin....
Mais on ne sait même pas ce qu'il est censé récupérer de son mysql_fetch_row et quel est le type du champ 0 dans sa base.
On propose des truc mais sans avoir les infos essentielles, basta...


ASUS M5A88-v EVO avec AMD FX(tm)-8120 Eight-Core Processor,  OS principal Precise 12.04.1 LTS 63bits½
Bricoleur, menteur, inculte, inadapté social et mythomane, enfin d'après certains....
"the secret of my form is summed up in two words, no sport" (Winston Churchill)

Hors ligne

#22 Le 03/03/2013, à 23:42

Braun

Re : code C connection à mysql

Bonsoir,
En l'absence de précision sur ta structure de donnée, il me semble déceler un horrible détail:
A la sortie de ta boucle while le contenu de la variable row est toujours NULL ce qui ne peut qu'amener divers inconvénients.
Sans revenir sur le reste du programme je déclarerais un petit tampon, buffer dans lequel je stockerais la chaîne de caractère utile avant qu'il ne soit trop tard.

  char buffer[255];
.................
.................
  while ((row = mysql_fetch_row(res)) != NULL) {
    strcpy(buffer, row[0]); 
    printf("%s °C\n", buffer);
  } 

Libre à toi d'utiliser la chaîne du tampon à ta guise.
Je ne pense pas que ce soit la meilleure solution, mais il faudrait une vue plus globale du programme.

En ligne

Haut de page ↑