Warning: file_get_contents(/data/phpspider/zhask/data//catemap/8/mysql/68.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
PHP json_从API解码为sql:仅导入不包含空值的对象_Php_Mysql_Json_Mariadb - Fatal编程技术网

PHP json_从API解码为sql:仅导入不包含空值的对象

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")

虽然有很多类似的话题,但它们并没有涉及到我正在讨论的问题,所以我们非常感谢您的一点澄清

我正在用来自各种API的一些数据构建一个数据库,来自这些API的数据是JSON格式的(一些是对象,一些是数组)

我从具有更简单格式的对象开始,因此我编写了一个小PHP脚本来获取数据并将其插入指定的DB表中

/*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准备不同的语句。