【问题标题】:PHP to decode JSON array and insert into MYSQL databasePHP解码JSON数组并插入MYSQL数据库
【发布时间】:2015-04-24 14:21:17
【问题描述】:

我正在尝试创建一个 PHP 脚本来解码 JSON 数组并将其插入数据库。到目前为止,我已经设法让脚本在数组中插入第一行,仅此而已。

我需要添加什么来让脚本插入数组中的所有行?

这是数组,忽略“列表”,我还不需要那些数据(它很大): json 这是脚本:

<?php
$servername = "localhost";
$username = "root";
$password = "";

// Create connection
$con = mysql_connect($servername, $username, $password);

//select db
$selected = mysql_select_db("ed",$con);

$json_obj = file_get_contents("stations.json");

//convert to stdclass object
$arr = json_decode($json_obj,true);

//store the element values into variables

$id = $arr[0]["id"];
$name = $arr[0]["name"];
$system_id = $arr[0]["system_id"];
$max_landing_pad_size = $arr[0]["max_landing_pad_size"];
$distance_to_star = $arr[0]["distance_to_star"];
$faction = $arr[0]["faction"];
$government = $arr[0]["government"];
$allegiance = $arr[0]["allegiance"];
$state = $arr[0]["state"];
$type = $arr[0]["type"];
$has_blackmarket = $arr[0]["has_blackmarket"];
$has_commodities = $arr[0]["has_commodities"];
$has_refuel = $arr[0]["has_refuel"];
$has_repair = $arr[0]["has_repair"];
$has_rearm = $arr[0]["has_rearm"];
$has_outfitting = $arr[0]["has_outfitting"];
$has_shipyard = $arr[0]["has_shipyard"];

//insert values into mysql database
$sql="INSERT INTO stations (station_id, name, system_id, max_landing_pad_size, distance_to_star, faction, government, allegiance, state, type, has_blackmarket, has_commodities, has_refuel, has_repair, has_rearm, has_outfitting, has_shipyard) 
VALUES ('$id', '$name', '$system_id', '$max_landing_pad_size', '$distance_to_star', '$faction', '$government', '$allegiance', '$state', '$type', '$has_blackmarket', '$has_commodities', '$has_refuel', '$has_repair', '$has_rearm', '$has_outfitting', '$has_shipyard')";

if(!mysql_query($sql,$con)) //$con is mysql connection object
{
     die('Error : ' . mysql_error());
}
?>

【问题讨论】:

  • 如果它真的很大,您可以考虑另一种方法,首先创建一个查询字符串,这将使您能够创建一个插入批处理,然后运行它。或者创建一个文件然后load data local infile。这样会快得多,而不是逐行插入

标签: javascript php mysql arrays json


【解决方案1】:

试试这个。

$arr = json_decode($json_obj,true);

$sql = 'INSERT INTO stations (`';

$sql.=  implode('`,`', array_keys( $arr[0] ) );

$sql.= '`) values (\'';

$sql.=  implode('\',\'',  $arr[0]  );

$sql.= '\')';

【讨论】:

  • 当它执行此操作时我得到了:“注意:第 42 行 C:\wamp\www\index.php 中的数组到字符串转换”
  • 您需要确保 $arr[0] 具有所有 'key'=>'values' 组合。
【解决方案2】:

使用 foreach

$arr = json_decode($json_obj,true);//decode object
foreach($arr as $ar){

            $id = $ar["id"];
            $name = $ar["name"];
            $system_id = $ar["system_id"];
            $max_landing_pad_size = $ar["max_landing_pad_size"];
            $distance_to_star = $ar["distance_to_star"];
            $faction = $ar["faction"];
            $government = $ar["government"];
            $allegiance = $ar["allegiance"];
            $state = $ar["state"];
            $type = $ar["type"];
            $has_blackmarket = $ar["has_blackmarket"];
            $has_commodities = $ar["has_commodities"];
            $has_refuel = $ar["has_refuel"];
            $has_repair = $ar["has_repair"];
            $has_rearm = $ar["has_rearm"];
            $has_outfitting = $ar["has_outfitting"];
            $has_shipyard = $ar["has_shipyard"];

            //insert values into mysql database
            $sql="INSERT INTO stations (station_id, name, system_id, max_landing_pad_size, distance_to_star, faction, government, allegiance, state, type, has_blackmarket, has_commodities, has_refuel, has_repair, has_rearm, has_outfitting, has_shipyard) 
            VALUES ('$id', '$name', '$system_id', '$max_landing_pad_size', '$distance_to_star', '$faction', '$government', '$allegiance', '$state', '$type', '$has_blackmarket', '$has_commodities', '$has_refuel', '$has_repair', '$has_rearm', '$has_outfitting', '$has_shipyard')";

            if(!mysql_query($sql,$con)) //$con is mysql connection object
            {
                 die('Error : ' . mysql_error());
            }

}

【讨论】:

  • PHP 似乎抛出了一个错误:“注意:未定义的变量:第 17 行 C:\wamp\www\index.php 中的 arr”
【解决方案3】:

对于这种情况下的大量数据,您可能只想执行一次查询,否则会不必要地加重数据库的负担。为此,您可以使用插入的所有数据构建查询,然后执行它,如下所示:

<?php
$arr = json_decode($json_obj,true);//decode object
$query = "INSERT into stations (station_id, name, system_id, max_landing_pad_size, distance_to_star, faction, government, allegiance, state, type, has_blackmarket, has_commodities, has_refuel, has_repair, has_rearm, has_outfitting, has_shipyard) values ";
foreach($arr as $ar) {    
    $query .= "($ar['id'],$ar['name'],$ar['system_id'],
                $ar['max_landing_pad_size'],$ar['distance_to_star'],$ar['faction'],
                $ar['government'],$ar['allegiance'],$ar['state'],
                $ar['type'],$ar['has_blackmarket'],$ar['has_commodities'],
                $ar['has_refuel'],$ar['has_repair'],$ar['has_rearm'],
                $ar['has_outfitting'],$ar['has_shipyard']),";
}
$query = rtrim(",",$query);
if(!mysql_query($query,$con)) //$con is mysql connection object
{
    die('Error : ' . mysql_error());
}

如果您想知道,您的原始代码不起作用,因为您只是从 json ($arr[0]) 中获取第一行。您需要遍历数据以获取所有行。

【讨论】:

    猜你喜欢
    • 2017-03-19
    • 1970-01-01
    • 2012-07-21
    • 2014-04-26
    • 2015-01-18
    • 2014-03-27
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多