Odesílání hodnot do databáze MySQL

mikimix
Příspěvky: 6
Registrován: 21 pro 2017, 13:16
Reputation: 0

Odesílání hodnot do databáze MySQL

Příspěvek od mikimix » 21 pro 2017, 13:30

Dobrý den, mám problém se zapsáním hodnot do databáze. Můj projekt nefunguje, a po úpěnlivém zkoumání jsem se rozhodl prostě vyzkoušet, ověřený projekt postnutý od Arduina, ale chyba je stejná. Používám lokální server WAMPSERVER
Php skript funguje jak má, pokud ho zadám do adresového řádku prohlížeče s hodnotou co chci uložit, bez problémů se uloží.
Arduino po nahrani programu se na lokální server připojí, zobrazil jsem si i hodnoty na serial monitoru, zobratí se připojení OK a hodnoty, které jsou v pořádku. Když je zase opět zadám fyzicky do adresového řádku prohlížeče, zapíší se. Proč se mě ale nezapisují přes arduino ?

Kód: Vybrat vše

#include <Ethernet.h> //Použité knihovny
#include <SPI.h>
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xEB }; //MAC adresa Arduina (posledni pismeno D)
IPAddress ip(192,168,6,130);
IPAddress server(192,168,6,10);

boolean reading = false; //Funkční podmínka

String data;

int a = A0; //Měřící piny A/D převodníku
int b = A1;
int c = A2;
int d = A3;

float av = 0; //Proměnné pro výpočet napětí
double bv = 0;
double cv = 0;
double dv = 0;

double ai = 0; //Proměnné pro výpočet napětí
double bi = 0;

int i = 255; //Počáteční hodnota PWM
int stav = 1; //Proměnná pro tlačítko MIN/MAX
float pwm = 0; //Proměnná pro zobrazení hodnoty PWM

EthernetClient client; //Konstanta pro prohlížeč

void setup()
{
  pinMode(9, OUTPUT); //PWM kanál
  Serial.begin(9600); //NAstavění sériového kanálu (nepoužit)
  Ethernet.begin(mac, ip); //Nastavení MAC a IP adresy

}

void loop()
{

  analogWrite(9, i);
  if (client.connect(server, 80)) { // REPLACE WITH YOUR SERVER ADDRESS
    delay(1000);
    Serial.println("OK");
    Serial.println("");
    client.print("GET /log_optoclen.php?");
    Serial.print("GET /log_optoclen.php?");
    client.print("pwm=");
    Serial.print("pwm=");
    client.print(pwm);
    Serial.println(pwm);
    client.println( " HTTP/1.1");
    client.println("Host: 192.168.6.10");
    //client.println( "Content-Type: application/x-www-form-urlencoded" );
    client.println( "Connection: close" );
    client.println();
    client.println();
    client.stop();
  }

  if (client.connected()) {

  }

  delay(300); // WAIT FIVE MINUTES BEFORE SENDING AGAIN
PHP skript

Kód: Vybrat vše

<?php 
$server = "localhost";
$user = "root";
$pass = "";
$db = "bakalarka";
$mysqli = mysqli_connect($server, $user, $pass, $db); //připojení k MySQL
if($mysqli and isset($_GET['pwm'])){ //pokud GET obsahuje 'hodnota', pokračuj
$pwm = sanitize($_GET['pwm']);
$sql = "INSERT INTO optoclen (pwm) VALUES (".$_GET[pwm].")"; //sestavení SQL
$doSql = $mysqli->query($sql); //vykonání SQL
if($doSql){ //test úspěchu
echo 'Zápis byl úspěšný';
}
else{
echo 'Něco se nepovedlo';
}
}
else{
echo "Neco je špatně";
}
function sanitize($input){ //ořízne řetězec
$input = htmlspecialchars($input);
$input = htmlentities($input);
$input = strip_tags($input);
$input = trim($input);
return $input;
}
?>

<?php

martinius96
Příspěvky: 579
Registrován: 01 srp 2017, 19:29
Reputation: 0
Bydliště: Poprad
Kontaktovat uživatele:

Re: Odesílání hodnot do databáze MySQL

Příspěvek od martinius96 » 21 pro 2017, 15:11

Host prepisat na: http://192.168.6.10

mikimix
Příspěvky: 6
Registrován: 21 pro 2017, 13:16
Reputation: 0

Re: Odesílání hodnot do databáze MySQL

Příspěvek od mikimix » 09 led 2018, 11:23

martinius96 píše:
21 pro 2017, 15:11
Host prepisat na: http://192.168.6.10
Nefunguje, zkoušel jsem tohle i předtím. Myslím si že to musí blokovat ten Wamp. (firewall a antivirusové programy mám vyplé)

zbysek
Site Admin
Příspěvky: 125
Registrován: 22 úno 2017, 15:18
Reputation: 0

Re: Odesílání hodnot do databáze MySQL

Příspěvek od zbysek » 09 led 2018, 13:18

Tady: https://www.arduino.cc/en/Reference/ClientConnect je kód, ve kterém loop obsahuje kód pro vypsání odpovědi serveru.

Kód: Vybrat vše

void loop()
{
  if (client.available()) {
    char c = client.read();
    Serial.print(c);
  }

  if (!client.connected()) {
    Serial.println();
    Serial.println("disconnecting.");
    client.stop();
    for(;;)
      ;
  }
}
Třeba vám server něco odpoví a pak můžeme pátrat dál (jestli požadavek něco zablokovalo ...).
Z vašeho kódu pro účely testování smažte client.stop() do loop vložte předchozí kód.

Uživatelský avatar
pavel1tu
Příspěvky: 2054
Registrován: 26 říj 2017, 08:28
Reputation: 0
Bydliště: Trutnov
Kontaktovat uživatele:

Re: Odesílání hodnot do databáze MySQL

Příspěvek od pavel1tu » 09 led 2018, 15:57

Používám úplně stejné skripty

Vyzkoušej před "client stop" dát delay, mě stačí asi 500ms ale jelikož zapisuji jednou za 5 min, mám tam 1s
UNO, NANO, Mikro, PRO mini, DUE, ESP32S2, RPi PICO
Pavel1TU
"Správně napsaný kod lze číst jako knihu"

mikimix
Příspěvky: 6
Registrován: 21 pro 2017, 13:16
Reputation: 0

Re: Odesílání hodnot do databáze MySQL

Příspěvek od mikimix » 23 led 2018, 00:13

zbysek píše:
09 led 2018, 13:18
Tady: https://www.arduino.cc/en/Reference/ClientConnect je kód, ve kterém loop obsahuje kód pro vypsání odpovědi serveru.

Kód: Vybrat vše

void loop()
{
  if (client.available()) {
    char c = client.read();
    Serial.print(c);
  }

  if (!client.connected()) {
    Serial.println();
    Serial.println("disconnecting.");
    client.stop();
    for(;;)
      ;
  }
}
Třeba vám server něco odpoví a pak můžeme pátrat dál (jestli požadavek něco zablokovalo ...).
Z vašeho kódu pro účely testování smažte client.stop() do loop vložte předchozí kód.
Pokročil jsem, opravdu to bylo nějakým způsobem blokované, ale pořád se mu něco nelíbí...NA localhostu se mě to do databáze připojilo, pak klasicky GET /pokus/log_optoclen.php?pwm=0.00 ale potom přišlo od serveru, něco se nepovedlo a spojení se ukončilo. Opět když to zadám samostatně jako localhost/pokus/log_optoclen.php?pwm=0.00, tak se to do databáze zapíše. To jsem z toho jelen :D

martinius96
Příspěvky: 579
Registrován: 01 srp 2017, 19:29
Reputation: 0
Bydliště: Poprad
Kontaktovat uživatele:

Re: Odesílání hodnot do databáze MySQL

Příspěvek od martinius96 » 23 led 2018, 00:24

Pošli celý kód :-) Vyskúšame, vysvetlíme.

