处理 JSON 格式的 POST 请求
Posted
技术标签:
【中文标题】处理 JSON 格式的 POST 请求【英文标题】:Handle POST request in JSON format 【发布时间】:2016-11-15 08:17:32 【问题描述】:我正在尝试处理来自网络服务的 POST 请求。它正在发送这样的 HTTP POST 请求:
"latitude":"12.232",
"longitude":"123.323"
它发布到我服务器上的 php 文件。我知道它肯定会击中文件。但是,我没有得到数据。
在我的 PHP 中,我有这个(省略了一堆东西:
$json = file_get_contents('php://input');
$obj = json_decode($json);
$mine ="sixteen"; //using this for a test
$sql = "INSERT INTO rr_emergency (random) VALUES('$obj');";
$result = $dbh->query($sql)->fetchAll(PDO::FETCH_ASSOC);
这不会改变我的数据库。
如果我这样做:
$sql = "INSERT INTO rr_emergency (random) VALUES('$mine');";
然后,每次 web 服务调用我的 PHP 时,都会在我的表中新行的正确位置添加“十六”。这就是我知道我正在接收数据的方式。
注意:我试图简单地将 $obj
添加到我的表中,只是为了查看返回的数据格式,然后再尝试正确解析它并将所有内容放在它所属的位置。
我在这里做错了什么?我认为问题出在 ($json = file_get_contents('php://input');
),但不知道还能尝试什么。
谢谢。
【问题讨论】:
您不能将 PHP 对象存储到 mysql 表列中。$obj = json_decode($json);
的结果是 PHP 对象而不是字符串
在查询代码中添加一些错误检查,您可能会看到有用的错误消息。
你不能用$_POST['latitude'];
得到值吗?我猜 JSON 不允许?
@ntgCleaner 认为这可能有效,它确实成功地向数据库添加了一个新条目,但它完全是空的。
【参考方案1】:
所以有一些问题
$obj = json_decode($json);
这将返回一个object
。你想要一个array
$obj = json_decode($json, true);
那么你的 PDO 不正确
$sql = "INSERT INTO rr_emergency (random) VALUES(:val);";
$prep = $dbh->prepare($sql);
foreach($obj as $row) $prep->execute([':val' => $row]);
这将正确插入您的数据(使用准备好的语句)并遍历 JSON 返回数据
【讨论】:
这完全把我带到了我需要去的地方。问题是这样的:$obj = json_decode($json, true);
,然后我可以执行$first =$obj['latitude'];
,然后使用该变量将正确的数据放入我的表中。循环不是必需的,但我可以根据我的问题看到你从哪里得到的。谢谢!【参考方案2】:
当你真的需要一个字符串时,你正试图插入一个对象。使用:
$obj = json_decode($json, true)
$obj_str = implode(", ", $obj);
$sql = "INSERT INTO rr_emergency (random) VALUES('$obj_str');";
在我发布以上内容后,您补充说:
我试图简单地将 $obj 添加到我的表中只是为了查看数据 格式
对象本身不会转换为字符串,因此将$obj
放在查询中是行不通的。我需要时将对象存储在数据库中的方式是直接存储 JSON 表示法。
$json = file_get_contents("php://input");
$sql = "INSERT INTO rr_emergency (random) VALUES('$json')";
您将失去在对象中执行过滤和选择操作的能力,但这是一种打包数据的有效方法,您不需要数据库解析。
如果您需要格式良好、易于阅读的结构:
$obj = json_decode($json);
$obj_str = print_r($obj,true); //store formatted string
$sql = "INSERT INTO rr_emergency (random) VALUES('$obj_str');";
如果如你所说,只需要“只看数据格式”,我建议回显到屏幕或写入日志文件;执行以下操作之一。打印到屏幕:
print_r($obj);
写入文件:
$filepath = "/path/to/file.txt"
file_put_contents($filepath,print_r($obj,true));
重要提示
直接在数据库查询中输入文本而不转义会使您容易受到 SQL 注入攻击。请改用准备好的语句。
【讨论】:
以上是关于处理 JSON 格式的 POST 请求的主要内容,如果未能解决你的问题,请参考以下文章