INFO: Dieses Forum nutzt Cookies...
Cookies sind für den Betrieb des Forums unverzichtbar. Mit der Nutzung des Forums erklärst Du dich damit einverstanden, dass wir Cookies verwenden.

Es wird in jedem Fall ein Cookie gesetzt um diesen Hinweis nicht mehr zu erhalten. Desweiteren setzen wir Google Adsense und Google Analytics ein.

Antwort schreiben 
 
Themabewertung:
  • 0 Bewertungen - 0 im Durchschnitt
  • 1
  • 2
  • 3
  • 4
  • 5
MySQL Beispielcode verstehen
18.10.2016, 11:32 (Dieser Beitrag wurde zuletzt bearbeitet: 18.10.2016 11:33 von RonSH.)
Beitrag #25
RE: MySQL Beispielcode verstehen
Ich bemühe mich deinen Anweisungen irgendwie zu folgen und zu verstehen

Code:
#include <SPI.h> // SPI für EthernetShield
#include <Ethernet.h> // Ethernet
#include <mysql.h> // MySql Connector
#include <sha1.h> // sha Crypto
#include <SoftwareSerial.h>

EthernetClient client; // EthernetClient - Instanz erstellen


int id;
char nachname; //name als variable nicht möglich.name in nachname in der DB geändert
String rfid;
int guthaben;

static char user[] = "arduino"; // SQL-Nutzer
static char password[] = "ardu"; // SQL Kennwort
static char db[] = "ardu_tabelle";
static byte ip[] = {192, 168, 178, 10 }; // IP-Adresse Arduino
static IPAddress dbAdresse(192, 168, 178, 5);
static byte mac[] = {0x90, 0xA2, 0xDA, 0x00, 0x9B, 0xC1 }; // MAC-Adresse des Arduino
Connector my_conn; // Connector - Instanz erstellen


const char HELLO_SQL[] = "SELECT * from arduino.ardu_tabelle";


void do_query(const char *q) {
  column_names *c; // pointer to column values
  row_values *r;   // pointer to row values

if (!my_conn.cmd_query(q)) {
    return;
  }

c = my_conn.get_columns();
  for (int i = 0; i < c->num_fields; i++) {
    Serial.print(c->fields[i]->name);
    if (i < c->num_fields - 1) {
      Serial.print(",");
    }
  }
  Serial.println();

int num_cols = c->num_fields;
  int rows = 0;
  do {
    r = my_conn.get_next_row();
    if (r) {
      rows++;
      for (int i = 0; i < num_cols; i++) {
        Serial.print(r->values[i]);
        if (i < num_cols - 1) {
          Serial.print(", ");
        }
      }
      Serial.println();

      my_conn.free_row_buffer();
    }
  } while (r);
  Serial.print(rows);
  Serial.println(" rows in result.");

my_conn.free_columns_buffer();
}
  
void setup()
{
   Serial.begin(9600);  // Verbindung zum PC
  Serial.println("Start");
  Ethernet.begin(mac, ip); // EthernetClient starten DHCP
  delay(1000);  // 1 Sekunde warten
  Serial.print("Meine IP ist ");
  Serial.println(Ethernet.localIP());
  Serial.print("Server IP: ");
  Serial.println(dbAdresse);
  if (my_conn.mysql_connect(dbAdresse, 3306, user, password)) {
    delay(1000);


  
    do_query(HELLO_SQL);
    
  

    
  }
  else {
    Serial.println("Connection failed.");
  }
}



void loop()
{

}

Code:
Start
Meine IP ist 192.168.178.10
Server IP: 192.168.178.5
Connected to server version 5.5.5-10.1.16-MariaDB
id,nachname,guthaben,rfid,datum
1, Meier, -1, 998856674560, 2016-10-17 22:04:28
2, Max, 1000, 998841095900, 2016-10-17 22:05:46
3, Muster, 10, 908887180082, 2016-10-17 22:06:38
3 rows in result.
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
18.10.2016, 12:10
Beitrag #26
RE: MySQL Beispielcode verstehen
(18.10.2016 11:32)RonSH schrieb:  Ich bemühe mich deinen Anweisungen irgendwie zu folgen und zu verstehen
Das kann ich kaum noch glauben.

