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

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 16:57:01