PHP json_从API解码为sql:仅导入不包含空值的对象
虽然有很多类似的话题,但它们并没有涉及到我正在讨论的问题,所以我们非常感谢您的一点澄清 我正在用来自各种API的一些数据构建一个数据库,来自这些API的数据是JSON格式的(一些是对象,一些是数组) 我从具有更简单格式的对象开始,因此我编写了一个小PHP脚本来获取数据并将其插入指定的DB表中PHP json_从API解码为sql:仅导入不包含空值的对象,php,mysql,json,mariadb,Php,Mysql,Json,Mariadb,虽然有很多类似的话题,但它们并没有涉及到我正在讨论的问题,所以我们非常感谢您的一点澄清 我正在用来自各种API的一些数据构建一个数据库,来自这些API的数据是JSON格式的(一些是对象,一些是数组) 我从具有更简单格式的对象开始,因此我编写了一个小PHP脚本来获取数据并将其插入指定的DB表中 /*CONECT TO DB - TESTING ON LOCAL MACHINE*/ $connect = mysqli_connect("localhost", "root", "", "test")
/*CONECT TO DB - TESTING ON LOCAL MACHINE*/
$connect = mysqli_connect("localhost", "root", "", "test"); //Connect PHP to MySQL Database
$query = '';
/*CLEAR/TRUNCATE TABLE TO REFRESH ALL CONTENTS FROM API*/
$ins_qry = "TRUNCATE TABLE Derivatives";
mysqli_query($connect,$ins_qry);
$url = "https://api.xxxxxxxx";
$content = file_get_contents($url);
$jsonData = json_decode($content, true);
foreach ( $jsonData as $id=>$row ) {
$insertPairs = array();
foreach ($row as $key=>$val) {
$insertPairs[addslashes($key)] = addslashes($val);
}
$insertKeys = '`' . implode('`,`', array_keys($insertPairs)) . '`';
$insertVals = '"' . implode('","', array_values($insertPairs)) . '"';
/*JUST FOR CHECKING RESULTS ON PAGE*/
echo "INSERT INTO Derivatives ({$insertKeys}) VALUES ({$insertVals});" . "\n";
/*THE QUERY*/
$query = "INSERT INTO Derivatives ({$insertKeys}) VALUES ({$insertVals});" . "\n";
if (mysqli_multi_query($connect, $query)) ;
}
mysqli_close($connect);
JSON数据如下所示:
[
{
"market": "OKEx (Futures)",
"symbol": "BTC-USD-SWAP",
"coin_id": "bitcoin",
"index_id": "OkexSwap-BTC",
"price": "9520.5",
"price_percentage_change_24h": 4.801690829232852,
"contract_type": "perpetual",
"index": 9526.418,
"basis": 0.06216060080878105,
"spread": null,
"funding_rate": 0.011057,
"open_interest": 116495100,
"volume_24h": 466882900,
"last_traded_at": 1592306177,
"expired_at": null
},
.
.
.
]
INSERT INTO Derivatives
(`market`,`symbol`,`coin_id`,`index_id`,`price`,
`price_percentage_change_24h`,`contract_type`,
`index`,`basis`,`spread`,`funding_rate`,
`open_interest`,`volume_24h`,`last_traded_at`,
`expired_at`)
VALUES ("OKEx (Futures)","BTC-USD-SWAP","bitcoin","OkexSwap-BTC","9504.2",
"0.86279170955863","perpetual","9506.228","0.021337934807759",
"","-0.004262","111364600","411804300","1592331559","");
请注意,一些随机位置的值为null,例如,在“排列”和“过期位置”上方的对象中为null,在下一个对象上可以为其他对象,在其他一些对象上,所有值都存在
根据我的代码中的回音和上面的示例,我得到如下结果:
[
{
"market": "OKEx (Futures)",
"symbol": "BTC-USD-SWAP",
"coin_id": "bitcoin",
"index_id": "OkexSwap-BTC",
"price": "9520.5",
"price_percentage_change_24h": 4.801690829232852,
"contract_type": "perpetual",
"index": 9526.418,
"basis": 0.06216060080878105,
"spread": null,
"funding_rate": 0.011057,
"open_interest": 116495100,
"volume_24h": 466882900,
"last_traded_at": 1592306177,
"expired_at": null
},
.
.
.
]
INSERT INTO Derivatives
(`market`,`symbol`,`coin_id`,`index_id`,`price`,
`price_percentage_change_24h`,`contract_type`,
`index`,`basis`,`spread`,`funding_rate`,
`open_interest`,`volume_24h`,`last_traded_at`,
`expired_at`)
VALUES ("OKEx (Futures)","BTC-USD-SWAP","bitcoin","OkexSwap-BTC","9504.2",
"0.86279170955863","perpetual","9506.228","0.021337934807759",
"","-0.004262","111364600","411804300","1592331559","");
(不要为某些值更改而烦恼,因为它们在不同的时间获取,这只是一个示例)
请注意,空值现在转换为“”
在DB本身上检查表时会发生的情况是,在预期的近500个对象中,我只有60个,这60个是JSON文件中完整的对象,它们没有空值
每个对象上都有一个空值,它不会进入数据库
我曾尝试编写代码,将查询语句中的“”改为“Null”,但如果我在phpmyadim上尝试这样做只是为了检查它,则会出现错误,因为缺少的字段是float或timestamp,并且DB不接受“Null”字符串或空“”
创建该表是为了在这些字段上接受空值,问题是PHP使用“”发送查询,因此我无法发送所有对象
有什么想法吗?谢谢
(我知道我可以作为JSON导入,但我真的希望有一个包含所有行的常规表)例如
<?php
$arr = ['a', '', null];
$values = join(', ', array_map(function ($value) {
return $value === null ? 'NULL' : "'$value'";
}, $arr));
var_dump($values); // string(13) "'a', '', NULL"
感谢@Dharman的详细链接,我知道,这只是一个预测试,检查我如何将标准API实现到SQL,请参阅我对Ramon的评论,现在我将继续改进并保护它,但每次新的API调用都会刷新数据。第二,我将测试它谢谢你,非常感谢,它很有效。关于SQL注入的担忧:此脚本仅由服务器通过cronjob使用,而不是由任何用户使用,并且每次运行它时都会清除表,这只是为了保持来自具有调用限制的API源的更新表,这样我就可以随时使用数据,并且只需每X次调用API。我将得到的不同API响应的结构会有所不同,因此我需要一种方法来简化事情,而不是为所有不同的API准备不同的语句。