2016-11-14 200 views
-4

我有这样的JSON数据:JSON阵列到阵列PHP多维

{ 
     "response": { 
     "count": 212, 
     "list": [ 
      { 
      "code": "02007", 
      "name": "swept the room", 
      "rate": 750000, 
      "withValue": false 
      }, 
      { 
      "code": "02005", 
      "name": "mop room", 
      "rate": 600000, 
      "withValue": false 
      }, 
      { 
      "code": "02003", 
      "name": "buying food", 
      "rate": 175000, 
      "withValue": false 
      } 
     ] 
     }, 
     "metaData": { 
     "message": "OK", 
     "code": 200 
     } 
} 

,我有表模式是这样的:

 
mysql> desc master_service; 

    +----------------+-------------+------+-----+---------+----------------+ 
    | Field   | Type  | Null | Key | Default | Extra   | 
    +----------------+-------------+------+-----+---------+----------------+ 
    | id    | int(25)  | NO | PRI | NULL | auto_increment | 
    | code   | varchar(10) | YES |  | NULL |    | 
    | name   | varchar(20) | YES |  | NULL |    | 
    | rate   | double  | YES |  | NULL |    | 
    | withvalue  | tinyint(1) | YES |  | NULL |    | 
    +----------------+-------------+------+-----+---------+----------------+ 

和我的编码是这样。

//使用PHP PDO

include_once 'db_connect.php'; 
$data = json_decode($response, true); 

$tempservice = array(); 
if(isset($data['response']) && isset($data['response']['list'])) 
{ 
    //use foreach on ['response']['list'] index - here are teachers data stored 
    foreach($data['response']['list'] as $service)  
     $tempservice[$kesadaran['code']] = $service['name']; 
    } 

    foreach($tempservice as $key =>$value) { 
     $sql = "insert into master_service(code,name) Values ('$key','$value')"; 
     $st = $dbh->prepare($sql); 
     $st->execute ($data); 
    } 

它只能保存在代码和名称形式的数据库。我想率和withValue可以在数据库中保存

+0

删除'$ tempservice'你完全不需要它。循环你的数据并执行插入。 – brzuchal

+1

如果您是此代码的OC,请问您为什么使用准备好的声明并仍然注入数据? –

+0

你的脚本存在[SQL注入攻击]的风险(http://stackoverflow.com/questions/60174/how-can-i-prevent-sql-injection-in-php) 看看发生了什么[小鲍比表](http://bobby-tables.com/)即使 [如果你是逃避投入,它不安全!](http://stackoverflow.com/questions/5741187/sql-injection-that-gets -around-mysql-real-escape-string) 使用[prepared parameterized statements](http://php.net/manual/en/mysqli.quickstart.prepared-statements.php) – RiggsFolly

回答

-5
foreach($data['response']['list'] as $value) { 
    $sql = "insert into master_service(code,name,rate,withvalue) Values ('{$value['code']}','{$value['name']}', '{$value['rate']}', '{$value['withValue']}')"; 
    $st = $dbh->prepare($sql); 
    $st->execute ($data); 
} 

对不起,我忘了上json_decode真实参数..编辑

+1

TYPO,你可能想修改'Values('$ value) - > code'' – RiggsFolly

+0

而且OP已经使用了'json_decode($ response,true);'这个值是一个数组而不是对象 – RiggsFolly

+1

这段代码永远不会工作。另一个可接受的答案是欺诈 –

-2

你可以试试这个: -

include_once 'db_connect.php'; 
$data = json_decode($response, true); 

$tempservice = []; 
if(isset($data['response']) && isset($data['response']['list'])){ 
    //use foreach on ['response']['list'] index - here are teachers data stored 
    foreach($data['response']['list'] as $service){ 
     $withValue = ($service['withValue']) ? 1 : 0; 
     $tempservice[$service['code']] = ['name'=>$service['name'], 'rate'=>$service['rate'], 'withvalue'=>$withValue]; 
    } 
} 

foreach($tempservice as $key =>$value) { 
    $sql = "insert into master_service(code, name, rate, withvalue) Values ('$key', '".$value['name']."', '".$value['rate']."', '".$value['withvalue']."')"; 
    $st = $dbh->prepare($sql); 
    $st->execute(); 
} 

注:请修复任何语法错误。你也可以跳过创建tempservice阵列,可以执行INSERT SQL有

+0

此代码将永远不会工作 –

+0

@YourCommonSense请指出问题的位置,以便我可以轻松地解释或查看我的观点。谢谢 –

+0

大声笑。人们喜欢投票,因为它就像一个点击而不是解释。在我的代码中,我试图指出要改变的地方,并在笔记中告诉我要改正。我知道问题在哪里。但是,没有人有时间来创建环境,执行代码并将其粘贴到这里,这只是一种常识。 –

1

只需使用一个foreach循环,并添加缺少的列,无需使用重组$tempservice阵列:

include_once 'db_connect.php'; 
$data = json_decode($response, true); 

// Simplified if, checking for isset($data['response') is redundant 
if (isset($data['response']['list'])) 
{ 
    // Prepare the statement using placeholders 
    $sql = "INSERT INTO master_service (code,name,rate,withValue) VALUES (:code,:name,:rate,:withValue)"; 
    $stmt = $dbh->prepare($sql); 

    foreach($data['response']['list'] as $row) 
    { 
     // Execute query with parameters 
     $stmt->execute($row); 
    } 
} 

重要:我更换了使用占位符查询变量。这样可以防止SQL Injection的安全。我还将prepare放在循环之外,以便它在每次迭代时不会“重复”。

+1

提示:您可以将$ row直接发送到执行,确实避免了内部循环 –

+0

@YourCommonSense。使它变得更简单(可能更少出错)。我相应地更新了我的答案。 – simon