ich möchte ohne PHP eine Maria-Datenbank beschreiben. Der Code steht auch und ich kann feste Werte, d.h. die ich direkt in den INSERT--Befehl schreibe auf die Datenbank schreiben.
char INSIERT_TABEL_SQL[] = "INSERT INTO Messwerte (Temperatur BME in C) VALUES (2.52) ";
Nun würde ich gerne aber dort Messwerte rein schreiben.
char INSIERT_TABEL_SQL[] = "INSERT INTO Messwerte (Temperatur BME in C) VALUES ($temp1) ";
Ich suche nun schon seit Tagen die richtige Syntax damit das Programm die Variable temp1 nimmt. Es ist nicht $ es ist nicht % (wie in den Beispielen der IDE). Ich finde nichts darüber, wie ich eine Variable im Insert-Befehl bekann manche.
Hier der Code
.
.
.
// Sample query
char INSIERT_TABEL_SQL[] = "INSERT INTO Messwerte (`Temperatur BME in C`)VALUES ($temp1) ";
WiFiClient client;
MySQL_Connection conn((Client *)&client);
float temp1
void setup() {
Serial.begin(115200);
// Begin WiFi section
WiFi.begin(ssid, pass);
// Wait for connection
while ( WiFi.status() != WL_CONNECTED ) {
delay ( 500 );
Serial.print ( "." );
}
Serial.println ( "" );
Serial.print ( "Connected to " );
Serial.println ( ssid );
Serial.print ( "IP address: " );
Serial.println ( WiFi.localIP() );
// End WiFi section
Serial.println("DB - Connecting...");
while (conn.connect(server_addr, 3306, user, password, db) != true) {
delay(500);
Serial.print ( "." );
}
void loop() {
delay(2000);
temp1 = 1.25;
Serial.println(temp1);
Serial.println("Recording data.");
// Initiate the query class instance
MySQL_Cursor *cur_mem = new MySQL_Cursor(&conn);
// Execute the query
cur_mem->execute(INSIERT_TABEL_SQL);
// Note: since there are no results, we do not need to read any data
// Deleting the cursor also frees up memory used
delete cur_mem;
}
temp1 steht da so drin, damit ich erstmal nur "einen" Fehler habe. Natrülich soll dort später die Sensordaten hinerlegt werden. Aber wenn der Code nun zu kompliziert, wird kann der Fehler wieder überall liegen. Als Anfänger muss man kleine Schritte machen!
Ich gehe davon aus, dass ich den Wald vor lauter Bäumen nicht sehe und mir schon zu viele Threads angeguckt habe und deswegen mache ich jetzt ne Pause und gehe raus an die frische Luft. Hoffe einer weiß die Lösung und teilt die mir mit!
Du musst entweder aus dem Inhalt der Values-Klammer eine Zeichenkette bilden oder das gleich mit snprintf zusammenbasteln.
char sql[150]; // an Deine Gegebenheiten anpassen (auszählen+Reserve)
int res = snprintf(sql,sizeof(sql),"INSERT INTO Messwerte (Tem,ort) VALUES (%3.2f,%d)",floatVariable,intVariable);
Wenn du wirklich Gleitkommawerte in eine Datenbank schreiben willst/musst, ist der Umweg über einen Text mit Punkt und einigen (default 2) Nachkommastellen fragwürdig.
Auch MariaDB kennt Parameter und Prepared Statements.
Allerdings sind Gleitkommazahlen für Temperaturen im Haushaltsbereich auch albern und sprintf somit nicht wirklich daneben.
Aber die verwendete Lib kennt das nicht. Die kann nur SQL-Zeichenketten verarbeiten und wenn float gewünscht sind, muss man das halt so machen.
Deshalb (und wegen https, was in den wenigsten gemieteten DB ein compiliert ist) gehe ich in meinen Anwendungen, die eine ferne DB nutzen, den Weg über PHP und prepared Statements.
danke nochmal für eure Hilfe. Ich habe mich für Tommy56 Antwort enschieden. Diese habe ich einfach verstanden. Bin halt Anfänger.
Mit dem Code von Tommy hat es aber nicht funktioniert, da mir ein Fehler bei der int res = snprintf(sql,sizeof(sql),"INSERT INTO Messwerte (Tem,ort) VALUES (%3.2f,%d)",floatVariable,intVariable);
ausgegeben wurde, dass er int res nicht kennt.
Ich habe es dann wie folgt Programmiert. Ich habe halt die Zeichen für den gesamten Befehl über Word zählen lassen und +1 genommen. Somit hatte ich für die char sql[150];
die Zahl der Zeichen in meinem Befehl. Die kommt dann als "Globale Variabel" über void setup. Dann habe ich die snprintf(sql, sizeof(sql), "INSERT INTO...
direkt im void loop genutzt. Dann kam kein Fehler mehr und er hat alles gemacht!
Danke!
Ach und zu den Leerzeichen Tommy56 die machen für mich als Legastheniker sehr viel Sinn. Sonst denkt sich mein Gehirn leider Klammern und Simikolons dazu und ich würde noch mehr Fragen. Kann mir aber vorstellen, dass für viele dann der Lesefluß leidet.
Die Gedanken zu INT und FLOAT habe ich auch schon gehabt. Aber bin dann doch bei FLOAT geblieben.
Gerne mich PN schreiben, wenn jemand meine Ausführung nicht versteht.