Enregistrer une clé étrangere dans une BD MySQL

Bonjour a tous,

Je cherche comment insérer ma clé étrangère avec la clé primaire de la table qui a été insérer juste avant.
Étant novice en SQL et de plus avec un esp8266.

 sprintf(insert_Sql_4, "INSERT INTO u984373661_prem_db.SensDate (annee,mois,jour,heure,minute) VALUES (%s,%s,%s,%s,%s)", ptm->tm_year + 1900,ptm->tm_mon + 1,weekDays[timeClient.getDay()],timeClient.getHours(), timeClient.getMinutes());
  sprintf(insert_Sql_5, "INSERT INTO u984373661_prem_db.SensTemp (temp_ext,temp_int,temp_cave,id_date) VALUES (%s,%s,%s,%s)", tab_var[0], tab_var[3], tab_var[5], "clé étrangère");

Je cherche donc a récupérer la dernière insertion du champs id_date de ma table SensDate, pour la récupérer et l'insérer dans mon champs id_date (foreignkey) de ma table SensTemp.

Je pense qu'il va falloir utiliser la commande SELECT, mais je ne sais pas comment.

j’espère avoir été clair et si un pro du SQL est dans le coin, merci d'avance

Salut.
Avec LAST_INSERT_ID().

J'ai essayé, mais la requête ne trouve rien:
j'ai changé de table de recherche entre le premier message et celui ci.

sprintf(insert_Sql_8, "SELECT Id FROM u984373661_prem_db.SensorData WHERE id=LAST_INSERT_ID()");

Serial.println(insert_Sql_8);

Message dans le moniteur serie:

SELECT Id FROM u984373661_prem_db.SensorData WHERE id=LAST_INSERT_ID()
Error: 24 = Query was empty.

Image de la table sur PHPMy admin:

Cette commande fonctionne sur PHPMyadmin, mais comment je peux faire pour récupérer la valeur dans une variable

SELECT Id FROM u984373661_prem_db.SensorData WHERE id= (select max(Id) from u984373661_prem_db.SensorData)

j'ai réussi a récupérer mon id dans une variable, mais je dois dire que je ne comprend pas ce que j'ai fiat et n'y pourquoi ça fonctionne, donc si quelqu'un peux m'expliquer le fonctionnement, je le remercie d'avance.

Mon code avec ce que j'ai vu avec les exemple de la librairie:

sprintf(insert_Sql_8, "SELECT Id FROM u984373661_prem_db.SensorData WHERE id= (select max(Id) from u984373661_prem_db.SensorData)");
 long monId = 0;
  row_values *row = NULL;
  MySQL_Cursor *cur_mem = new MySQL_Cursor(&conn);
  cur_mem->execute(insert_Sql_8);
  column_names *columns = cur_mem->get_columns();
  do {
    row = cur_mem->get_next_row();
    if (row != NULL) {
      monId = atol(row->values[0]);
    }
  } while (row != NULL);
  Serial.println(monId);

Tu as récupérer l'identifiant max de la table SensorData, que tu as utilisé pour sélectionner tout les enregistrements ayant cet identifiant.
En gros tu as déjà déterminé l'identifiant que tu cherche avec le "select max(Id)", le premier "select" ne sert à rien.

Sinon tu fais simplement la requête que ta proposé @hbachetti et tu évite de faire une requête qui parcours tous les enregistrements.

Bonjour et merci terwal,
OK, je vais réessayer, donc apparemment je me suis beaucoup trop compliqué l'esprit.

Bon j'ai besoin d'un coup de main pour utiliser LAST_INSERT_ID()

J'ai essayé quelque chose comme ça mais évidemment ça ne donne rien.

sprintf(insert_Sql_12,"LAST_INSERT_ID()");
cur_mem->execute(insert_Sql_12);
  Serial.println(cur_mem);

Comment peut on arriver à récupérer la valeur de LAST_INSERT_ID() dans une variable

tu as essayé "SELECT LAST_INSERT_ID();" ?

Je suis certainement un boulet, mais toujours rien.

J'ai tenté differente chose dont ça en dessous , mais rien ne fonctionne, ma variable cur_mem est apparement un objet MySQL_Cursor, mais je ne comprend pas comment je peux ressortir la valeur de ma requete SQL dans une variable de type String char[] ou int.

 char monId2[24];
