2017-08-16 127 views
2

我试图从外部系统接收JSON数据,然后处理并保存到我的本地数据库。当事件触发时,外部系统将以下数据发送到我的系统。PHP接收JSON POST数据

外部系统日志显示:

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":""}] 

所以,在我的PHP文件(https://blahblah.com/abc/data.php)我有

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

,我一直在尝试foreach()循环,试图让每个字段和值,然后放入数据库,就像

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

但它不工作,并且我得到有关foreach循环的错误,或者如果我只是使用echoing或var_dumping进行操作,那么当我使用Postman或ARC Chrome API测试应用程序时,我会在响应中获得NULL。

所以,我怀疑我是如何做到这一点的完全错误的轨道。

任何人都可以帮助指导我吗?

编辑:我看过Receive JSON POST with PHP和其他一些,但工作的答案并不清楚。

回答

1

这里有几个问题。首先,你需要传递true作为第二个参数json_decode为了得到一个关联数组而不是一个stdClass。然后,在迭代结果时,不需要$ key,而$ value是结果数组中的每个条目(每个“行”)。尝试运行此,看看发生了什么事情:

<?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"; 
} 

还有些结果是URL编码,所以你可能会想坚持之前器解码。

+0

谢谢@RobRuchte,就是这样。我现在能够将数据存入我的数据库! – RossS