Werte aus einer Datenbank abrufen

Hallo zusammen,

ich versuche mich zurzeit daran von einem Externen Server mit einem ESP daten aus einer MYSQL Datenbank abzurufen und sie in meinem Programm zu verwenden.

Anders herum habe ich es geschafft, und zwar ruft der ESP eine PHP Seite auf und übergibt dieser Seite die werte welche diese dann in die Datenbank schreibt.

Geht das nicht auch umgekehrt? Sprich der ESP ruft eine PHP Seite auf welche dann die Werte aus der Datenbank abruft und dem ESP übergibt? Ich googel auch schon die ganze Zeit eventuell nehm ich einfach die falschen Suchbegriffe.

Könntet ihr mir eventuell einen Denkanstoß geben?

Der Code zum Senden des ESP an die PHP Seite

#include<ESP8266WiFi.h>
#include<DHT.h>

// Wlan varbiablen
const char ssid[] = "Mein Router";  //  your network SSID (name)
const char pass[] = "Mein Passwort";       // your network password
const char* host = "192.168.2.108"; // Die IP des HOST rechners wo gerade den Server hostet

//DHT variablen
#define DHTPIN 13
#define DHTTYPE DHT22
DHT dht(DHTPIN, DHTTYPE);
float Humidity = 0;
float Temperature = 0;

void setup() {
  Serial.begin(115200);
WiFi.begin(ssid, pass);
  
while (WiFi.status() != WL_CONNECTED) {
delay(500);
Serial.print(".");
  }
}

void loop() {
delay(5000);
temprature();
delay(5000);
transferData();
}


void temprature(){
    Humidity = dht.readHumidity();
    Temperature = dht.readTemperature();
    Serial.println("Temperatur und Feuchte ist:");
    Serial.println(Humidity);
    Serial.println(Temperature);
}

void transferData(){
  // Use WiFiClient class to create TCP connections
  WiFiClient client;
  const int httpPort = 80;
  if (!client.connect(host, httpPort)) {
    Serial.println("connection failed");
    return;
  }
 
  // We now create a URI for the request
  String url = "/w2mysql.php";        // So muss die PHP datein heisen
  url += "?A0=";
  url += Humidity;
  url += "&A1=";
  url += Temperature;
  
  Serial.print("Requesting URL: ");
  Serial.println(url);
 
  // This will send the request to the server
  client.print(String("GET ") + url + " HTTP/1.1\r\n" +
               "Host: " + host + "\r\n" +
               "Connection: close\r\n\r\n");
  delay(1000);
 
  // Read all the lines of the reply from server and print them to Serial
  while (client.available()) {
    String line = client.readStringUntil('\r');
    Serial.print(line);
  }
}

Die PHP Seite

<?php
$mysql_host = "localhost";
$mysql_db   = "test";
$mysql_user = "arduino";
$mysql_pw   = "passwort";
isset($_GET['A0']) ? $a0=$_GET['A0'] : $a0='';
isset($_GET['A1']) ? $a1=$_GET['A1'] : $a1='';
 
$connection = mysql_connect($mysql_host, $mysql_user, $mysql_pw) or die("Verbindung zur Datenbank fehlgeschlagen.");
mysql_select_db($mysql_db, $connection) or die("Datenbank konnte nicht ausgewaehlt werden.");
$insert_data = "INSERT INTO analog_data (analog0, analog1) VALUES ($a0, $a1)";
mysql_query($insert_data, $connection) or die("Fehler beim Eintragen der Daten in die Datenbank!");
?>

Danke euch und Liebe Grüße

Dennis

DeBran:
Könntet ihr mir eventuell einen Denkanstoß geben?

Ich habe ein paar Jahre lang mit PHP und SQL gearbeitet und entsprechende Sachen schon vor dem Frühstück rückwärts programmiert (nach Sonnenuntergang auch seitwärts). Aber seit gestern weiß ich, dass ich zumindest PHP nochmal lernen sollte, denn ich bekomme selbst ein dämlich-einfaches Ding nicht so hin, dass es funktioniert.

Immerhin ist Dein Posting jetzt nochmal kurz nach oben gerutscht.

Gruß

Gregor

Bei meiner letzten solcher Operation, habe ich das RedBean ORM verwendet.
Da ist ein fertiger REST Server bei.
Die Daten werden per JSON übertragen.

Ich sehe jetzt das Problem nicht. Wo ist die Schwierigkeit, daten aus der DB zu laden und zu auszugeben?

Das einzige Problem, das ich sehe, ist, dass PHP keinerlei Inputverifizierung macht. Man kann problemlos die ganze Tabelle droppen, wenn man für A0 einen bösartigen String wählt.

Hallo zusammen,

danke für die antworten, leider kann ich mit RedBean ORM gerade nichts anfangen werde aber aufjedenfall mal danach googeln.