sprintf(monId2,"SELECT LAST_INSERT_ID()");
cur_mem->execute(monId2);
  Serial.println(cur_mem);

erreur correspondante:

G:\System\Arduino\ESP8266\BME280_BD\Projet_Capteur_THP\BME_280_BD_1\BME_280_BD_1.ino: In function 'void prepaSQL()':
BME_280_BD_1:388:25: error: no matching function for call to 'println(MySQL_Cursor*&)'
  388 |   Serial.println(cur_mem);
      |                         ^
In file included from C:\Users\treza\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.0.2\cores\esp8266/Stream.h:27,
                 from C:\Users\treza\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.0.2\cores\esp8266/HardwareSerial.h:32,
                 from C:\Users\treza\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.0.2\cores\esp8266/Arduino.h:288,
                 from G:\System\Arduino\ESP8266\BME280_BD\Projet_Capteur_THP\BME_280_BD_1\BME_280_BD_1.ino:10:
C:\Users\treza\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.0.2\cores\esp8266/Print.h:101:16: note: candidate: 'size_t Print::println(char)' (near match)
  101 |         size_t println(char);
      |                ^~~~~~~
C:\Users\treza\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.0.2\cores\esp8266/Print.h:101:16: note:   conversion of argument 1 would be ill-formed:
BME_280_BD_1:388:18: error: invalid conversion from 'MySQL_Cursor*' to 'char' [-fpermissive]
  388 |   Serial.println(cur_mem);
      |                  ^~~~~~~
      |                  |
      |                  MySQL_Cursor*
In file included from C:\Users\treza\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.0.2\cores\esp8266/Stream.h:27,
                 from C:\Users\treza\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.0.2\cores\esp8266/HardwareSerial.h:32,
                 from C:\Users\treza\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.0.2\cores\esp8266/Arduino.h:288,
                 from G:\System\Arduino\ESP8266\BME280_BD\Projet_Capteur_THP\BME_280_BD_1\BME_280_BD_1.ino:10:
C:\Users\treza\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.0.2\cores\esp8266/Print.h:102:16: note: candidate: 'size_t Print::println(unsigned char, int)' (near match)
  102 |         size_t println(unsigned char, int = DEC);
      |                ^~~~~~~
C:\Users\treza\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.0.2\cores\esp8266/Print.h:102:16: note:   conversion of argument 1 would be ill-formed:
BME_280_BD_1:388:18: error: invalid conversion from 'MySQL_Cursor*' to 'unsigned char' [-fpermissive]
  388 |   Serial.println(cur_mem);
      |                  ^~~~~~~
      |                  |
      |                  MySQL_Cursor*
In file included from C:\Users\treza\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.0.2\cores\esp8266/Stream.h:27,
                 from C:\Users\treza\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.0.2\cores\esp8266/HardwareSerial.h:32,
                 from C:\Users\treza\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.0.2\cores\esp8266/Arduino.h:288,
                 from G:\System\Arduino\ESP8266\BME280_BD\Projet_Capteur_THP\BME_280_BD_1\BME_280_BD_1.ino:10:
C:\Users\treza\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.0.2\cores\esp8266/Print.h:103:16: note: candidate: 'size_t Print::println(int, int)' (near match)
  103 |         size_t println(int, int = DEC);
      |                ^~~~~~~
C:\Users\treza\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.0.2\cores\esp8266/Print.h:103:16: note:   conversion of argument 1 would be ill-formed:
BME_280_BD_1:388:18: error: invalid conversion from 'MySQL_Cursor*' to 'int' [-fpermissive]
  388 |   Serial.println(cur_mem);
      |                  ^~~~~~~
      |                  |
      |                  MySQL_Cursor*
In file included from C:\Users\treza\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.0.2\cores\esp8266/Stream.h:27,
                 from C:\Users\treza\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.0.2\cores\esp8266/HardwareSerial.h:32,
                 from C:\Users\treza\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.0.2\cores\esp8266/Arduino.h:288,
                 from G:\System\Arduino\ESP8266\BME280_BD\Projet_Capteur_THP\BME_280_BD_1\BME_280_BD_1.ino:10:
C:\Users\treza\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.0.2\cores\esp8266/Print.h:104:16: note: candidate: 'size_t Print::println(unsigned int, int)' (near match)
  104 |         size_t println(unsigned int, int = DEC);
      |                ^~~~~~~
