Intereting Posts
Временная / пространственная сложность массива PHP Загрузка шаблона сопоставления файлов с использованием phpseclib Предварительная загрузка изображений с использованием PHP и jQuery – массив с запятой? Прочитайте файл и добавьте числа в массивные части. сеанс уничтожен между страницами PHP soapClient для PayPal SetExpressCheckout Ошибка аутентификации Выполнение запроса к API LinkedIn приводит к 401 Использование случайной соли sha512 с паролем sha512 Как запомнить прогресс пользователя через приложение? Группа MySQL по идентификатору продукта, но не продукт, имеющий серийный номер проверить дублирующее значение в текстовом файле / массиве с помощью php Проверьте, действителен ли открытый ключ GPG / PGP Загружаемые Mp3-файлы из заголовков php не работают Как проверить, действительны ли имена таблиц в Propel? Помогите мне улучшить рабочий процесс непрерывного развертывания

Cant отправил запрос POST на сервер с NodeMCU

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

200 INSERT INTO датчик (темп, свет) VALUES ('', '')
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; ?> 

Вы проходили мимо

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(); } ?>