2015-04-01 2 views
3

Привет всем и спасибо за ваше терпение,Обновления MySQL таблицы из JSON с помощью PHP

Я пытаюсь написать хроны для обновления курса валют в нашей базе данных MySQL. Данные JSON, которые я получаю, выглядят так:

{ 
    "disclaimer": "Exchange rates are provided for informational purposes only, and do not constitute financial advice of any kind. Although every attempt is made to ensure quality, NO guarantees are given whatsoever of accuracy, validity, availability, or fitness for any purpose - please use at your own risk. All usage is subject to your acceptance of the Terms and Conditions of Service, available at: ", 
    "license": "Data sourced from various providers with public-facing APIs; copyright may apply; resale is prohibited; no warranties given of any kind. Bitcoin data provided by. All usage is subject to your acceptance of the License Agreement available at:", 
    "timestamp": 1427914861, 
    "base": "CAD", 
    "rates": { 
    "AED": 2.908081, 
    "AFN": 45.794285, 
    "ALL": 103.179929, 
    "AMD": 373.363817, 
    "ANG": 1.416823, 
    "AOA": 85.603315, 
    "ARS": 6.986543, 
    "AUD": 1.041048, 
    "AWG": 1.42113, 
    "AZN": 0.829254, 
    "BAM": 1.437242, 
    "BBD": 1.583432, 
    "BDT": 61.66817, 
    "BGN": 1.437963, 
    "BHD": 0.298493, 
    "BIF": 1246.009421, 
    "BMD": 0.791716, 
    "BND": 1.080918, 
    "BOB": 5.468926, 
    "BRL": 2.518805, 
    "BSD": 0.791716, 
    "BTC": 0.0032649636, 
    "BTN": 49.501403, 
    "BWP": 7.855039, 
    "BYR": 11644.270337, 
    "BZD": 1.581753, 
    "CAD": 1, 
    "CDF": 733.551108, 
    "CHF": 0.76573, 
    "CLF": 0.019475, 
    "CLP": 490.205281, 
    "CNY": 4.895048, 
    "COP": 2038.824734, 
    "CRC": 422.26163, 
    "CUC": 0.791716, 
    "CUP": 0.791726, 
    "CVE": 80.458447, 
    "CZK": 20.263721, 
    "DJF": 140.548137, 
    "DKK": 5.492318, 
    "DOP": 35.391341, 
    "DZD": 77.203651 
    } 
} 

Поскольку таблица уже существует, все, что я хочу сделать, это обновить валюты, которые мы имеем в таблице, не все валюты, что файл JSON дает мне. У нас только 7 валют в нашей таблице (она может меняться в зависимости от того, принимаем ли мы больше валют или меньше). Это код, который я придумал;

<?php 


define("_SITE_SECURED_FILES_",realpath(dirname(__FILE__)."/../../../../")."\Secured_Files"); 

// Database Credentials 
require_once(_SITE_SECURED_FILES_."\Database\credentials.mysql.php"); 

// Open Exchange Rates Credentials 
require_once(_SITE_SECURED_FILES_."\Open_Exchange_Rates\credentials.openexchangerates.php"); 

// Requested file 
// Could also be e.g. 'currencies.json' or 'historical/2011-01-01.json' 
$file = 'latest.json'; 
$base_currency = 'CAD'; 

// Open CURL session 
$ch = curl_init(); 
curl_setopt($ch, CURLOPT_URL, "http://openexchangerates_org/api/{$file}?app_id={$appId}&base={$base_currency}"); 
curl_setopt($ch, CURLOPT_RETURNTRANSFER, 1); 

// Get the data: 
$json = curl_exec($ch); 
curl_close($ch); 

// Decode JSON response: 
$exchangeRates = json_decode($json); 

foreach($exchangeRates['rates'] as $key => $value) { 
if($value) { 

//how to use json array to insert data in Database 
    mysqli_query($mysql,"UPDATE currencies SET dblRateCAD = '".$value."' WHERE strCode = '".$exchangeRates['rates']."' LIMIT 1"); 
    } 
} 


?> 

Прямо сейчас, это не работает. Я получаю

PHP Fatal error: Cannot use object of type stdClass as array on line 29: foreach($exchangeRates['rates'] as $key => $value) {

+0

Поскольку 'json_decode' дает вам объект не является массивом. http://php.net/manual/en/function.json-decode.php – developerwjk

+0

Получаемый вами JSON содержит обменные курсы как свойства объекта, а не как массив. Поскольку объект 'stdClass' не включает итератор, вам нужно извлечь скорость, прочитав каждое требуемое свойство. Для семи это не должно быть проблемой. –

ответ

1

Если вы хотите массив просто использовать json_decode($json, true) и изменять ваш запрос "UPDATE currencies SET dblRateCAD = '".$value."' WHERE strCode = '". $key ."'

// Decode JSON response: 
$exchangeRates = json_decode($json, true); 

foreach($exchangeRates['rates'] as $key => $value) { 
if($value) { 

//how to use json array to insert data in Database 
    mysqli_query($mysql,"UPDATE currencies SET dblRateCAD = '".$value."' WHERE strCode = '". $key ."' LIMIT 1"); 
    } 
} 
+0

Спасибо, он работает чудесно! Это интересно учиться! – Tommy

0

Ваш JSON декодирует объект, а не массив. И даже если бы это был массив, вы бы использовать его неправильно:

foreach($exchangeRates['rates'] as $key => $value) { 
     ^^^^^^^^^^^^^^^^^^^^^^---array 
    mysqli_query([..snip..]WHERE strCode = '".$exchangeRates['rates']."' LIMIT 1") 
               ^^^^^^^^^^^^^^^^^^^^^^^--same array 

Массив используется в строковом контексте является буквальным словом Array. например

$foo = array(); 
echo "This is an $foo"; // outputs 'This is an Array' 

И как написано, вы уязвимы для sql injection attacks.

+0

Это задание cron, и этот файл недоступен с веб-страницы, это большая проблема? Я думаю, ответ должен состоять в том, что я должен научиться предотвращать SQL-инъекцию, но на данный момент это может быть проблемой? Благодарю. – Tommy

Смежные вопросы