ElCaron:
Ich sehe jetzt das Problem nicht. Wo ist die Schwierigkeit, daten aus der DB zu laden und zu auszugeben?

Das einzige Problem, das ich sehe, ist, dass PHP keinerlei Inputverifizierung macht. Man kann problemlos die ganze Tabelle droppen, wenn man für A0 einen bösartigen String wählt.

Du kannst es mir gerne verraten, wenn du es weißt wäre ich dir sehr dankbar.

zu deiner Anmerkung mit der Inputverifizierung. Ich bin mir sicher das du da recht haben könntest allerdings brauch ich erstmal die Basics damit ich die eigentliches sachen zum laufen bekomme sonst bringt mir alles andere auch nichts.

Entweder mit der mysql lib oder eben von Hand mittels einer php Seite. Die sollte nicht mal html liefern, sondern die Daten direkt, das ist einfacher zu parsen.
kein rest, orm, json oder sonstwas nötig, nur lamp

Vielleicht etwas unschön, aber pragmatisch für den Anfang.
Du schickst einen HTTP Get Request an deinen Server mit gewünschtem Such-Parameter und dieser soll dir mit dem Inhalt der Datenbank antworten. Würde zumindest für einzelne Werte funktionieren.

DeBran:
zu deiner Anmerkung mit der Inputverifizierung. Ich bin mir sicher das du da recht haben könntest allerdings brauch ich erstmal die Basics damit ich die eigentliches sachen zum laufen bekomme sonst bringt mir alles andere auch nichts.

Inputverifizierung gehört zu den Basics. Wenn die nicht dabei ist, dann hast Du ein mieses Tutorial. Google mal "SQL Injection".

Such Dir mal ein Tutorial zu PDO, oder was auch immer man heutzutage benutzt, habe PHP seit fast 10 Jahren nicht angefasst.

Bezüglich Deines Problems: Du machst halt eine Select-Abfrage und gibst das Ergebnis per echo aus. Der ESP bekommt es dann als Antwort beim Websiteaufruf.
Mehrere Werte bringst Du erst in ein leicht zu parsendes Format, z.B. JSON.
Saubererweise gehört dann noch der passende content header dazu.
Sauber gehört dann no

ElCaron:
Inputverifizierung gehört zu den Basics.

Jein. Fehlerbehandlung ist wichtig, aber nicht schon dann, wenn man nur (oder erstmal) eine Idee testen möchte.

ElCaron:
Wenn die nicht dabei ist, dann hast Du ein mieses Tutorial.

Nein, das Tutorial geht vermutlich zuerst auf Dinge ein, die einen Leser zuerst interessieren. Ein schlechtes Tutoral ist es für Leute, die sich sofort um Sicherheit oder Fehlerbehandlung kümmern wollen. Dass man sich zuerst um Funktionalität kümmert und erst hinterher um Sicherheit usw. ist genauso möglich wie Blödheit. Man sollte es halt nicht vergessen.

Gruß

Gregor

gregorss:
Jein. Fehlerbehandlung ist wichtig, aber nicht schon dann, wenn man nur (oder erstmal) eine Idee testen möchte.

Prepared statements beinhalten das alles. Es macht überhaupt keinen sinn, die uralten mysql_-Funktionen zu benutzen. Das klingt wie ein Tutorial von vor 15 Jahren.
Und ich bleibe dabei: Wenigstens Escaping gehört zum Queryaufbau, von Anfang an. Das ist ja nicht nur eine Sicherheitsfrage, sondern auch eine Frage, ob man sich mit dem nächsten Sonderzeichen seine Query zerhaut. Das hilft niemandem.

Deine Art von Denke hat dazu geführt, dass PHP den Ruf hat, den es heute hat.

ElCaron:
Deine Art von Denke hat dazu geführt, dass PHP den Ruf hat, den es heute hat.

Demnach ist der Ruf von PHP nicht so irre gut, nehme ich an.

Wer warum und wie programmiert, ist zunächst vollkommen nebensächlich, wenn er das erreicht, was er möchte. Und wenn PHP einen schlechten Ruf hat, dann bestimmt zuletzt wegen mir.

Gruß

Gregor

PHP hat einen ziemlich miesen Ruf, eben WEIL sich Leute draufgeschmissen haben, die erstmal einfach machen wollten und nachher die Details lernen, und PHP unterstützt einen herzlich dabei. Ich erinnere mich noch an Zeiten, da wurde ein URL-Parameter ?var=... direkt in die variable $var geschrieben, womit Angreifer nicht richtig initialisierte Variablen sauber URL-Parameter überschreiben konnten.
War damals ein Heidentheater, die Leute davon zu überzeugen, zum $_GET-Array zu wechseln, weil "Geht doch".
Hat auch Jahre gebraucht, bis nicht mehr jedes zweite Script per SQL-Injection angreifbar war. Weil PHP ja meinte, nur diese low-level-Funktionen bereitzustellen, bei denen man sich selbst ums escaping kümmern muss, anstatt direkt eine Lib mit prepared statements zu liefern (bis dann endlich mal PDO kam).