C:\Users\treza\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.0.2\cores\esp8266/Print.h:104:16: note:   conversion of argument 1 would be ill-formed:
BME_280_BD_1:388:18: error: invalid conversion from 'MySQL_Cursor*' to 'unsigned int' [-fpermissive]
  388 |   Serial.println(cur_mem);
      |                  ^~~~~~~
      |                  |
      |                  MySQL_Cursor*
In file included from C:\Users\treza\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.0.2\cores\esp8266/Stream.h:27,
                 from C:\Users\treza\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.0.2\cores\esp8266/HardwareSerial.h:32,
                 from C:\Users\treza\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.0.2\cores\esp8266/Arduino.h:288,
                 from G:\System\Arduino\ESP8266\BME280_BD\Projet_Capteur_THP\BME_280_BD_1\BME_280_BD_1.ino:10:
C:\Users\treza\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.0.2\cores\esp8266/Print.h:105:16: note: candidate: 'size_t Print::println(long int, int)' (near match)
  105 |         size_t println(long, int = DEC);
      |                ^~~~~~~
C:\Users\treza\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.0.2\cores\esp8266/Print.h:105:16: note:   conversion of argument 1 would be ill-formed:
BME_280_BD_1:388:18: error: invalid conversion from 'MySQL_Cursor*' to 'long int' [-fpermissive]
  388 |   Serial.println(cur_mem);
      |                  ^~~~~~~
      |                  |
      |                  MySQL_Cursor*
In file included from C:\Users\treza\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.0.2\cores\esp8266/Stream.h:27,
                 from C:\Users\treza\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.0.2\cores\esp8266/HardwareSerial.h:32,
                 from C:\Users\treza\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.0.2\cores\esp8266/Arduino.h:288,
                 from G:\System\Arduino\ESP8266\BME280_BD\Projet_Capteur_THP\BME_280_BD_1\BME_280_BD_1.ino:10:
C:\Users\treza\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.0.2\cores\esp8266/Print.h:106:16: note: candidate: 'size_t Print::println(long unsigned int, int)' (near match)
  106 |         size_t println(unsigned long, int = DEC);
      |                ^~~~~~~
C:\Users\treza\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.0.2\cores\esp8266/Print.h:106:16: note:   conversion of argument 1 would be ill-formed:
BME_280_BD_1:388:18: error: invalid conversion from 'MySQL_Cursor*' to 'long unsigned int' [-fpermissive]
  388 |   Serial.println(cur_mem);
      |                  ^~~~~~~
      |                  |
      |                  MySQL_Cursor*
In file included from C:\Users\treza\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.0.2\cores\esp8266/Stream.h:27,
                 from C:\Users\treza\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.0.2\cores\esp8266/HardwareSerial.h:32,
                 from C:\Users\treza\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.0.2\cores\esp8266/Arduino.h:288,
                 from G:\System\Arduino\ESP8266\BME280_BD\Projet_Capteur_THP\BME_280_BD_1\BME_280_BD_1.ino:10:
C:\Users\treza\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.0.2\cores\esp8266/Print.h:107:16: note: candidate: 'size_t Print::println(long long int, int)' (near match)
  107 |         size_t println(long long, int = DEC);
      |                ^~~~~~~
C:\Users\treza\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.0.2\cores\esp8266/Print.h:107:16: note:   conversion of argument 1 would be ill-formed:
BME_280_BD_1:388:18: error: invalid conversion from 'MySQL_Cursor*' to 'long long int' [-fpermissive]
  388 |   Serial.println(cur_mem);
      |                  ^~~~~~~
      |                  |
      |                  MySQL_Cursor*
In file included from C:\Users\treza\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.0.2\cores\esp8266/Stream.h:27,
                 from C:\Users\treza\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.0.2\cores\esp8266/HardwareSerial.h:32,
                 from C:\Users\treza\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.0.2\cores\esp8266/Arduino.h:288,
                 from G:\System\Arduino\ESP8266\BME280_BD\Projet_Capteur_THP\BME_280_BD_1\BME_280_BD_1.ino:10:
C:\Users\treza\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.0.2\cores\esp8266/Print.h:108:16: note: candidate: 'size_t Print::println(long long unsigned int, int)' (near match)
  108 |         size_t println(unsigned long long, int = DEC);
      |                ^~~~~~~
