将JSON传递给PHP不起作用

将JSON传递给PHP不起作用,php,python,mysql,json,Php,Python,Mysql,Json,我一直在尝试让我的python代码将SQL查询数据从运行python的客户端传输到运行PHP的web服务器,然后将数据输入到MySQL数据库 下面是模拟单行的python测试代码: #!/usr/bin/python import requests import json url = 'http://192.168.240.182/insert_from_json.php' payload = {"device":"gabriel","data_type":"data","zone

我一直在尝试让我的python代码将SQL查询数据从运行python的客户端传输到运行PHP的web服务器,然后将数据输入到MySQL数据库

下面是模拟单行的python测试代码:

    #!/usr/bin/python

import requests
import json


url = 'http://192.168.240.182/insert_from_json.php'
payload = {"device":"gabriel","data_type":"data","zone":1,"sample":5,"count":0,"time_stamp":"00:00"}
headers = {'content-type': 'application/json'}

response = requests.post(url, data=dict(payload=json.dumps(payload)), headers=headers)
print response
以下是服务器端的PHP脚本:

<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "practice";

// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
    die("Connection failed: " . $conn->connect_error);
}
echo "Connection made...";

$payload_dump = $_POST['payload']
//$payload = '{"device":"gabriel","data_type":"data","zone":1,"sample":4,"count":0,"time_stamp":"00:00"}';

$payload_array = json_decode($payload_dump,true);

//get the data_payload details
$device = $payload_array['device'];
$type = $payload_array['data_type'];
$zone = $payload_array['zone'];
$sample = $payload_array['sample'];
$count = $payload_array['count'];
$time = $payload_array['time_stamp'];

$sql = "INSERT INTO data(device, data_type, zone, sample, count, time_stamp) VALUES('$device', '$type', '$zone', '$sample', '$count', '$time')";

if ($conn->query($sql) === TRUE) {
    echo "New record created successfully";
} else {
    echo "Error: " . $sql . "<br>" . $conn->error;
}


$conn->close();
?>

您的第一个问题是使用了json头,您不应该使用这些头,因为您没有发送原始json

你的数据看起来像

{payload = {'key1': 'value1',
            'key2': 'value2' }
         }
原始json数据的格式应为:

{'key1': 'value1', 
 'key2': 'value2'}
因此,您需要从请求中删除头

response = requests.post(url, data=dict(payload=json.dumps(payload)))
其次,您需要修复丢失的分号

$payload_dump = $_POST['payload']

更好的解决方案

您可以使用请求直接发送json数据

response = requests.post(url, json=payload)
然后在php中用

$payload_array = json_decode(file_get_contents('php://input'), true);

您是否尝试过打印
$payload\u dump
的内容?它可能已经向您显示了它的错误。似乎相关:我不确定当客户端调用PHP脚本时,如何在服务器浏览器窗口中打印PHP文件的输出。客户端上的python脚本由SSH命令行调用。这就是为什么我要求将有效负载数据作为响应发送回python,以便查看它实际接收到的内容。我会尝试
data=json.dumps(dict(payload=payload))
而不是
data=dict(payload=json.dumps(payload))
。如果您在php中使用
echo
,然后在pyhton中打印
response
,或
response.text
您应该会看到php脚本输出。有关
请求.响应的更多信息
精彩绝伦!答案和endofsource的建议相结合。你们的“更好的解决方案”让我节省了更多的浪费时间。每个人都告诉您使用urllib,这在处理嵌套数据级别的真正JSON时是垃圾。非常感谢。
$payload_array = json_decode(file_get_contents('php://input'), true);