2014-09-28 2 views
0

У меня есть файл JSON с данными, выводимыми из другой программы, и я пытаюсь импортировать эти данные в таблицу MySQL со следующими двумя проблемами.JSON to MySQL Таблица

  1. данные никогда не будут ставить в таблице и не возвращаются без ошибок, когда я эхо из вывода и ввести его вручную в базу данных она работает отлично.

  2. Данные изменяются из значений JSON при выводе в массив, необходимый для строки импорта sql (значения).

JSON:

{ 
"version" : 90200, 
"protocolversion" : 70002, 
"blocks" : 322877, 
"timeoffset" : -1, 
"connections" : 49, 
"proxy" : "", 
"difficulty" : 34661425923.97693634, 
"testnet" : false, 
"relayfee" : 0.00001000, 
"errors" : "" 
} 

PHP:

<?php 
$data = file_get_contents("data.json"); 
$array = json_decode($data, true); 
$keys = array_keys($array); 
$rows = array(); 
foreach($keys as $key) { 
    $value = $array[$key]; 
    $rows[] = "'" . $value . "'"; 
} 
echo $rows; 
$values = implode(",", $rows); 

$hostname = 'localhost'; 
$username = 'username'; 
$password = 'password'; 
$database = 'database'; 
try 
{ 
    $dbh = new PDO("mysql:host=$hostname;dbname=$database", $username, $password); 

    if($dbh) 
     echo 'Connected to database'; // echo a message saying we have connected 

    $datetime = date("Y-m-d H:i:s"); 
    $count = $dbh->exec("INSERT INTO getinfo VALUES ('','" . $datetime . "'," . $values . ""); 
    echo "Going into DB: ('','" . $datetime . "'," . $values . ")"; 
    echo $count;// echo the number of affected rows 
    $dbh = null;// close the database connection 
} 
catch(PDOException $e) 
{ 
    print_r($e); 
} 
?> 

Информация вторил, и посылается как ЗНАЧЕНИЯ:

('','2014-09-28 16:11:33','90200','70002','322880','-1','49','','34661425923.977','','1.0E-5','') 

Первые два значения ручного ввода я созданных для ID и DATE/TIME

Как вы можете видеть, выход не совпадает с входом, однако эти значения работают с ручным запросом INSERT, но не через этот скрипт (следовательно, две проблемы).

+0

Для какой цели вы хотите сохранить эти данные? Я бы сказал, хранить всю строку JSON вместо десериализации, а затем повторно сериализовать в CSV – Gervs

+0

Я хотел бы создавать графики из этих данных с течением времени и рассчитывать сохранить его таким образом было бы лучше, если бы они хранились в JSON, тогда мне понадобилось бы вытащить больше данных, чем нужно, и деконструировать на моей стороне. – medoix

ответ

2

Просто, чтобы убедиться, что я ничего не пропустил, эти различия я замечаю:

| Name  | Actual Imploded | Expected    | 
| blocks  | 322880   | 322877    | 
| difficulty | 34661425923.977 | 34661425923.97693634 | 
| relayfee | 1.0E-5   | 0.00001000   | 
| testnet | ''    | false    | 

Чтобы сохранить Precisions ваших цифровых данных, вы можете попробовать установить параметр JSON декодирования битовой маски для JSON_BIGINT_AS_STRING как это:

json_decode($data, true, 512, JSON_BIGINT_AS_STRING); 

что касается стоимости testnet, попробуйте выполнить печать с использованием $valuesvar_dump() вместо print_r() (если это то, что вы использовали). print_r() doesn't show type; false будет отображаться как пустая строка.

Наконец, не совсем понятно, почему ваша вставка SQL не работает, но попытайтесь изменить режим ошибок по умолчанию PDO на PDO::ERRMODE_EXCEPTION, чтобы любые ошибки базы данных были выбраны как исключение, чтобы вы действительно не пропустили любые ошибки базы данных.

$dbh->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION); 

Кстати, вы должны рассмотреть возможность использования prepare statements.

UPDATE

Чтобы иметь дело с более ранней версией PHP, где JSON_BIGINT_AS_STRING не поддерживается, попробуйте одной из следующих причин:

  1. Используйте preg_replace, чтобы добавить кавычки в целое: preg_replace('/("\w+"):(\d+(\.\d+)?)/', \\1:"\\2"', $data)
  2. Увеличение PHP путем добавления ini_set('precision', 20); к вашему PHP-приложению или обновления php.ini путем изменения precision = 20.
  3. Использование ServiceJSON так:
$json = new ServicesJSON(); 
$var = $json->decode($data); 
+0

спасибо isim, режим ошибок PDO работает и разрешил отправку в базу данных. – medoix

+0

JSON_BIGINT_AS_STRING не подходит для php> 5.5, и функция var_dump() тоже не работает. – medoix

+0

Согласно [docs] (http://php.net/manual/en/json.constants.php), 'JSON_BIGINT_AS_STRING' доступен с PHP 5.4.0. Я предполагаю, что вы имеете дело с более ранней версией PHP (т. Е. Php * <* 5.4)? Я обновлю свой ответ, чтобы включить способы борьбы с этим. –