C:\Users\treza\AppData\Local\Arduino15\packages\esp8266\hardware\esp8266\3.0.2\cores\esp8266/Print.h:108:16: note:   conversion of argument 1 would be ill-formed:
BME_280_BD_1:388:18: error: invalid conversion from 'MySQL_Cursor*' to 'long long unsigned int' [-fpermissive]
  388 |   Serial.println(cur_mem);
      |                  ^~~~~~~
      |                  |
      |                  MySQL_Cursor*
Multiple libraries were found for "DHT.h"
 Used: G:\System\Arduino\libraries\DHT-sensor-library-master
 Not used: G:\System\Arduino\libraries\DHT_sensor_library
 Not used: G:\System\Arduino\libraries\DHT_sensor_library-1.3.7
Multiple libraries were found for "Adafruit_I2CDevice.h"
 Used: G:\System\Arduino\libraries\Adafruit_BusIO
 Not used: G:\System\Arduino\libraries\Adafruit_BusIO-master
exit status 1
no matching function for call to 'println(MySQL_Cursor*&)'

Oui, c'est un "Cursor", pas que tu es un boulet :slight_smile:
ta variable est donc un objet qui représente la sélection que tu as fait, c'est à dire un tableau d'enregistrement, un enregistrement étant lui même un tableau de colonne.
Dans ton cas, tu devrais avoir un tableau d'un enregistrement, contenant une colonne.

Du coup ton d'objet ne représente pas une valeur qui peut être automatiquement convertit en chaine de caractères, afin d'être afficher par un "print".

Le plus simple dans ce genre de cas est de regarder les exemples fournis avec ta librairie et de lire la documentation, le plus souvent la manière d'accéder aux informations est assez clairement expliqué.
Tu as un exemple ici, si c'est bien la librairie que tu utilise.

du coup comme tu as un tableau(ou une liste) d'enregistrement, au début tu n'est pas positionné sur le premier, il faut utiliser la fonction "get_next_row" pour parcourir le tableau.
Cette fonction te renvois un tableau de valeur(de type row_values, structure simpliste contenant une chaine de caractère)

Il faudrait faire un truc du genre, je n'ai pas testé le code et écris directement:

cur_mem->execute("SELECT LAST_INSERT_ID();");
row_values *row = cur_mem->get_next_row();
if (row != NULL) {
    Serial.println(row->values[0]);
 } else {
    Serial.println("L'enregistrement est vide, bizarre!");
}

Merci terwal,

je n'ai pas réussi a ouvrir le lien "ici" que tu avais mis dans ton message précédent, il apparait comme un lien, mais ne vas nul part.

J'ai testé ton code, mais j'ai ce résultat:

ERROR: You must read the columns first!
L'enregistrement est vide, bizarre!

Du coup j'ai essayé ça, mais cette ligne Serial.println(row->values[0]); me renvoie "0", mais ce n'est pas la bonne valeur

cur_mem->execute("SELECT LAST_INSERT_ID();");
column_names *columns = cur_mem->get_columns();
row_values *row = cur_mem->get_next_row();
if (row != NULL) {
    Serial.println(row->values[0]);
 } else {
    Serial.println("L'enregistrement est vide, bizarre!");
}

Cette requête récupère un seul enregistrement contenant une seule colonne (SELECT Id) correspondant au Id maximal dans la table (max(Id)). Si elle fonctionne, pourquoi pas ?

Si SELECT LAST_INSERT_ID() ne fonctionne pas, c'est probablement que tu n'a pas fait d'INSERT auparavant, je suppose.

Merci hbachetti,

Oui la commande avec MAX(), fonctionne mais alourdi mon code, surtout quelle va se répéter plusieurs fois, utiliser celle que tu m'as proposé est beaucoup plus souple et légère.

voici mon code avec INSERT INTO juste au dessus de la commande LAST_INSERT_ID() et ma table comprend bien ça première colonne avec un "autoincremente".

sprintf(insert_Sql_11, "INSERT INTO u984373661_prem_db.SensCave (temp_cave,humid_cave,id_date,id_lieu) VALUES (%s,%s,%d,'3')", tab_var[5], tab_var[6], monId);
  cur_mem1->execute("SELECT LAST_INSERT_ID();");
  columns = cur_mem1->get_columns();
  row = cur_mem1->get_next_row();
  if (row != NULL) {
    Serial.println("2-----------------------");
    Serial.println(atol(row->values[0]));
    Serial.println("2-----------------------");
  } else {
    Serial.println("L'enregistrement est vide, bizarre!");
  }
  Serial.println("1-----------------------");

