我试图处理来自网络服务的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');";
然后"十六岁"每次webservice调用我的PHP时,都会在我的表的新行中添加到正确的位置。这就是我知道我收到数据的方式。
注意:我试图简单地将$obj
添加到我的表中,只是为了查看在我尝试正确解析它之前返回的数据格式并将所有内容放在它所属的位置。
我在这里做错了什么?我认为问题出在这里($json = file_get_contents('php://input');
),但不确定还有什么可以尝试。
感谢。
答案 0 :(得分:3)
所以有一些问题
$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返回数据
答案 1 :(得分:1)
当你真的需要一个字符串时,你正试图插入一个对象。使用方法:
$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')";
您无法在对象中执行过滤和选择操作,但这是一种有效的方法来收集您不需要DB解析的数据。
如果您需要格式良好,易于阅读的结构:
$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注入攻击。请改用预备语句。