Sensorwerte in MySQL Datenbank speichern
-
@Jxni
Du musst das INSERT Statement mit z.B.mysql_query
odermysql_real_query
ausführen:
https://dev.mysql.com/doc/c-api/8.0/en/mysql-query.html
MitInsert: ("INSERT INTO sensorvalues (co2) VALUES (NULL, %i)", (co2ppm));
klappt es schonmal sicher nicht.
Und dein INSERT Statement
INSERT INTO sensorvalues (co2) VALUES (NULL, %i)
ist auch falsch.
INSERT INTO sensorvalues (co2)
heisst er soll in die Tabellesensorvalues
einfügen und du willst den Wert für die Spalteco2
angeben, und alle anderen Spalten sollen die Default-Werte bekommen, bzw. NULL wenn die Spalten keinen expliziten Default-Wert haben.
Dann gibst du aber mitVALUES (NULL, %i)
zwei Werte an. Erst sagst du also du willst nur einen Wert angeben, und zwar den für die Spalteco2
, und dann übergibst du mitVALUES
zwei Werte. Das passt doch nicht zusammen.
-
@hustbaer Danke für deine Antwort!
Es ergibt schon Sinn so wie du es beschrieben hast. Ich werde jetzt mal versuchen mit mysql_query oder mysql_real_query es umzusetzen.
-
Gerade wenn du mehrere wiederholte inserts machen willst, kannst du auch prepared statements nutzen.
Siehe ein Beispiel auf https://dev.mysql.com/doc/c-api/8.0/en/mysql-stmt-execute.html
Im Wesentlich bereitest du mit
INSERT INTO sensorvalues (co2) VALUES (?)
vor und führst dann execute für alle zu insertenden Werte aus.Und weil du ja C++ nutzt bzw. im C++-Bereich fragst, muss ich darauf hinweisen, dass du nicht unbedingt die C-API von MySQL nutzen musst - siehe hier (Beispiel ganz unten) wie es in C++ mit der "X DevAPI" geht: https://dev.mysql.com/doc/x-devapi-userguide/en/devapi-users-working-with-relational-tables.html
-
Ok Danke ich sehe mir das gleich mal etwas genauer an. Das einzige was ich nicht verstehe ist was ich genau bei INSERT INTO sensorvalues (co2) VALUES (?) statt dem ? schreiben soll. Da sollte ja eigentlich meine Integer Variable ppm hin, aber ich weiß nicht wie mit %d oder nur mit dem Namen ppm.
-
Danke für den Tipp. Habe den Post jetzt geändert.
-
Ich finde nur Tutorials wie man einen Text mit INSERT in die DB schreibt, doch wie man jetzt einen Wert einer Variable speichert habe ich bisher noch nicht gefunden!
-
@Jxni sagte in Sensorwerte in MySQL Datenbank speichern:
Da sollte ja eigentlich meine Integer Variable ppm hin, aber ich weiß nicht wie mit %d oder nur mit dem Namen ppm.
Formatspecifier (wie %d) sind eine Eigenheit der Funktionen printf, scanf (und strftime) - und nicht von C.
C kennt auch keine dynamischen Strings.Du musst den Text vor der Benutzung zusammensetzen.
Dafür eignet sich die Standardfunktion sprintf ganz gut.Das Insert sollte auch innerhalb der
while
-Schleife stehen - und nicht in der getPWM
-
Man kann in C++ auch stringstream nutzen und sich die Befehlsfolge damit zusammenbauen.
-
@Jxni sagte in Sensorwerte in MySQL Datenbank speichern:
INSERT INTO sensorvalues (co2) VALUES (?) statt dem ? schreiben soll
Nichts, da kommt das Fragezeichen hin! Das ist ein Platzhalter. Im verlinkten Beispiel wird dann mit bind ein Wert an diesen Platzhalter gebunden, mit execute wird das ganze ausgeführt.
Bei Zahlen kommt das aus dasselbe raus wie wenn du die Zahl direkt reinschreiben würdest. Aber wenn du zum Beispiel einen String einfügen willst, musst du dir bei Benutzung der Platzhalter keine Gedanken mehr um Quoting/SQL-Injection etc machen.
-
@wob sagte in Sensorwerte in MySQL Datenbank speichern:
Aber wenn du zum Beispiel einen String einfügen willst, musst du dir bei Benutzung der Platzhalter keine Gedanken mehr um Quoting/SQL-Injection etc machen.
Das ist eine der Gründe weshalb ich persönlich PostgreSQL bevorzuge. Da wird einfach der Query String übermittelt und getrennt die Parameter, und man muss nicht mehr herumbasteln wie früher.