cadej
Příspěvky: 7
Registrován: 13 pro 2017, 23:11
Reputation: 0

Re: Odesílání hodnot do databáze MySQL

Příspěvek od cadej » 23 led 2018, 10:30

Zkus se přes program Heidi připojit z jiného počítače na ten tvůj localhost a provést insert. Případně zkus přímo knihovnu https://github.com/ChuckBell/MySQL_Connector_Arduino , osobně odzkoušeno na Ubuntu 16.04 a MySQL, šlape parádně, ale funguje jenom se základní knihovnou ethernet, tudíž na bázi wiznetu, zkoušel jsem i upravit na enc28j60, ale nepochodil jsem.

Zkus změnit uživatele, root uživatele nedoporučuji nikdy z bezpečnostních důvodů používat, něco napíšeš blbě a máš po databázi. :)

Je dost možné že taky root uživatel, pokud není na localhostu tak má oprávnění pouze na select, na další úpravy už ne. Já si třeba nastavil, že se root může přihlásit pouze z localhostu.

Rozhodně ale otestuj knihovnu z odkazu, mám ji již delší dobu a je stabilní i na 24/7 aplikacích. :)

Též bych se chtěl ještě vyjádřit k tvému php scriptu.
Docela je zajímavé, že ti to funguje, když nemáš u $_GET[pwm] uvozovky označující proměnnou, ale kolikrát to vezme, též bych se chtěl zeptat na funkci sanitize, buďto ji tam máš zbytečně, nebo chceš ošetři opravdu vstup, ale nedopatřením používáš ve stringu pro db neošetřenou proměnnou z url.

Správně by to mělo být, pokud použiješ sanitize takto:

Kód: Vybrat vše

$sql = "INSERT INTO optoclen (pwm) VALUES ("'.$pwm.'")";

Maxim
Příspěvky: 128
Registrován: 22 led 2019, 20:32
Reputation: 0

Re: Odesílání hodnot do databáze MySQL

Příspěvek od Maxim » 16 led 2021, 16:12

Ahoj, chci se zeptat, jestli lze importovat data do SQL přímo a né přes php?

martinius96
Příspěvky: 579
Registrován: 01 srp 2017, 19:29
Reputation: 0
Bydliště: Poprad
Kontaktovat uživatele:

Re: Odesílání hodnot do databáze MySQL

Příspěvek od martinius96 » 16 led 2021, 16:37

Áno, využiješ knižnicu MySQL Connector Arduino:
https://github.com/ChuckBell/MySQL_Connector_Arduino
Priamo v examples sú príklady aj pre Arduino s Ethernetom, ESP8266 atď..

Odpovědět

Kdo je online

Uživatelé prohlížející si toto fórum: Žádní registrovaní uživatelé a 5 hostů