0

0

解决Arduino通过PHP脚本向数据库发送数据时遇到的问题

DDD

DDD

发布时间:2025-07-21 18:24:11

|

247人浏览过

|

来源于php中文网

原创

解决arduino通过php脚本向数据库发送数据时遇到的问题

本文旨在帮助解决Arduino通过PHP脚本向数据库传输数据时,PHP接收到的变量值始终为"0"的问题。通过分析Arduino代码中的HTTP请求构建方式,提供正确的代码示例,确保数据能够正确地从Arduino发送到PHP脚本,并最终存储到数据库中。

在将Arduino传感器数据传输到数据库时,常见的问题是数据在传输过程中丢失或损坏。以下是解决此问题的详细步骤和注意事项。

分析问题

从问题描述中,可以确定以下几点:

  • PHP脚本能够正常连接到数据库。
  • 直接在PHP脚本中插入固定值可以成功写入数据库。
  • Arduino代码能够连接到网络。
  • 问题出在Arduino向PHP脚本发送变量数据的过程中。

关键在于理解HTTP GET请求的正确格式。

立即学习PHP免费学习笔记(深入)”;

天工大模型
天工大模型

中国首个对标ChatGPT的双千亿级大语言模型

下载

解决方案

Arduino代码中构建HTTP请求的方式存在问题。正确的GET请求应该将参数附加到URL后面,而不是作为Content-Length发送。

以下是修改后的Arduino代码:

#include <SPI.h>
#include <Ethernet.h>
#define POWER_PIN_WATER_SENS 7
#define SIGNAL_PIN_WATER_SENS A5
#define SOUND_PIN A0
byte mac[] = {0x00, 0xAA, 0xBB, 0xCC, 0xDE, 0x02};
int waterLevel = 0;
String waterLevelString;     
EthernetClient client;
void setup() {

  Serial.begin(9600);
  pinMode(POWER_PIN_WATER_SENS,OUTPUT);
  digitalWrite(POWER_PIN_WATER_SENS, LOW);  
  Serial.println("Initialize Ethernet with DHCP:");
  if (Ethernet.begin(mac) == 0) {
    Serial.println("Failed to configure Ethernet using DHCP");
    if (Ethernet.hardwareStatus() == EthernetNoHardware) {
      Serial.println("Ethernet shield was not found.  Sorry, can't run without hardware. :(");
    } else if (Ethernet.linkStatus() == LinkOFF) {
      Serial.println("Ethernet cable is not connected.");
    }
    while (true) {
      delay(1);
    }
  }
  Serial.print("My IP address: ");
  Serial.println(Ethernet.localIP());
}

void loop() {
  switch (Ethernet.maintain()) {
    case 1:
      //renewed fail
      Serial.println("Error: renewed fail");
      break;

    case 2:
      //renewed success
      Serial.println("Renewed success");
      //print your local IP address:
      Serial.print("My IP address: ");
      Serial.println(Ethernet.localIP());
      break;

    case 3:
      //rebind fail
      Serial.println("Error: rebind fail");
      break;

    case 4:
      //rebind success
      Serial.println("Rebind success");
      //print your local IP address:
      Serial.print("My IP address: ");
      Serial.println(Ethernet.localIP());
      break;

    default:
      //nothing happened
      break;
  }
  digitalWrite(POWER_PIN_WATER_SENS, HIGH);
  delay(100);
  waterLevel = analogRead(SIGNAL_PIN_WATER_SENS);
  digitalWrite(POWER_PIN_WATER_SENS, LOW);
  Serial.print("Water: ");
  //waterLevel = 1; //debug value
  Serial.println(waterLevel);
  waterLevelString = "waterlevel=" + (String)waterLevel;


    if (client.connect("<snip>", 80)) {
    client.print("GET /arduino_connect_to_db.php?");
    client.print(waterLevelString);
    client.println(" HTTP/1.1");
    client.println("Host: <snip>");
    client.println("User-Agent: arduino");
    client.println("Accept: */*");
    client.println();
  }
    if (client.connected()) { 
    client.stop();
  }
    delay(3000);
  }

关键修改:

  • 将client.print("Content-Type: application/x-www-form-urlencoded"); 和 client.print("Content-Length: "); 相关代码移除。
  • 将client.print(waterLevelString); 附加到URL之后,形成正确的GET请求。
  • 添加User-Agent和Accept头,提高兼容性。

代码解释

  • client.print("GET /arduino_connect_to_db.php?");:这行代码开始构建GET请求,指定要访问的PHP脚本。
  • client.print(waterLevelString);:这行代码将包含水位数据的字符串附加到URL后面,作为GET请求的参数。例如,如果waterLevelString的值是"waterlevel=123",那么最终的URL将是/arduino_connect_to_db.php?waterlevel=123。
  • client.println(" HTTP/1.1");:这行代码指定HTTP协议版本。
  • client.println("Host: <snip>");:这行代码指定服务器的主机名。
  • client.println("User-Agent: arduino");:这行代码指定客户端的User-Agent,方便服务器识别客户端类型。
  • client.println("Accept: */*");:这行代码指定客户端接受的MIME类型。

