ESP32获取Arduino随机数据存入SQL Server时Value2空值及行对齐需求
问题分析与解决
问题原因
你当前的核心问题是ESP32/Arduino每次向PHP脚本发送请求时,只携带了Value1或者Value2其中一个参数。PHP脚本收到单个参数后,执行INSERT语句时只能填充对应字段,另一个字段自然为NULL,最终导致数据库里出现大量单字段有值的拆分记录。
解决方案
方案1:修改ESP32/Arduino请求逻辑(推荐)
这是最直接且可靠的解决方式,让设备每次发送请求时同时携带Value1和Value2两个参数,构造类似这样的GET请求URL:
http://你的服务器地址/你的PHP脚本名.php?Value1=manaqg&Value2=vuwhn
你的现有PHP代码无需任何修改,就能一次性将两个值插入同一行,直接得到你期望的存储格式。
方案2:修改PHP脚本逻辑(适配无法同时传参的场景)
如果受硬件或程序限制,设备只能分开发送Value1和Value2,可以调整PHP脚本逻辑,优先更新未配对的已有记录,再考虑插入新行:
<?php $serverName = ""; $connectionOptions = array( "Database" => "", "UID" => "", "PWD" => "", ); $conn = sqlsrv_connect($serverName, $connectionOptions); if ($conn === false) { die(print_r(sqlsrv_errors(), true)); } echo "Connection Success!<br>"; if (isset($_GET['Value1']) || isset($_GET['Value2'])) { $value1 = isset($_GET['Value1']) ? $_GET['Value1'] : null; $value2 = isset($_GET['Value2']) ? $_GET['Value2'] : null; $updated = false; // 先尝试用Value1更新空Value2的记录 if ($value1 !== null) { $sql = "UPDATE dbo.ESP SET Value1 = ? WHERE Value2 IS NOT NULL AND Value1 IS NULL"; $params = array($value1); $result = sqlsrv_query($conn, $sql, $params); if ($result !== false) { $rowsAffected = sqlsrv_rows_affected($result); if ($rowsAffected > 0) { echo "Updated row with Value1: " . $value1; $updated = true; } } } // 未更新成功,尝试用Value2更新空Value1的记录 if (!$updated && $value2 !== null) { $sql = "UPDATE dbo.ESP SET Value2 = ? WHERE Value1 IS NOT NULL AND Value2 IS NULL"; $params = array($value2); $result = sqlsrv_query($conn, $sql, $params); if ($result !== false) { $rowsAffected = sqlsrv_rows_affected($result); if ($rowsAffected > 0) { echo "Updated row with Value2: " . $value2; $updated = true; } } } // 无匹配可更新的记录,插入新行 if (!$updated) { $sql = "INSERT INTO dbo.ESP (Value1, Value2) VALUES (?, ?)"; $params = array($value1, $value2); $result = sqlsrv_query($conn, $sql, $params); if ($result === false) { echo "Error inserting data: " . print_r(sqlsrv_errors(), true); } else { echo "Inserted new row with Value1: " . $value1 . " and Value2: " . $value2; } } } else { echo "Either Value1 or Value2 data must be provided in the request."; } sqlsrv_close($conn); ?>
注意:该方案仅适合低频率、无并发的数据发送场景,若多个设备同时请求,可能出现字段配对错误的问题。
验证说明
- 方案1:确保ESP32每次请求都携带两个参数,测试后数据库会直接生成包含两个字段值的同行记录;
- 方案2:先发送
Value1会插入一行仅含Value1的记录,后续发送对应的Value2时,脚本会自动匹配并更新该行,最终形成完整的同行数据。
内容的提问来源于stack exchange,提问作者drix
相关产品推荐
相关产品推荐

