Не могу отправить запрос POST на сервер с NodeMCU

У меня есть NodeMCU, запрограммированный на языке Arduino. Я пытаюсь отправить некоторые данные с моих датчиков в скрипт PHP на моем сервере, который затем записывает данные на сервер MySQL. При запуске через URL скрипт работает нормально, но когда я пытаюсь отправить значения из своего кода, я получаю эту ошибку

200
Датчик INSERT INTO (температура, свет)
ЦЕННОСТИ (», »)
SQLSTATE [HY000]: общая ошибка: 1366 Неверное целочисленное значение: » для столбца ‘temp’ в строке 1

Теперь я понимаю, что это происходит потому, что в скрипт PHP не отправляются данные, а пустое пространство не является целым числом.

Вот код на NodeMCU

#include <ESP8266HTTPClient.h>
#include <ESP8266WiFi.h>

void setup() {

Serial.begin(115200);                                  //Serial connection
WiFi.begin("ssid", "password");   //WiFi connection

while (WiFi.status() != WL_CONNECTED) {  //Wait for the WiFI connection completion

delay(500);
Serial.println("Waiting for connection");

}

}

void loop() {

if(WiFi.status()== WL_CONNECTED){   //Check WiFi connection status

HTTPClient http;    //Declare object of class HTTPClient

http.begin("http://server_public_ip_address/test3.php");      //Specify request destination
http.addHeader("Content-Type", "text/plain");  //Specify content-type header

int httpCode = http.POST("?temp=20&light=88");   //Send the request
String payload = http.getString();                  //Get the response payload

Serial.println(httpCode);   //Print HTTP return code
Serial.println(payload);    //Print request response payload

http.end();  //Close connection

}else{

Serial.println("Error in WiFi connection");

}

delay(3000);  //Send a request every 30 seconds

}

Я подозреваю, что проблема где-то в http.addHeader("Content-Type", "text/plain"); или же int httpCode = http.POST("?temp=20&light=88"); линий.

Также это просто тестовая программа. Окончательная программа будет принимать переменные в этой строке int httpCode = http.POST("?temp=20&light=88"); вместо цифр. Так как мне это написать?

РЕДАКТИРОВАТЬ:
Добавление сценария PHP также

<?php
$servername = "localhost";
$username = "root";
$password = "*************";
$dbname = "testbox1";

try {
$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
// set the PDO error mode to exception
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$temp = $_GET["temp"];
$light = $_GET["light"];
$sql = "INSERT INTO sensor (temp, light)
VALUES ('$temp', '$light')";
// use exec() because no results are returned
$conn->exec($sql);
echo "New record created successfully";
}
catch(PDOException $e)
{
echo $sql . "<br>" . $e->getMessage();
}

$conn = null;
?>

0

Решение

Вы проходили

http.POST ( «? Темп = 20&свет = 88» )

Который должен быть как

http.POST ( «Темп = 20&свет = 88» )

и заголовок

http.addHeader («Content-Type», «text / plain»)

в основном используется для отправки простого текста, вы можете обратиться к документы заголовка типа контента здесь. Поскольку вы отправляете данные формы, это следует использовать

http.addHeader («Content-Type», «application / x-www-form-urlencoded»)

Следующий код должен решить вашу проблему.

#include <ESP8266HTTPClient.h>
#include <ESP8266WiFi.h>

void setup() {

Serial.begin(115200);                                  //Serial connection
WiFi.begin("ssid", "password");   //WiFi connection

while (WiFi.status() != WL_CONNECTED) {  //Wait for the WiFI connection completion

delay(500);
Serial.println("Waiting for connection");

}

}

void loop() {

if(WiFi.status()== WL_CONNECTED){   //Check WiFi connection status

HTTPClient http;    //Declare object of class HTTPClient

http.begin("http://server_public_ip_address/test3.php");      //Specify request destination
http.addHeader("Content-Type", "application/x-www-form-urlencoded");  //Specify content-type header

int httpCode = http.POST("temp=20&light=88");   //Send the request
String payload = http.getString();                  //Get the response payload

Serial.println(httpCode);   //Print HTTP return code
Serial.println(payload);    //Print request response payload

http.end();  //Close connection

}else{

Serial.println("Error in WiFi connection");

}

delay(3000);  //Send a request every 30 seconds

}

Используйте это как ваш PHP-файл для просмотра отправленных значений:

<?php
print_r($_POST);
?>

Проблема была с вашим PHP-скриптом. Вы должны использовать $ _POST, вместо $ _GET. Также произошла небольшая ошибка в вашем синтаксисе PDO. Я пытался это исправить. Проверь это:

<?php
$servername = "localhost";
$username = "root";
$password = "*************";
$dbname = "testbox1";

try {
$conn = new PDO("mysql:host=$servername;dbname=$dbname", $username, $password);
// set the PDO error mode to exception
$conn->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);
$temp = $_POST["temp"];
$light = $_POST["light"];
$sql = $conn->prepare("INSERT INTO sensor (temp, light) VALUES (?, ?)");
$sql->bindParam(1, $temp);
$sql->bindParam(2, $light);
$sql->execute();
echo "New record created successfully";
}
catch(PDOException $e)
{
echo $sql . "<br>" . $e->getMessage();
}
?>
1

Другие решения

Других решений пока нет …