Wenn man etwas lernen will, dann soll man es gleich richtig lernen, und nicht irgendeinen kaputten Müll hinklatschen, nur weil der mit Glück gerade das gewollte Ergebnis bringt. Das Script oben ist schon kaputt, sobald man etwas anderes als eine Zahl übergibt.

ElCaron:
… Das Script oben ist schon kaputt, sobald man etwas anderes als eine Zahl übergibt.

Das ist so unglaublich egal, wie es nur irgendwas sein kann. Am egalersten. Der OP wird das irgendwann merken oder auch nicht.

Du schreibst, als sei Dir noch nie ein Fehler unterlaufen.

Gruß

Gregor

gregorss:
Du schreibst, als sei Dir noch nie ein Fehler unterlaufen.

Nein, mir sind schon haufenweise Fehler unterlaufen. In meiner ersten Datenbank für einen Newsticker habe ich dem Text den String "DELETED" vorangestellt, um einen gelöschten Artikel zu kennzeichnen und dann bei jedem Abruf danach geparst. Irgendwie scheine ich gedacht zu haben, Spalten seien teuer. Kann nicht rekonstruieren, was da in mir vorgegangen ist, war aber vor fast 20 Jahren, als die Pubertät mein Gehirn zerlegt und neu zusammengesetzt hat.

Ich habe mich aber nicht hingestellt und behauptet, mehr müsste man erstmal nicht wissen, das sei ein guter Anfang und die Quelle, die mich zu so einem Murks verleitet hat, sei schon in Ordnung.
Naja, der, der den Fehler gemacht hat, auch nicht. Wenn der clever ist, hat der die Stichworte aus #7 gegoogelt und schon lange ein sauberes System am laufen. Nur Du diskutierst hier rum.

Ceterum censeo: Ein Tutorial, das einem Anfänger mysql_* vorsetzt, ist Müll. Oder 15 Jahre alt.

ElCaron:
Ceterum censeo: Ein Tutorial, das einem Anfänger mysql_* vorsetzt, ist Müll. Oder 15 Jahre alt.

Also zumindest ist es Müll, wenn nicht nachvollziehbar ist, dass es 15 Jahre alt ist.

Gruß

Gregor

PS: Wenn Du weiterdiskutieren möchtest, gerne jederzeit per PM. Hier im Thread nur, wenn es Leute gibt, die sich als interessierte Leser outen.

ElEspanol:
Entweder mit der mysql lib oder eben von Hand mittels einer php Seite. Die sollte nicht mal html liefern, sondern die Daten direkt, das ist einfacher zu parsen.
kein rest, orm, json oder sonstwas nötig, nur lamp

Wenn der Provider den direkten Zugriff auf die MySQL-DB zuläßt, würde ich immer die MySQL-Lib auf dem ESP nehmen. Funktioniert problemlos und ist auch hier im Forum schon gepostet worden.

Gruß Tommy

Das ist unverschlüsselt, oder?

Das Passwort wird gehasht, der Rest ist unverschlüsselt.
Das ist zwischen dem PHP und der DB aber auch so.

Gruß Tommy

Also nicht geschützt. (hash hilft nur, wenn das Passwort noch wanders gebraucht würde). Der Unterschied ist, dass PHP und die DB über ein sicheres Netz verbunden sind.

Die Verbindung vom ESP zu PHP ist unverschlüsselt (oder kann das SDK mittlerweile SSL? War da nciht was?), aber das bedeutet zumindest nicht Komplettzugriff auf die Datenbank.

ElCaron:
Also nicht geschützt. (hash hilft nur, wenn das Passwort noch wanders gebraucht würde). Der Unterschied ist, dass PHP und die DB über ein sicheres Netz verbunden sind.

So pauschal würde ich das nicht sagen. Ich kenne Szenarien, bei denen beides bei verschiedenen Providern lag.

Der DB-Zugriff ist grundlegend offen, es kommt aber auf das Szenario an, ob das größere Probleme machen kann.
Wenn man die Grants für den User vom Arduino richtig einstellt, kann er nur lesen und/oder evtl. schreiben und das auf definierte Tabellen / Felder.
Dabei gehe ich davon aus, dass z.B. die Messdaten vom Arduino nicht kriegsentscheident sind und auch ein Verlust zu verkraften ist.

Wenn das nicht der Fall ist, nimmt man sowieso ein gekapseltes System.

Sicherheitsaufwand und Bedrohungsszenario sollten immer in einem ausgewogenen Verhältnis stehen.

Edit: Soviel Sicherheit, wie nötig. Nicht soviel Sicherheit wie möglich.

Gruß Tommy