Hier einige Zitate aus meinen früheren Postings, von denen nichts in Deinen Codes zu sehen ist.

Gestern 13:00
SELECT id,name, rfid, guthaben FROM ardu_tabelle WHERE rfid = '12345678'

UPDATE ardu_tabelle SET guthaben = guthaben -1 WHERE id = 1;

Gestern 21:49
Hast Du die Funktionen zum Auslesen der User-Daten anhand der RFID fertig und funktioniert sie?
Hast Du die Funktion zum Verringern des Guthabens in der DB fertig und funktioniert sie?

Gestern 22:30
ich nenne sie mal getUserData(char *rfid)

Die soll das SQL-Statement
Code:
SELECT id,name, rfid, guthaben FROM ardu_tabelle WHERE rfid = 'gesuchteRFID'
absetzen, die Daten lesen und die globalen Variablen
id, name, rfid und guthaben setzen.

Die gesuchte RFID sollte der Funktion als Parameter übergeben werden.
Das wird eine Abwandlung der do_query aus den Beispielen.

Von diesen Sachen sehe ich noch nicht mal einen Ansatz in den von Dir geposteten Sketches. Ohne diese Funktionen geht es nicht weiter. Da bringt es nichts, wenn Du immer völlig andere Codes postest.

Ich habe den Eindruck, du verstehst nicht wirklich, was Du da tust. Es kommen keine konkreten Fragen zu Codezeilen oder Ähnliches, nur nebulöse "verstehe ich nicht"-Aussagen. So wird das nichts.

Ich warte jetzt auf die Funktion getUserData(char *rfid) von Dir, die den Select
SELECT id,name, rfid, guthaben FROM ardu_tabelle WHERE rfid = 'rfid'
absetzt und das Ergebnis in die globalen Variablen id, rfid, guthaben und name schreibt.

Gruß Tommy
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
18.10.2016, 16:51 (Dieser Beitrag wurde zuletzt bearbeitet: 18.10.2016 19:35 von RonSH.)
Beitrag #27
RE: MySQL Beispielcode verstehen
Hallo Tommy,
ich kann mir denken, dass du schon genervt von mir bist und denkst: "was für ein Trottel"
Ich mag jetzt auch schon gar nicht mehr ins Forum schreiben. Ich habe einfach keine Erfahrungen mit Foren.

Ich sitze jetzt seit Stunden an dem Code und es kommt einfach nicht das raus, was deinen Erwartungen entspricht.

Ich habe jetzt folgende globale Variablen angelegt
Code:
const char *id;
const char *nachname;
const char *rfid;
char *guthaben;

mit
Code:
do_query(getUserData);
löse ich folgenden select aus
Code:
const char getUserData[] = "SELECT id,nachname, rfid, guthaben FROM arduino.ardu_tabelle WHERE rfid = '998841095900'";

und bekomme dann auf dem seriellen Monitor
id,nachname,rfid,guthaben
2, Max, 998841095900, 1000
1 rows in result
angezeigt.

Du sagst ja, ich soll eine Funktion erstellen, die getUserData heißt,das oben beschriebene ausführt und die Daten in die globalen Variablen abspeichert.

die Daten liegen ja beim Auslesen in der Variable getUserData. Kann man dort einzelne Werte auslesen und übergeben? Oder denke ich zu kompliziert.

Kurze Ergänzung:
es soll ja eine Funktion erstellt werden.
Ich habe versucht, folgende Funktion zu erstellen
Code:
const char rfid [] = "SELECT id,nachname, rfid, guthaben FROM arduino.ardu_tabelle WHERE rfid = '998841095900'";

