将 JSON 传递给 PHP 不起作用

Posted

技术标签:

【中文标题】将 JSON 传递给 PHP 不起作用【英文标题】:Passing JSON to PHP not working 【发布时间】:2015-10-30 02:25:20 【问题描述】:

我一直在尝试让我的 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();
?>

如果我注释掉 $payload_dump 而是使用 $payload 并运行脚本,则该行被正确添加。但是当我在客户端调用 python 脚本时,我得到一个“响应 200”,但没有添加记录。我在 python 中的 JSON 字符串格式不正确,或者我没有正确传递值。

1) python 代码的语法/过程是什么,可以让我看到 PHP 代码实际接收到的内容。 (即将“$payload_dump”变量内容转换为字符串并发送回python脚本?

2) 如何解决上述代码?

【问题讨论】:

你试过打印$payload_dump的内容吗?它可能已经告诉你它有什么问题。 似乎相关:***.com/questions/4214231/… 客户端调用PHP脚本时,不知道如何在服务器浏览器窗口中打印PHP文件的输出。客户端上的 python 脚本由 SSH 命令行调用。这就是为什么我要求一种将有效负载数据作为响应发送回 python 的方法,以便我可以看到它实际接收到的内容。 我会尝试data = json.dumps(dict(payload=payload)) 而不是data = dict(payload=json.dumps(payload))。如果您在 php 中使用 echo,然后在 pyhton 或 response.text 中打印 response,您应该会看到您的 php 脚本输出。有关request.Responsedocs.python-requests.org/en/latest/api/#requests.Response的更多信息 【参考方案1】:

您的第一个问题是使用不应该使用的 json 标头,因为您没有发送 raw 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']

$payload_dump = $_POST['payload'];

更好的解决方案

可以直接使用requests发送json数据

response = requests.post(url, json=payload)

然后用 php 抓取它

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

【讨论】:

太棒了!答案与 endofsource 作品的建议相结合。 您的“更好的解决方案”让我节省了更多的时间。每个人都告诉你使用 urllib,这在处理具有嵌套数据级别的真实 JSON 时是垃圾。谢谢!

以上是关于将 JSON 传递给 PHP 不起作用的主要内容,如果未能解决你的问题,请参考以下文章

将 Json 数组传递给 UIPickerView 不起作用

将php变量传递给模态twitter bootstrap不起作用

ios json在使用include()时不起作用

泰语 JSON 解码不起作用

将 JSON 从 AngularJS 传递到 Springboot RestController 不起作用

将 LayoutParams 传递给 ViewGroup 不起作用