我一直在研究这个项目,其中一部分包括从 Raspberry 向我的服务器发送一些数据。显示温度和湿度值。但我未能将它们发送到我的数据库。之前我用urllib2库做一个HTTP请求如下:
urllib2.urlopen("localhost/Project/add_data.phptemp="+temperature+"&hum="+humidity).read()
我曾经犯过错误。所以我试着用“请求”来代替。但是还是不行。
我试图将温度和湿度值从我的树莓派发送到我的数据库 sql 的服务器代码:
<?php
// Connect to MySQL
include("connect.php");
// Prepare the SQL statement
//date_default_timezone_set('Europe/Athens');
//$dateS = date('m/d/Y h:i:s', time());
//echo $dateS;
$temperature = htmlspecialchars($_GET["temperature"]);
$humidity = htmlspecialchars($_GET["humidity"]);
$SQL = "INSERT INTO measurementdb.data (temperature,humidity) VALUES (".$temperature."','".$humidity."')";
// Execute SQL statement
mysql_query($SQL);
?>
python 代码:
import requests
import Adafruit_DHT
DHT_SENSOR = Adafruit_DHT.DHT22
DHT_PIN = 4
while True:
humidity, temperature = Adafruit_DHT.read_retry(DHT_SENSOR, DHT_PIN)
if humidity is not None and temperature is not None:
print("Temp={0:0.1f}*C Humidity={1:0.1f}%".format(temperature, humidity))
else:
print("Failed to retrieve data from humidity sensor")
data = {"temperature": temperature, "humidity": humidity}
resp = requests.post('http://localhost/test.php', params=data)
如果有人能帮助我,我将不胜感激。谢谢!
答案 0 :(得分:0)
您可能想澄清您的问题:
我假设上面的代码应该是服务器代码。
并在下面编写在树莓上运行的代码。
就像一个小的安全边注:
我不是 php 专家,但对我来说,服务器代码给人的印象是,它可能会受到 sql 注入的攻击。因此,如果我是对的,那么询问有关如何使您的服务器代码更健壮的 php 问题可能是个好主意。
SQL 注入意味着,黑客可以在您的服务器上执行任意 SQL 请求。即使是那些修改或删除数据的。
这里有一些信息:https://en.wikipedia.org/wiki/SQL_injection
潜在问题:params -> data
通常,您发布的数据应该在发布参数中,因此您应该使用 data=postparams
而不是 params=getparams
:
resp = requests.post('http://localhost/test.php', data=data)
而不是
resp = requests.post('http://localhost/test.php', params=data)
但是您展示的 PHP 代码确实使用了 $_GET
而不是 $_POST
这是故意的吗?
如果是,则继续使用 params=getparams
否则将您的 PHP 代码更改为 $_POST
并使用 data=postparams
潜在问题:数字与字符串 另一个问题是,温度和湿度可能是数字而不是字符串。
因此您可以尝试以下操作:
urllib2.urlopen("localhost/Project/add_data.php?temp="+str(emperature)+"&hum="+str(humidity)).read()
或请求:
data = {"temperature": str(temperature), "humidity": str(humidity)}
添加更多跟踪并发布精确输出
您还可以在 http 请求之前添加以下打印语句。并发布其输出:
print(repr(temperature), repr(humidity))
而且我还建议将 http post 行替换为:
resp = requests.post('http://localhost/test.php', params=data)
print(resp)
print(resp.content)
将您的 PHP 脚本也更改为以下内容:
<?php
// Connect to MySQL
include("connect.php");
// Prepare the SQL statement
//date_default_timezone_set('Europe/Athens');
$dateS = date('m/d/Y h:i:s', time());
echo "{$dateS}\n";
$temperature = htmlspecialchars($_GET["temperature"]);
echo "{$temperature}\n";
$humidity = htmlspecialchars($_GET["humidity"]);
echo "{$humidity}\n";
$SQL = "INSERT INTO measurementdb.data (temperature,humidity) VALUES (".$temperature."','".$humidity."')";
// Execute SQL statement
echo "{$SQL}\n";
$rslt = mysql_query($SQL);
echo "{$rslt}\n";
?>
请发布您的python脚本的打印结果和任何潜在的错误信息