ESP8266(MicroPython)POST数据至MySQL数据库失败排查
问题排查与解决方案
一、ESP8266 端 POST 数据格式问题
这是最常见的空值原因,核心是请求头与数据格式不匹配:
- 若用
json.dumps发送 JSON 数据,必须显式设置Content-Type: application/json头,否则 PHP 无法识别数据格式; - 若发送表单格式数据(如
temperature=25&humidity=60),需设置Content-Type: application/x-www-form-urlencoded; - 务必验证请求发送状态:打印响应状态码(
response.status_code)和响应内容(response.text),如果是 404/500,说明请求未到达正确页面或 PHP 内部报错。
正确示例
JSON 格式发送
import urequests import json from machine import Pin import dht # 读取DHT11数据 sensor = dht.DHT11(Pin(4)) sensor.measure() temp = sensor.temperature() humi = sensor.humidity() data = {'temperature': temp, 'humidity': humi} headers = {'Content-Type': 'application/json'} response = urequests.post('http://your-server/insert.php', data=json.dumps(data), headers=headers) # 调试用 print("发送数据:", json.dumps(data)) print("响应状态:", response.status_code) print("响应内容:", response.text) response.close()
表单格式发送
import urequests from machine import Pin import dht sensor = dht.DHT11(Pin(4)) sensor.measure() temp = sensor.temperature() humi = sensor.humidity() data = f'temperature={temp}&humidity={humi}' headers = {'Content-Type': 'application/x-www-form-urlencoded'} response = urequests.post('http://your-server/insert.php', data=data, headers=headers) # 调试用 print("发送数据:", data) print("响应状态:", response.status_code) print("响应内容:", response.text) response.close()
二、PHP 端数据接收问题
PHP 接收数据的方式必须和 ESP 发送的格式对应,否则会拿不到值:
- 如果 ESP 发 JSON:不能用
$_POST,必须读取原始请求体再解析:<?php error_reporting(E_ALL); ini_set('display_errors', 1); // 读取JSON数据 $rawData = file_get_contents('php://input'); $data = json_decode($rawData, true); // 校验参数 if (!isset($data['temperature']) || !isset($data['humidity'])) { die('错误:缺少温湿度参数'); } $temp = $data['temperature']; $humi = $data['humidity']; - 如果 ESP 发表单:直接用
$_POST,但要注意键名大小写完全匹配:<?php error_reporting(E_ALL); ini_set('display_errors', 1); if (!isset($_POST['temperature']) || !isset($_POST['humidity'])) { die('错误:缺少温湿度参数'); } $temp = $_POST['temperature']; $humi = $_POST['humidity'];
三、MySQL 写入问题
- 字段类型不匹配:如果数据库中
temperature是INT类型,但传入了非数字值(比如字符串格式的错误数据),会被 MySQL 转为空值;建议用FLOAT或DECIMAL(4,1)存储温湿度。 - 必须用预处理语句:直接拼接 SQL 容易出现格式错误,还会有注入风险:
// 数据库连接示例 $conn = new mysqli('localhost', 'db_user', 'db_pass', 'db_name'); if ($conn->connect_error) { die('数据库连接失败:' . $conn->connect_error); } // 预处理插入 $stmt = $conn->prepare("INSERT INTO sensor_data (temperature, humidity) VALUES (?, ?)"); $stmt->bind_param("dd", $temp, $humi); // "d"代表双精度浮点数,根据字段类型调整 $stmt->execute(); if ($stmt->affected_rows > 0) { echo '数据写入成功'; } else { echo '写入失败:' . $stmt->error; } $stmt->close(); $conn->close();
四、快速调试技巧
- 用工具模拟请求:用 curl 或 Postman 直接给 PHP 发请求,验证数据库是否能正常写入:
# 模拟JSON请求 curl -X POST -H "Content-Type: application/json" -d '{"temperature":25,"humidity":60}' http://your-server/insert.php # 模拟表单请求 curl -X POST -d "temperature=25&humidity=60" http://your-server/insert.php - 开启 PHP 错误显示:在 PHP 开头加上
error_reporting(E_ALL); ini_set('display_errors', 1);,直接看页面返回的错误信息(比如字段名拼写错误、数据库连接失败)。
内容的提问来源于stack exchange,提问作者Charles Marcucci
相关产品推荐
相关产品推荐

