如何在PHP中将动态JSON数据存储到数据库中?

时间:2017-08-13 00:55:46

标签: php json

我收到了一个JSON数据,它从URL返回最后一个比特币的股票代码。数据(自动收报机)在60秒内更新。如何将所有代码动态保存到数据库中?我想创建比特币代码的历史。

请遵循以下代码。

<?php
// init curl object    
    $ch = curl_init();

// define options
$optArray = array(
    CURLOPT_URL => 'https://www.mercadobitcoin.net/api/v2/ticker/',
    CURLOPT_RETURNTRANSFER => 1,
    CURLOPT_TIMEOUT => 60

);

// apply those options
curl_setopt_array($ch, $optArray);

// execute request and get response
$response = curl_exec($ch);
$phpArray = json_decode ($response);

 ?>

1 个答案:

答案 0 :(得分:1)

首先,您不应该将JSON数据存储在数据库中(或将其他序列化数据存储为数据库中的列)。那是SQL代码最高阶的气味。相反,解码JSON并存储实际值。

这里有一张桌子给你:

CREATE TABLE `so`.`ticker_history` (
  `ticker_history_id` INT NOT NULL AUTO_INCREMENT,
  `ticker_history_high` DECIMAL(10,10) NULL,
  `ticker_history_low` DECIMAL(10,10) NULL,
  `ticker_history_vol` DOUBLE NULL,
  `ticker_history_last` DECIMAL(10,10) NULL,
  `ticker_history_buy` DECIMAL(10,10) NULL,
  `ticker_history_sell` DECIMAL(10,10) NULL,
  `ticker_history_date` DATETIME NULL,
  PRIMARY KEY (`ticker_history_id`));

现在,这里有一些更新的(未经测试的)代码:

<?php
// init curl object    
    $ch = curl_init();

// define options
$optArray = array(
    CURLOPT_URL => 'https://www.mercadobitcoin.net/api/v2/ticker/',
    CURLOPT_RETURNTRANSFER => 1,
    CURLOPT_TIMEOUT => 60

);

// apply those options
curl_setopt_array($ch, $optArray);

// execute request and get response
$response = curl_exec($ch);
$phpArray = json_decode ($response);

$dsn = 'mysql:dbname=testdb;host=127.0.0.1';
$user = 'dbuser';
$password = 'dbpass';

try {
    $dbh = new PDO($dsn, $user, $password);
} catch (PDOException $e) {
    echo 'Connection failed: ' . $e->getMessage();
}


$sql = "INSERT INTO `so`.`ticker_history`
        ( `ticker_history_high`
        , `ticker_history_low`
        , `ticker_history_vol`
        , `ticker_history_last`
        , `ticker_history_buy`
        , `ticker_history_sell`
        , `ticker_history_date`
        )
        VALUES
        ( :ticker_history_high
        , :ticker_history_low
        , :ticker_history_vol
        , :ticker_history_last
        , :ticker_history_buy
        , :ticker_history_sell
        , :ticker_history_date
        )";


$date = new DateTime(strtotime("@" . $phpArray->date ));

$values = [ 'ticker_history_high' = $phpArray->high
          , 'ticker_history_low'  = $phpArray->low
          , 'ticker_history_vol'  = $phpArray->vol
          , 'ticker_history_last' = $phpArray->last
          , 'ticker_history_buy'  = $phpArray->buy
          , 'ticker_history_sell' = $phpArray->sell
          , 'ticker_history_date' = $date->format("Y-m-d H:i:s")
          ];

$stmt = $dbh->prepare($sql);
$result = $stmt->execute($values);

if($result === false) die($stmt->errorInfo()[2] . " @ " . __FILE__ . ":" . __LINE__);

注意我使用十进制10,10作为数据类型。您应该查找最大有效位数并进行相应调整。

不断检查

PHP不是像这样做实时源的最佳选择。它的多线程模型不如Python。而且,如果在Apache中运行,它会启动一个线程,工作并结束请求。但是 - 并不是说​​它无法完成:为了不断轮询,您需要从命令行启动它,并构建一个以给定间隔轮询相关URL的循环。一个简单的while()循环执行你的curl语句并查找更改就足够了。检测到更改时(当前返回json!== last return json),然后将新值存储在数据库中。

您还需要担心重击服务器并让自己被禁止。经常检查,你可能会被防火墙挡住。

另外......通常......如果您正在处理实时订阅源,您将能够打开套接字并接收从主机发送的数据。你可以用PHP做到这一点,但是,与其他语言相比,它很笨拙。这仅仅是一个FYI ...因为您的上述用例特定于从您的问题中的URL请求JSON值。