Erreur insert into base de donné MySQL

Bonjour à tous,

En faisant une commande SQL insert into, j'ai cette erreur qui apparait :

INSERT INTO base_de_donnees.table (jour,mois,annee,heure,minute,seconde,vitesse,model) VALUES (16,1,24,19,30,26,1,A)

Error: 43 = Unknown column 'A' in 'field list'.

Voici le programme, et pour info les nom de colonne de table dans la base de données correspondent bien à "jour", "mois", "annee", "heure", "minute", "seconde", "vitesse" et "model" :

#include <Wire.h>
#include <SPI.h>
#include <simpleRTC.h>
#include <UIPEthernet.h>
#include <MySQL_Connection.h>
#include <MySQL_Cursor.h>
#include <ConnexParams.h>

EthernetClient client;
MySQL_Connection conn(&client);
MySQL_Cursor* cursor;

unsigned long previousMillis2;
char insert_Sql_1[140];


uint8_t a,m,j,hh,mm,ss; //Déclaration de variable pour extraireDateCompil() et extraireHeureCompil()

uint8_t annee1,mois1,jour1,heure1,minute1,seconde1; 
#define bt_var2 4     // affectation de la broche var2
char  var2;         // déclaration de la variable var2 de type char
boolean etat;          // déclaration de la variable etat de booléen
int tabDH[5];
int var1 = 0;


void setup () {
  Serial.begin(9600);
  Wire.begin(); // Initialisation de la communication I2C
  SPI.begin();
  pinMode(bt_var2, INPUT_PULLUP); // Initialisation de bt_var2 en mode entrée avec resistance pull-up
  extraireDateCompil(__DATE__, &a, &m, &j); // Extraction de la date du pc avec la fonction extraireDateCompil()
  extraireHeureCompil(__TIME__, &hh, &mm, &ss); // Extraction de l'heure du pc avec la fonction extraireHeureCompil()

 uint8_t mac[6] = {0x00,0x01,0x02,0x03,0x04,0x05};
  Ethernet.begin(mac);

  Serial.print("localIP: ");
  Serial.println(Ethernet.localIP());
  Serial.print("subnetMask: ");
  Serial.println(Ethernet.subnetMask());
  Serial.print("gatewayIP: ");
  Serial.println(Ethernet.gatewayIP());
  Serial.print("dnsServerIP: ");
  Serial.println(Ethernet.dnsServerIP());

  Serial.print("Connecting to SQL...  ");
  if (conn.connect(serverAddress, 3306, user_BD, passw_BD))
    Serial.println("OK.");
  else
    Serial.println("FAILED.");

  // create MySQL cursor object
  cursor = new MySQL_Cursor(&conn);


  // Print ESP8266 Local IP Address
  Serial.println(Ethernet.localIP());

Serial.println();

}


void loop () {

var1 = analogRead(A4);
// Test de létat du bouton pour affecter la variable var2
etat=digitalRead(bt_var2);  
  if ((etat==LOW) && (var1 < 10))        
    {
       var2 = 'D'; 
    }
  else if ((etat==HIGH) && (var1 < 10))  
    {
      var2 = 'A'; 
    }
  else
    {
       var2 = 'M'; 
    }
  
// Utilisation de millis pour gérer la cadence d'enregistrement
// 10000 = 10 seconde
static uint32_t ref = 0;
  if (millis() - ref >= 10000)
  {
    ref += 10000;
    if (RTC.actualiser())// Actualisation du module RTC avant recuperation des données
    {
      // Affectation des variables date et heure avec le module RTC
      annee1   = RTC.annee();
      mois1    = RTC.mois();
      jour1    = RTC.jour();
      heure1   = RTC.heure();
      minute1  = RTC.minute();
      seconde1 = RTC.seconde();

envoi(jour1, mois1, annee1, heure1, minute1, seconde1, var1,var2);

    
    }
    else
    {
      Serial.println("pb acces horloge");
    }
  }
}

// Fonction extraireDateCompil() pour extraire la date
void extraireDateCompil(char dateCompil[], uint8_t *annee, uint8_t *mois, uint8_t *jour)
  {
    *mois = extraireMois(&dateCompil[0]);
    *jour = extraireNombre2Car(&dateCompil[4]);
    *annee = extraireNombre2Car(&dateCompil[9]);
  }

// Fonction extraireDateCompil() pour extraire l'heure
void extraireHeureCompil(char heureCompil[], uint8_t *heure, uint8_t *minute, uint8_t *seconde)
  {
    *heure = extraireNombre2Car(&heureCompil[0]);
    *minute = extraireNombre2Car(&heureCompil[3]);
    *seconde = extraireNombre2Car(&heureCompil[6]);  
  }

