基于RFID与NODEMCU的考勤系统:POST请求PHP无法接收数据
问题分析与解决方案
核心排查方向及修复步骤
1. 修正NODEMCU的POST请求格式
确保请求头和数据编码方式匹配,这是最常见的问题点:
修正后的Arduino代码片段
#include <ESP8266WiFi.h> #include <ESP8266HTTPClient.h> const char* ssid = "你的WiFi名称"; const char* password = "WiFi密码"; const char* serverURL = "http://你的服务器地址/attendance.php"; void setup() { Serial.begin(115200); WiFi.begin(ssid, password); while (WiFi.status() != WL_CONNECTED) { delay(500); Serial.print("."); } Serial.println("\nWiFi连接成功"); } void loop() { if(WiFi.status() == WL_CONNECTED){ HTTPClient http; http.begin(serverURL); // 必须添加对应格式的Content-Type头 http.addHeader("Content-Type", "application/x-www-form-urlencoded"); // 键值对格式构造POST数据 String postData = "rfid_uid=1A2B3C4D&student_id=2024001"; int httpCode = http.POST(postData); if(httpCode > 0){ String response = http.getString(); Serial.printf("响应码:%d\n", httpCode); Serial.println("服务器返回:" + response); } else { Serial.printf("请求失败,错误信息:%s\n", http.errorToString(httpCode).c_str()); } http.end(); } delay(5000); }
2. 调整PHP的接收逻辑
根据请求格式选择正确的接收方式,避免格式不匹配导致收不到数据:
修正后的PHP代码
<?php // 接收表单编码的POST数据(对应上面的Content-Type) if(isset($_POST['rfid_uid']) && isset($_POST['student_id'])){ $rfid = $_POST['rfid_uid']; $studentId = $_POST['student_id']; echo "已接收数据:RFIDUID=" . $rfid . ",学生ID=" . $studentId; } else { // 兼容raw格式数据(比如直接发送JSON的情况) $rawData = file_get_contents('php://input'); if(!empty($rawData)){ echo "已接收Raw数据:" . $rawData; } else { echo "无数据接收"; } } ?>
3. 验证网络请求细节
从你的流量截图中重点确认:
- 请求头是否包含
Content-Type字段,且与发送的数据格式一致 - 请求体中是否存在实际的键值对或数据内容
- 服务器响应的HTTP状态码是否为200(确认请求已抵达服务器)
4. 服务器环境排查
- 检查PHP配置中
post_max_size、upload_max_filesize(避免小配置限制数据接收) - 查看服务器错误日志(Apache/NGINX的error.log),确认是否有PHP执行报错
- 确保服务器未启用防火墙或安全规则拦截POST请求
快速验证方法
先用curl工具模拟请求,定位问题点:
curl -X POST -d "rfid_uid=1A2B3C4D&student_id=2024001" http://你的服务器地址/attendance.php
若curl请求能正常收到数据,说明问题在NODEMCU代码;若curl也收不到,说明PHP或服务器配置有问题。
内容的提问来源于stack exchange,提问作者m0rbot
相关产品推荐
相关产品推荐