et voici le résultat dans le moniteur qui est "0" et devrait être "73":

2-----------------------
0
2-----------------------
1-----------------------

De ce que je vois, insert_Sql_11 est formaté, mais n'est pas exécuté.

Comme le dis @hbachetti tu n'a pas inséré le code que je t'ai donné au bon endroit.
Il ne remplace pas l'exécution de l'insert, mais vient après pour connaitre l'ID insére, si l'execute du insert à renvoyé vrai.

Ok hbachetti et terwal, je comprend ce que vous me dite, mais la commande avec MAX() fonctionne, même avant l’exécution et donc je croyais que c'était pareil avec LAST_INSERT_ID().
Le soucis est que je faisais tout mes insert avant de faire toute mes exécutions pour ne pas trop multiplier mes lignes de codes.
Mais si c'est une obligation il va falloir que je retravaille la structure de mon code ou utiliser MAX()

Ok merci a vous deux je pense que je connais beaucoup mieux cette commande maintenant je viens de tester ce code et ça fonctionne correctement:

cursor->execute(insert_Sql_11);
  row_values *row = NULL;
   MySQL_Cursor *cur_mem1 = new MySQL_Cursor(&conn);
  cur_mem1->execute("SELECT LAST_INSERT_ID();");
  column_names *columns = cur_mem1->get_columns();
  row = cur_mem1->get_next_row();
  if (row != NULL) {
    Serial.println("2-----------------------");
    Serial.println(atol(row->values[0]));
    Serial.println("2-----------------------");
  } else {
    Serial.println("L'enregistrement est vide, bizarre!");
  }
  Serial.println("1-----------------------");

  Serial.println("OK---------------.");

Résultat dans le moniteur:

2-----------------------
44
2-----------------------
1-----------------------

Oui ton code pour récupérer l'identifiant du dernier enregistrement inséré est bon.
Tu dois mettre ce code juste après une(ou plusieurs) insertion d'enregistrement dans la table qui t'intéresse.

Par contre ton code avec la fonction SQL "MAX", te donnera la valeur du dernier enregistrement d'une table quelconque, notamment si celle-ci n'est pas la même table que celle utilisée dans ton dernier "INSERT".

N'hésite pas à poster tout ton code, si tu vois que tu as encore de soucis.

Oui j'ai eu encore des soucis, ça fonctionnait bien avec la première requête LAST_INSERT_ID(), mais avec les suivantes ça buguait et je n'ai pas trouvé pourquoi.
Donc j'ai repris MAX(), et là tout fonctionne correctement, mais je voulais créer une fonction pour alléger mon code et je butte sur une déclaration de type de parametre.

Voici le code sans fonction:


long monId = 0;
long monId2 = 0;
long monId3 = 0;
long monId4 = 0;
  time_t epochTime = timeClient.getEpochTime();
  struct tm *ptm = gmtime ((time_t *)&epochTime);
  sprintf(insert_Sql_1, "INSERT INTO u984373661_prem_db.SensorData (Capteur,Location,Temp,Humid,Press) VALUES ('BME280','Extérieur',%s,%s,%s)", tab_var[0], tab_var[1], tab_var[2]);
  sprintf(insert_Sql_2, "INSERT INTO u984373661_prem_db.SensorData (Capteur,Location,Temp,Humid,Press) VALUES ('DHT11','Intérieur',%s,%s,'0')", tab_var[3], tab_var[4]);
  sprintf(insert_Sql_3, "INSERT INTO u984373661_prem_db.SensorData (Capteur,Location,Temp,Humid,Press) VALUES ('SHT31','Cave',%s,%s,'0')", tab_var[5], tab_var[6]);
  sprintf(insert_Sql_4, "INSERT INTO u984373661_prem_db.SensDate (annee,mois,jour,heure,minute) VALUES (%d,%d,%d,%d,%d)", ptm->tm_year + 1900, ptm->tm_mon + 1, ptm->tm_mday, timeClient.getHours(), timeClient.getMinutes());
  
  cursor->execute(insert_Sql_1);
  cursor->execute(insert_Sql_2);
  cursor->execute(insert_Sql_3);
  cursor->execute(insert_Sql_4);
   sprintf(insert_Sql_8, "SELECT id_date FROM u984373661_prem_db.SensDate WHERE id_date= (select max(id_date) from u984373661_prem_db.SensDate)");