// Fonction pour Passer les mois en chaine de caractères en numéro
uint8_t extraireMois(char chaine[])
{
  uint8_t m = 0;
  if (chaine[0] == 'J')
  {
    if (chaine[1] == 'a') m = 1;
    else if (chaine[1] == 'u' && chaine[2] == 'n') m = 6;
    else if (chaine[1] == 'u' && chaine[2] == 'l') m = 7;
  }
  else if (chaine[0] == 'F') m = 2;
  else if (chaine[0] == 'M')
  {
    if (chaine[2] == 'r') m = 3;
    else if (chaine[2] == 'y') m = 5;
  }
  else if (chaine[0] == 'A')
  {
    if (chaine[1] == 'p') m = 4;
    else if (chaine[1] == 'u') m = 8;
  }
  else if (chaine[0] == 'S') m = 9;
  else if (chaine[0] == 'O') m = 10;
  else if (chaine[0] == 'N') m = 11;
  else if (chaine[0] == 'D') m = 12;
  return m;
}

// Fonction pour construire un nombre a deux chiffres
uint8_t extraireNombre2Car(char chaine[])
{
  return extraireChiffre(chaine[0]) * 10 + extraireChiffre(chaine[1]);
}

// Fonction de conversion en chiffre
uint8_t extraireChiffre(char c)
{
  return ('0' <= c && c <= '9') ? c - '0' : 0;
}


void envoi(int jour1, int mois1, int annee1, int heure1, int minute1, int seconde1, int vitesse1, char var2) {

  int interv = 0;
  for (int i = 0; i < 3; i++) {
    unsigned long currentMillis2 = millis();
    if (currentMillis2 - previousMillis2 >= interv) {
      // save the last time you updated the DHT values
      previousMillis2 = currentMillis2;
      if (!conn.connected()) {
        if (conn.connect(serverAddress, 3306, user_BD, passw_BD)) {
          Serial.println("connection OK.");
        } else {
          Serial.println("connection FAILED.");
          interv = 60000;
          return;
        }
      }
    }
  }


  
  sprintf(insert_Sql_1, "INSERT INTO u984373661_prem_db.chain_peint (jour,mois,annee,heure,minute,seconde,vitesse,model) VALUES (%d,%d,%d,%d,%d,%d,%d,%c)", jour1,mois1,annee1,heure1,minute1,seconde1,vitesse1,var2);
 Serial.println(insert_Sql_1);
  cursor->execute(insert_Sql_1);

  if (conn.connected()) {
    conn.close();
  }
}

Merci d'avance

que représente A, si c'est une chaine de caractère, tu dois mettre la chaine entre apostrophe(')

C'est un char :

char  var2;

if ((etat==LOW) && (var1 < 10))          
    {
       var2 = 'D'; 
    }
  else if ((etat==HIGH) && (var1 < 10))          
    {
      var2 = 'A'; 
    }
  else
    {
       var2 = 'M'; 
    }

Et je l'ai bien traité avec des ' et pas avec des " comme les String

Ce n'est pas var2 qui est transmis, c'est
VALUES (%d,%d,%d,%d,%d,%d,%d,%c)
Qui est traduit comme le dit le message d'erreur par
VALUES (16,1,24,19,30,26,1,A)

Il faut lui donner:
VALUES (16,1,24,19,30,26,1,'A')
pour lui passer un char

Merci vileroy pour cette précision, mais je ne comprend pas car dans mon "sprintf" ci dessous, c'est bien var2 qui a pour valeur un char 'A'.

sprintf(insert_Sql_1, "INSERT INTO u984373661_prem_db.chain_peint (jour,mois,annee,heure,minute,seconde,vitesse,model) VALUES (%d,%d,%d,%d,%d,%d,%d,%c)", jour1,mois1,annee1,heure1,minute1,seconde1,vitesse1,var2);

Donc dans mon esprit je lui passe bien un char.

Je tiens a préciser également, au cas ou j'ai fait une bourde, que dans ma table MySQL le champ model est enregistré en char 1 caractère en utf8_unicode_ci valeur NULL accepté.

var2 contient le char A, pas la chaine 'A'. du coup après remplacement par le sprintf, c'est A qui est donné et pas 'A'.
VALUES (%d,%d,%d,%d,%d,%d,%d,%c)
renvoie bien VALUES (16,1,24,19,30,26,1,A)
Il faut donc mettre quelque chose comme
VALUES (%d,%d,%d,%d,%d,%d,%d,'%c')

Ok je comprend mieux l'ambiguïté maintenant.
Car dans mon esprit comme je lui affectais un char, %c était forcément un char, ce qui n'est en fin de compte pas le cas.

Je test ça ce soir.

Merci encore à vous deux.

1 Like

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.