注意事项

  • 确保Arduino能够正确连接到网络,并且能够访问到PHP脚本所在的服务器。
  • 检查PHP脚本中的数据库连接信息是否正确。
  • 在Arduino代码中,将<snip>替换为你的服务器的实际域名或IP地址。
  • 确保数据库表waterLevelTable中存在waterlevel字段,并且字段类型与Arduino发送的数据类型兼容。
  • 在调试过程中,可以使用串口监视器打印Arduino发送的数据,以便检查数据是否正确。

总结

通过修改Arduino代码中构建HTTP请求的方式,可以解决Arduino通过PHP脚本向数据库发送数据时遇到的问题。正确的GET请求应该将参数附加到URL后面,而不是作为Content-Length发送。同时,需要注意网络连接、数据库连接和数据类型等问题,以确保数据能够正确地从Arduino发送到PHP脚本,并最终存储到数据库中。

热门AI工具

更多
DeepSeek
DeepSeek

幻方量化公司旗下的开源大模型平台

豆包大模型
豆包大模型

字节跳动自主研发的一系列大型语言模型

WorkBuddy
WorkBuddy

腾讯云推出的AI原生桌面智能体工作台

腾讯元宝
腾讯元宝

腾讯混元平台推出的AI助手

文心一言
文心一言

文心一言是百度开发的AI聊天机器人,通过对话可以生成各种形式的内容。

讯飞写作
讯飞写作

基于讯飞星火大模型的AI写作工具,可以快速生成新闻稿件、品宣文案、工作总结、心得体会等各种文文稿

即梦AI
即梦AI

一站式AI创作平台,免费AI图片和视频生成。

ChatGPT
ChatGPT

最最强大的AI聊天机器人程序,ChatGPT不单是聊天机器人,还能进行撰写邮件、视频脚本、文案、翻译、代码等任务。

相关专题

更多
python中print函数的用法
python中print函数的用法

python中print函数的语法是“print(value1, value2, ..., sep=' ', end=' ', file=sys.stdout, flush=False)”。本专题为大家提供print相关的文章、下载、课程内容,供大家免费下载体验。

192

2023.09.27

python print用法与作用
python print用法与作用

本专题整合了python print的用法、作用、函数功能相关内容,阅读专题下面的文章了解更多详细教程。

19

2026.02.03

数据类型有哪几种
数据类型有哪几种

数据类型有整型、浮点型、字符型、字符串型、布尔型、数组、结构体和枚举等。本专题为大家提供相关的文章、下载、课程内容,供大家免费下载体验。

337

2023.10.31

php数据类型
php数据类型

本专题整合了php数据类型相关内容,阅读专题下面的文章了解更多详细内容。

224

2025.10.31

c语言 数据类型
c语言 数据类型

本专题整合了c语言数据类型相关内容,阅读专题下面的文章了解更多详细内容。

138

2026.02.12

js 字符串转数组
js 字符串转数组

js字符串转数组的方法:1、使用“split()”方法;2、使用“Array.from()”方法;3、使用for循环遍历;4、使用“Array.split()”方法。本专题为大家提供js字符串转数组的相关的文章、下载、课程内容,供大家免费下载体验。

760

2023.08.03

js截取字符串的方法
js截取字符串的方法

js截取字符串的方法有substring()方法、substr()方法、slice()方法、split()方法和slice()方法。本专题为大家提供字符串相关的文章、下载、课程内容,供大家免费下载体验。

221

2023.09.04

java基础知识汇总
java基础知识汇总

java基础知识有Java的历史和特点、Java的开发环境、Java的基本数据类型、变量和常量、运算符和表达式、控制语句、数组和字符串等等知识点。想要知道更多关于java基础知识的朋友,请阅读本专题下面的的有关文章,欢迎大家来php中文网学习。

1566

2023.10.24

C# ASP.NET Core微服务架构与API网关实践
C# ASP.NET Core微服务架构与API网关实践

本专题围绕 C# 在现代后端架构中的微服务实践展开,系统讲解基于 ASP.NET Core 构建可扩展服务体系的核心方法。内容涵盖服务拆分策略、RESTful API 设计、服务间通信、API 网关统一入口管理以及服务治理机制。通过真实项目案例,帮助开发者掌握构建高可用微服务系统的关键技术,提高系统的可扩展性与维护效率。

76

2026.03.11

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Git 教程
Git 教程

共21课时 | 4.2万人学习

Git版本控制工具
Git版本控制工具

共8课时 | 1.6万人学习

Git中文开发手册
Git中文开发手册

共0课时 | 94人学习

关于我们 免责申明 举报中心 意见反馈 讲师合作 广告合作 最新更新
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送

Copyright 2014-2026 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号