//-----------------------------------
 row_values *row = NULL;
  MySQL_Cursor *cur_mem = new MySQL_Cursor(&conn);
  cur_mem->execute(insert_Sql_8);
  column_names *columns = cur_mem->get_columns();
  do {
    row = cur_mem->get_next_row();
    if (row != NULL) {
      monId = atol(row->values[0]);
    }
  } while (row != NULL);
monId=recup_id(insert_Sql_8
  Serial.println(recup_id(insert_Sql_8));
 //--------------------------------------------------
   sprintf(insert_Sql_9, "INSERT INTO u984373661_prem_db.SensExt (temp_ext,humid_ext,press_ext,id_date,id_lieu) VALUES (%s,%s,%s,%d,'1')", tab_var[0], tab_var[1], tab_var[2], monId);
  sprintf(insert_Sql_10, "INSERT INTO u984373661_prem_db.SensInt (temp_int,humid_int,id_date,id_lieu) VALUES (%s,%s,%d,'2')", tab_var[3], tab_var[4], monId);
  sprintf(insert_Sql_11, "INSERT INTO u984373661_prem_db.SensCave (temp_cave,humid_cave,id_date,id_lieu) VALUES (%s,%s,%d,'3')", tab_var[5], tab_var[6], monId);
   
  cursor->execute(insert_Sql_9);
  sprintf(insert_Sql_12, "SELECT id_ext FROM u984373661_prem_db.SensExt WHERE id_ext= (select max(id_ext) from u984373661_prem_db.SensExt)");
//------------------------------------------------
 row = NULL;
  MySQL_Cursor *cur_mem1 = new MySQL_Cursor(&conn);
  cur_mem1->execute(insert_Sql_12);
  columns = cur_mem1->get_columns();
  do {
    row = cur_mem1->get_next_row();
    if (row != NULL) {
      monId2 = atol(row->values[0]);
    }
  } while (row != NULL);
  Serial.println(monId2);
  //-------------------------------------------------------------
  cursor->execute(insert_Sql_10);
   sprintf(insert_Sql_13, "SELECT id_int FROM u984373661_prem_db.SensInt WHERE id_int= (select max(id_int) from u984373661_prem_db.SensInt)");
//--------------------------------------------------------------------
 row = NULL;
  MySQL_Cursor *cur_mem2 = new MySQL_Cursor(&conn);
  cur_mem2->execute(insert_Sql_13);
  columns = cur_mem2->get_columns();
  do {
    row = cur_mem2->get_next_row();
    if (row != NULL) {
      monId3 = atol(row->values[0]);
    }
  } while (row != NULL);
  Serial.println(monId3);
  //------------------------------------------------
  cursor->execute(insert_Sql_11);
   sprintf(insert_Sql_14, "SELECT id_cave FROM u984373661_prem_db.SensCave WHERE id_cave= (select max(id_cave) from u984373661_prem_db.SensCave)");
//------------------------------------------------------
 row = NULL;
  MySQL_Cursor *cur_mem3 = new MySQL_Cursor(&conn);
  cur_mem3->execute(insert_Sql_14);
  columns = cur_mem3->get_columns();
  do {
    row = cur_mem3->get_next_row();
    if (row != NULL) {
      monId4 = atol(row->values[0]);
    }
  } while (row != NULL);
  Serial.println(monId4);
//----------------------------------------------------------
  sprintf(insert_Sql_15, "INSERT INTO u984373661_prem_db.ManagementTHP (id_ext,id_int,id_cave) VALUES (%d,%d,%d)", monId2, monId3, monId4);
cursor->execute(insert_Sql_15);

j'ai définis la fonction comme ça, mais je n'arrive pas a trouver le bon type pour mon paramètre pour la faire fonctionner voir "type" dans le paramètre, j'ai essayer long, char char[], mais rien ne fonctionne :

long recup_id("type" requeteSQL) {
  long monId = 0;
    row_values *row = NULL;
  MySQL_Cursor *cur_mem = new MySQL_Cursor(&conn);
  cur_mem->execute(requeteSQL);
  column_names *columns = cur_mem->get_columns();
  do {
    row = cur_mem->get_next_row();
    if (row != NULL) {
      monId = atol(row->values[0]);
    }
  } while (row != NULL);
    return(monId);
  }