简体   繁体   English

PHP接收JSON POST数据

[英]PHP Receive JSON POST Data

I am trying to receive JSON data from an external system, and then process and save to my local DB. 我试图从外部系统接收JSON数据,然后处理并保存到我的本地数据库。 When an event triggers, the external system sends the data below to my system. 当事件触发时,外部系统将下面的数据发送到我的系统。

The external system logs show: 外部系统日志显示:

Log 1:   Date/Time: 16 August 2017 11:54:44 AM
Status: Failure
Server: Apache https://blahblah.com/abc/data.php
Status Code:    OK
Event Content:  [{"field":"_USERNAME","value":""},
{"field":"_PASSWORD","value":""},
{"field":"_TOKEN","value":""},
{"field":"_CODE","value":"L77H4XD6ZA"},
{"field":"_SUBMITTEDDATE","value":"2017.08.16.01.54"},
{"field":"_SUBMITTEDDATEEXT","value":"2017.08.16.01.54.39.610"},
{"field":"_EDITEDDATE","value":"2017.08.16.01.55"},
{"field":"_SEQUENTIALID","value":"39a1cad9-2582-e711-9477-06c7814985cc"},
{"field":"_COMPLETETYPE","value":"Complete"},
{"field":"_LANGUAGE","value":"en"},
{"field":"_TOTALTIME","value":"12.59"},{"field":"_LINKURL","value":"http%3a%2f%2fsurv.blah.com%2ftest3%3fusr%3dL77H4XD6ZA"},
{"field":"GENDER","value":"TEXT%3aFemale%3bVALUE%3a2"},
{"field":"AGE","value":"TEXT%3a40%2b-%2b44%3bVALUE%3a6"},
{"field":"STATE","value":"TEXT%3aVIC%3bVALUE%3a2"},
{"field":"END_CHC","value":"TEXT%3aComplete%3bVALUE%3a2"},
{"field":"D2H","value":""},
{"field":"D2V","value":""},
{"field":"PCODE","value":""},
{"field":"PSTATE","value":""},
{"field":"PREGION","value":""},
{"field":"STATEREGION","value":""},
{"field":"TEST1","value":""}]

So, in my php file ( https://blahblah.com/abc/data.php ) I have 所以,在我的php文件( https://blahblah.com/abc/data.php )中我有

$json = file_get_contents('php://input');
$obj = json_decode($json);

and I have been trying a foreach() loop to try and get each field and value, to then put into a database, like 我一直在尝试foreach()循环来尝试获取每个字段和值,然后放入数据库,就像

foreach($obj as $key => $value)
{
    $qry = $conn->prepare('INSERT INTO `key_value`(`db_id`, `rkey`, `rvalue`) VALUES (NULL,$key,$value)');
    $qry->execute();
}

But it isn't working, and I either get errors about the foreach loop, or if I play around with just echoing or var_dumping, I get NULL in the response, when I use the Postman or ARC Chrome API testing Apps. 但它不起作用,我要么得到关于foreach循环的错误,要么我只是使用echoing或var_dumping,当我使用Postman或ARC Chrome API测试应用程序时,我在响应中得到NULL。

So, I suspect I am on the completely wrong track of how to do this. 所以,我怀疑我是如何做到这一点的完全错误的轨道。

Can anyone help guide me back? 任何人都可以帮助指导我吗?

EDIT: I have had a look at Receive JSON POST with PHP and a few others, but the working answers aren't clear. 编辑:我已经看过使用PHP和其他几个接收JSON POST ,但工作答案不明确。

You've got a couple of problems here. 你在这里遇到了一些问题。 First, you need to pass true as the second parameter to json_decode in order to get an associative array instead of a stdClass. 首先,您需要将true作为第二个参数传递给json_decode ,以便获取关联数组而不是stdClass。 Then, when you're iterating the results, you don't need the $key, and the $value is each entry in the results array (each "row"). 然后,当您迭代结果时,您不需要$ key,$ value是结果数组中的每个条目(每个“行”)。 Try running this to see what's going on: 尝试运行它来查看发生了什么:

<?php
$json = <<<JSON
[{"field":"_USERNAME","value":""},
{"field":"_PASSWORD","value":""},
{"field":"_TOKEN","value":""},
{"field":"_CODE","value":"L77H4XD6ZA"},
{"field":"_SUBMITTEDDATE","value":"2017.08.16.01.54"},
{"field":"_SUBMITTEDDATEEXT","value":"2017.08.16.01.54.39.610"},
{"field":"_EDITEDDATE","value":"2017.08.16.01.55"},
{"field":"_SEQUENTIALID","value":"39a1cad9-2582-e711-9477-06c7814985cc"},
{"field":"_COMPLETETYPE","value":"Complete"},
{"field":"_LANGUAGE","value":"en"},
{"field":"_TOTALTIME","value":"12.59"},{"field":"_LINKURL","value":"http%3a%2f%2fsurv.blah.com%2ftest3%3fusr%3dL77H4XD6ZA"},
{"field":"GENDER","value":"TEXT%3aFemale%3bVALUE%3a2"},
{"field":"AGE","value":"TEXT%3a40%2b-%2b44%3bVALUE%3a6"},
{"field":"STATE","value":"TEXT%3aVIC%3bVALUE%3a2"},
{"field":"END_CHC","value":"TEXT%3aComplete%3bVALUE%3a2"},
{"field":"D2H","value":""},
{"field":"D2V","value":""},
{"field":"PCODE","value":""},
{"field":"PSTATE","value":""},
{"field":"PREGION","value":""},
{"field":"STATEREGION","value":""},
{"field":"TEST1","value":""}]
JSON;

$obj = json_decode($json, true);

foreach($obj as $currTuple)
{
    echo $currTuple['field'].':'.urldecode($currTuple['value'])."\n";
}

Also some of the results are url encoded, so you'll probably want to decode that before persisting. 还有一些结果是url编码的,所以你可能想要在持久化之前解码它。

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM