使用PHP从JSON更新MySQL表


Updating MySQL table from JSON using PHP

大家好,感谢您的耐心等待,

我正在尝试写一个cron作业来更新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致命错误:无法在第29行使用stdClass类型的对象作为数组:foreach($exchangeRates['rates']作为$key=>$value){

如果您想要一个数组,只需使用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");
    }
}

您的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注入攻击。