Code:
void getUserData(char *rfid) {
do_query(rfid);

ohne Erfolgserlebnis .
Vielleicht gibt es ja einen Tipp
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
18.10.2016, 19:46 (Dieser Beitrag wurde zuletzt bearbeitet: 18.10.2016 19:50 von Tommy56.)
Beitrag #28
RE: MySQL Beispielcode verstehen
(18.10.2016 16:51)RonSH schrieb:  Hallo Tommy,
ich kann mir denken, dass du schon genervt von mir bist und denkst: "was für ein Trottel"
Ich mag jetzt auch schon gar nicht mehr ins Forum schreiben. Ich habe einfach keine Erfahrungen mit Foren.

Ich sitze jetzt seit Stunden an dem Code und es kommt einfach nicht das raus, was deinen Erwartungen entspricht.

Ich habe jetzt folgende globale Variablen angelegt
Code:
const char *id;
const char *nachname;
const char *rfid;
char *guthaben;

mit
Code:
do_query(getUserData);
löse ich folgenden select aus
Code:
const char getUserData[] = "SELECT id,nachname, rfid, guthaben FROM arduino.ardu_tabelle WHERE rfid = '998841095900'";

und bekomme dann auf dem seriellen Monitor
id,nachname,rfid,guthaben
2, Max, 998841095900, 1000
1 rows in result
angezeigt.

Du sagst ja, ich soll eine Funktion erstellen, die getUserData heißt,das oben beschriebene ausführt und die Daten in die globalen Variablen abspeichert.

die Daten liegen ja beim Auslesen in der Variable getUserData. Kann man dort einzelne Werte auslesen und übergeben? Oder denke ich zu kompliziert.
Das hat nichts mit Foren zu tun, sondern mit fehlenden Grundkenntnissen.
Ich vermute mal, dass Du aus Deinem Buch eher abgetippt / kopiert hast, als verstanden.

Dir fehlt das Verständnis für die elementarsten Grundlagen von C.
Wir müssen also noch viel früher anfangen.

Nehmen wir mal Deine Variablendeklarationen:
Code:
const char *id;  // ist in der DB eine Zahl
const char *nachname; // ist eine Zeichenkette aber Du willst da was rein schreiben, also musst Du Platz reservieren
const char *rfid; // wie nachname
char *guthaben; // ist in der DB eine Zahl
Wieso const? const heißt konstant, also Sachen die sich nie ändern (die werden dann im Programmspeicher angelegt, da kannst Du nichts rein schreiben).
Das sollte so aussehen:
Code:
int id;
char nachname[21]; // ich weiß nicht, wie lang Du das in der DB angelegt hast. Die Länge muss DB-Länge+1 sein
char rfid[21]; // ich glaube die hatten wir auf 20 festgelegt
int guthaben;
Eine Variable getUserData gibt es nicht oder hast Du irgendwo ein struct angelegt?
Ich gebe Dir jetzt noch ein unvollständiges getUserData.
Beschäftige Dich soweit mit den Grundlagen von C, dass Du das vervollständigen kannst.
Bevor Du Dir diese Kenntnisse nicht angeeignet hast, ist jede weitere Arbeit ab Deinem Projekt, mangels Grundkenntnissen, sinnlos.
Code:
char qry[] = "SELECT id,nachname, rfid, guthaben FROM arduino.ardu_tabelle WHERE rfid = '998841095900'";
char nachname[21]; // ich weiß nicht, wie lang Du das in der DB angelegt hast. Die Länge muss DB-Länge+1 sein
char rfid[21]; // ich glaube die hatten wir auf 20 festgelegt
int guthaben;

int getUserData(char *q) {
  // Variablen leeren
  name[0] = '\0';
  rfid[0] = '\0';
  id = 0;
  guthaben = 0;
  // ausführen
  if (!my_conn.cmd_query(q)) {
    //wenn kein Resultset, also nix gefunden, zurück
    return 0;
  }

  // Spalten lesen
  c = my_conn.get_columns();
  int num_cols = c->num_fields;
  int rows = 0;
  do {
    r = my_conn.get_next_row();
    // es gibt noch eine Zeile
    if (r) {
      rows++;
      id = atoi(r->values[0]);
      // die 3 anderen Werte machst Du selbst Zugriff r->Feldname
      // guthaben
      // name
      // rfid
      // Note: we free the row read to free the memory allocated for it.
      // You should do this after you've processed the row.
      my_conn.free_row_buffer();
    }
  } while (r);
  // Finally, we are done so we free the column buffers
  my_conn.free_columns_buffer();
  // anzahl der gefundenen Zeilen zurückgeben wenn die != 1 ist muss das Programm mit einer Fehlerausgabe reagieren
  return rows;
}

Bau das in einen Sketch ein und zeige mir die Ausgabe der 4 globalen Variablen id, name, rfid und guthaben.

Nur als Hinweis: Ich werde Dir keine weiteren Codeblöcke liefern, bis Du das nicht selbst hin bekommen hast. Dir fehlen alle Grundlagen von C.

Gruß Tommy
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
20.10.2016, 23:33 (Dieser Beitrag wurde zuletzt bearbeitet: 21.10.2016 09:01 von RonSH.)
Beitrag #29
RE: MySQL Beispielcode verstehen
Hallo,
da Tommy natürlich Recht hat, das mir einiges an Wissen in C fehlt, arbeite ich mich jetzt in die Sprache ein. Wenn man nur Beispiele abtippt, bleibt nichts hängen.

Ich habe eine Frage zum umwandeln einer Variable.
Umwandlung Zeichenkette - ganze Zahl
Die Umwandlung mit "atoi" in int, also eine ganze Zahl klappt wunderbar.
Habe ich jetzt int[11] als Variable, dann geht es nicht mehr.
Genau so wie char. Wie bekomme ich meinen String dort rein.

In meinen Grundlagen habe ich noch nichts gefunden.

Code:
#include <SPI.h> // SPI für EthernetShield
#include <Ethernet.h> // Ethernet
#include <mysql.h> // MySql Connector
#include <sha1.h> // sha Crypto
#include <SoftwareSerial.h>


EthernetClient client; // EthernetClient - Instanz erstellen


int id;
char nachname[21];
char rfid[21];
int guthaben;



static char user[] = "arduino"; // SQL-Nutzer
static char password[] = "ardu"; // SQL Kennwort
static char db[] = "ardu_tabelle";
static byte ip[] = {192, 168, 178, 10 }; // IP-Adresse Arduino
static IPAddress dbAdresse(192, 168, 178, 5);
static byte mac[] = {0x90, 0xA2, 0xDA, 0x00, 0x9B, 0xC1 }; // MAC-Adresse des Arduino
Connector my_conn; // Connector - Instanz erstellen
char qry[] = "SELECT id,nachname, rfid, guthaben FROM arduino.ardu_tabelle WHERE rfid = '12345678'";



void setup()
{
   Serial.begin(9600);  // Verbindung zum PC
  Serial.println("Start");
  Ethernet.begin(mac, ip); // EthernetClient starten DHCP
  delay(1000);  // 1 Sekunde warten
  Serial.print("Meine IP ist ");
  Serial.println(Ethernet.localIP());
  Serial.print("Server IP: ");
  Serial.println(dbAdresse);
  
  if (my_conn.mysql_connect(dbAdresse, 3306, user, password)) {
  delay(2000);
  getUserData(qry);

   }
  else {
    Serial.println("Connection failed.");
   }
}



void loop() {}


int getUserData(const char *q) { // Variablen leeren
  
  id = 0;
  nachname[0] = '\0';
  rfid[0] = '\0';
  guthaben = 0;
  
  column_names *c; // Zeiger auf Spaltenwerte
  row_values *r;   // Zeiger uf Zeilenwerte

if (!my_conn.cmd_query(q)) { //wenn kein Resultset, also nix gefunden, zurück
    return;
  }
// Als nächstes die Spaltennamen lesen und anzeigen.
c = my_conn.get_columns(); // Feldnamen auslesen.
  int num_cols = c->num_fields;
  int rows = 0; //  Reihen
  do {
    r = my_conn.get_next_row();
    
    if (r) {
      rows++; //erhöht rows um 1
      id = atoi(r->values[0]);
      //nachname = (r->values[1]);
     // rfid = atoi(r->values[2]);
      guthaben = atoi(r->values[3]);
      my_conn.free_row_buffer();

    
      
    }
  } while (r);
  Serial.print(rows);
  Serial.println(" rows in result.");
  Serial.print("Variable ID: ");
  Serial.println(id);
  Serial.print("Variable Guthaben");
  Serial.println(guthaben: );




my_conn.free_columns_buffer();

Id und Guthaben werden in den jeweiligen Variablen gespeichert.

Danke und bis bald
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
21.10.2016, 10:09 (Dieser Beitrag wurde zuletzt bearbeitet: 21.10.2016 10:10 von Tommy56.)
Beitrag #30
RE: MySQL Beispielcode verstehen
(20.10.2016 23:33)RonSH schrieb:  Hallo,
da Tommy natürlich Recht hat, das mir einiges an Wissen in C fehlt, arbeite ich mich jetzt in die Sprache ein. Wenn man nur Beispiele abtippt, bleibt nichts hängen.

Ich habe eine Frage zum umwandeln einer Variable.
Umwandlung Zeichenkette - ganze Zahl
Die Umwandlung mit "atoi" in int, also eine ganze Zahl klappt wunderbar.
Habe ich jetzt int[11] als Variable, dann geht es nicht mehr.
Genau so wie char. Wie bekomme ich meinen String dort rein.

In meinen Grundlagen habe ich noch nichts gefunden.

Code:
#include <SPI.h> // SPI für EthernetShield
#include <Ethernet.h> // Ethernet
#include <mysql.h> // MySql Connector
#include <sha1.h> // sha Crypto
#include <SoftwareSerial.h>


EthernetClient client; // EthernetClient - Instanz erstellen


int id;
char nachname[21];
char rfid[21];
int guthaben;



static char user[] = "arduino"; // SQL-Nutzer
static char password[] = "ardu"; // SQL Kennwort
static char db[] = "ardu_tabelle";
static byte ip[] = {192, 168, 178, 10 }; // IP-Adresse Arduino
static IPAddress dbAdresse(192, 168, 178, 5);
static byte mac[] = {0x90, 0xA2, 0xDA, 0x00, 0x9B, 0xC1 }; // MAC-Adresse des Arduino
Connector my_conn; // Connector - Instanz erstellen
char qry[] = "SELECT id,nachname, rfid, guthaben FROM arduino.ardu_tabelle WHERE rfid = '12345678'";



void setup()
{
   Serial.begin(9600);  // Verbindung zum PC
  Serial.println("Start");
  Ethernet.begin(mac, ip); // EthernetClient starten DHCP
  delay(1000);  // 1 Sekunde warten
  Serial.print("Meine IP ist ");
  Serial.println(Ethernet.localIP());
  Serial.print("Server IP: ");
  Serial.println(dbAdresse);
  
  if (my_conn.mysql_connect(dbAdresse, 3306, user, password)) {
  delay(2000);
  getUserData(qry);

   }
  else {
    Serial.println("Connection failed.");
   }
}



void loop() {}


int getUserData(const char *q) { // Variablen leeren
  
  id = 0;
  nachname[0] = '\0';
  rfid[0] = '\0';
  guthaben = 0;
  
  column_names *c; // Zeiger auf Spaltenwerte
  row_values *r;   // Zeiger uf Zeilenwerte

if (!my_conn.cmd_query(q)) { //wenn kein Resultset, also nix gefunden, zurück
    return;
  }
// Als nächstes die Spaltennamen lesen und anzeigen.
c = my_conn.get_columns(); // Feldnamen auslesen.
  int num_cols = c->num_fields;
  int rows = 0; //  Reihen
  do {
    r = my_conn.get_next_row();
    
    if (r) {
      rows++; //erhöht rows um 1
      id = atoi(r->values[0]);
      //nachname = (r->values[1]);
     // rfid = atoi(r->values[2]);
      guthaben = atoi(r->values[3]);
      my_conn.free_row_buffer();

    
      
    }
  } while (r);
  Serial.print(rows);
  Serial.println(" rows in result.");
  Serial.print("Variable ID: ");
  Serial.println(id);
  Serial.print("Variable Guthaben");
  Serial.println(guthaben: );




my_conn.free_columns_buffer();

Id und Guthaben werden in den jeweiligen Variablen gespeichert.

Danke und bis bald
Wenn Du in Deinen Grundlagen nichts dazu gefunden hast, ist das merkwürdig. Welche Grundlagen benutzt Du denn?

Was bedeutet int[11] auf dem Arduinio?
Das hast Du ja überhaupt nicht drin und das brauchst Du auch nicht.

Zu nachname und rfid musst Du Dich mit Arrays vom Typ Char beschäftigen. Die kann man nicht einfach mit = zuweisen.

Zu diesem Problemkreis habe ich vor einigen Tagen ein Zusammenfassung im Nachbarforum veröffentlicht.

Gruß Tommy
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
21.10.2016, 12:41
Beitrag #31
RE: MySQL Beispielcode verstehen
Danke für die tolle Erklärung Tommy. Sehr verständlich geschrieben. Ich habe mir das gleich ausgedruckt.

Code:
if (r) {
      rows++;
      id = atoi(r->values[0]);
      strcpy( nachname, r->values[1] );
      strcpy( rfid, r->values[2] );
      guthaben = atoi(r->values[3]);
      my_conn.free_row_buffer();

Alle globalen Variablen funktionieren.
Wäre der nächste Schritt jetzt, eine Variable rfid zu nutzen?

lg
Ron
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
21.10.2016, 14:25
Beitrag #32
RE: MySQL Beispielcode verstehen
(21.10.2016 12:41)RonSH schrieb:  Danke für die tolle Erklärung Tommy. Sehr verständlich geschrieben. Ich habe mir das gleich ausgedruckt.

Code:
if (r) {
      rows++;
      id = atoi(r->values[0]);
      strcpy( nachname, r->values[1] );
      strcpy( rfid, r->values[2] );
      guthaben = atoi(r->values[3]);
      my_conn.free_row_buffer();

Alle globalen Variablen funktionieren.
Wäre der nächste Schritt jetzt, eine Variable rfid zu nutzen?

lg
Ron
Geht doch. prima.

Jetzt mehmen wir uns das Einlesen der rfid in eine Variable
Code:
char rfid_karte[21];
vor.
Das machen wir am Besten erst mal in einem eigenen Sketch.

Im Posting #15 hattest Du ja schon mal einen Ansatz dazu.
Wir nehmen aber nicht den String rfid_id sondern char rfid_karte[21], wiel wir die ja mit der DB vergleichen wollen.

RFID.read() liefert dir jedesmal 1 Zeichen.
Für die Leseroutinen gibt es in den Foren genug Beispiele.

Gruß Tommy
Alle Beiträge dieses Benutzers finden
Diese Nachricht in einer Antwort zitieren
Antwort schreiben 


Möglicherweise verwandte Themen...
Thema: Verfasser Antworten: Ansichten: Letzter Beitrag
  Daten an mysql diode1990 24 1.312 31.07.2016 10:29
Letzter Beitrag: Gandalf
  Hilfe: Mega2560 - ENC 28J60 - MYSQL Gandalf 1 181 28.07.2016 16:30
Letzter Beitrag: Gandalf
  Sensordaten in MYSQL speichern rieders 3 700 02.03.2016 19:58
Letzter Beitrag: rieders
Sad Arduino Shield Verbindung bricht ab (PHP Skript,Mysql Datenbank) julius858 12 3.309 19.02.2016 11:26
Letzter Beitrag: IBES1410
  Arduino RF Transceiver und MySQL via PHP 420greenbrain 2 1.077 27.04.2015 22:50
Letzter Beitrag: 420greenbrain
  MYSQL Connector String dossidr 0 430 24.03.2015 22:44
Letzter Beitrag: dossidr
  Arduino SOLL-Werte von MySql abfragen sepro 5 1.870 01.08.2014 18:44
Letzter Beitrag: rkuehle

Gehe zu:


Benutzer, die gerade dieses Thema anschauen: 1 Gast/Gäste