You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

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

四、快速调试技巧

  1. 用工具模拟请求:用 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
    
  2. 开启 PHP 错误显示:在 PHP 开头加上 error_reporting(E_ALL); ini_set('display_errors', 1);,直接看页面返回的错误信息(比如字段名拼写错误、数据库连接失败)。

内容的提问来源于stack exchange,提问作者Charles Marcucci

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.05 22:12:34