Je suis en train d'essayer de remplir une base de données SQL en utilisant un ESP8266, mais je me confronte a un problème qui est l’écriture de ma variable dans ma requête SQL.
Si j'envoie des données fixe, chiffre ou chaine de caractères, il n'y a aucun soucis.
Par contre avec des variables je galère.
Voici mon code:
Ma variable:
float newH1 = bme.readHumidity();
Voici mon code qui ne fonctionne pas avec la variable newH1
char INSERT_SQL[] = "INSERT INTO u984373661_prem_db.SensorData (Capteur,Location,Temp,Humid,Press) VALUES ('BME280','Extériur','8.2',newH1,'10.1')";
if (conn.connected())
cursor->execute(INSERT_SQL);
Il n'y a pas de remplacement du nom d'une variable par sa valeur à l'intérieur d'une chaine.
Là tu va envoyer les caractères newH1 comme valeur de la colonne 'Humid' de ta table.
Avec sprintf tu va pouvoir insérer la valeur de variable dans ta chaine.
Pour l'exemple, j'ai supposé que newH1 est de type float, mais que seulement la partie entière est intéressante.
Si tu as directement un entier, pas la peine de cast, tu peux utiliser directement newH1 au lieu de
J'ai aussi mis une valeur de la chaine de ta requête au pif.
Je crois que snprintf n'existe pas, qui serait bien mieux à utiliser pour éviter des débordements de variable?
Oui désolé, la variable buffer remplace INSERT_SQL, le mieux serait d'ailleurs de faire le contraire.
cela donnerait quelque chose comme ça
char insertSql[100];
sprintf(insertSql, "INSERT INTO u984373661_prem_db.SensorData (Capteur,Location,Temp,Humid,Press) VALUES ('BME280','Extériur','8.2',%d,'10.1')", (int)newH1);
if (conn.connected())
cursor->execute(insertSql);
N'oubli de vérifier que 100 caractères est suffisant pour contenir ta chaine complète.
J'ai modifié la casse du nom de variable, car tout en majuscule est par convention réservé pour les constantes.
Merci c'est nickel, une dernière question, cette commande ou peut être plutôt fonction sprintf(), n'accepte pas les float, si je veux un float il faut passer par exemples par la fonction dtostrf() pour pouvoir intégrer un chiffre a virgule, chiffre entre guillemet parce que ça sera un string.
Avec le processeurs AVR, sprintf n'accepte pas les float, mais avec les esp8266 il n'y a pas cette limitation.
Donc tu peux utiliser sprintf sans problème.
Non le cast "(float)" permet d'indiquer que tu veux transformer le type de ta variable dans le type indiqué entre parenthése.
C'est pour ça que j'ai utilisé "(int)", car dans la chaine à formater, j'ai utilisé %d.
si tu veux envoyer un "float", il faut utiliser %f à la place de %d.
je m'immisce dans la discussion, car moi aussi je programme des données recueillies par BME280.
Pour ma part, j'ai choisi de confier à PHP / MySQL le soin de traiter les données et de les consigner dans la base de données (BDD). Je trouve cela plus sécuritaire car mes envois depuis ESP8266 peuvent être vérifiés par PHP avant qu'une inscription soit faite dans la BDD.
Cette façon de faire m'a aussi permis d'éviter les questions de float / texte / integer ... je pousse tout vers une page PHP et c'est là que sont traités les types de valeur et l'inscription à la BDD si les critères de sécurités sont remplis.
Certaines de mes stations météo seront basées sur ESP8266, d'autres sur ESP32-cam.