【问题标题】:Parse JSON file in PHP and insert into SQL ----在 PHP 中解析 JSON 文件并插入 SQL ----
【发布时间】:2018-12-31 03:12:23
【问题描述】:

所以我一直在做研究,似乎没有任何方法可以正确解析我的文件。我已经尝试了这两个代码,我的数据被插入到 sql 中,但是它被插入了 3 次,第一次插入很好,而其他 2 次是空白的。这是我的 JSON 文件和代码:

JSON:

   [
  {
    "Comments": {
      "Manufacturer": "--E", 
      "Model": "----- -----  ----", 
      "BIOSFamily": "---", 
      "BIOSDate": --/--/---8", 
      "SerialNumber": "---------"
    }
  }, 
   {
    "#ComputerSystem.v1-----------ystem": {
      "/redfish/v1/Systems/1/": {
        "AssetTag": "                                ", 
        "Bios": {
          "@odata.id": "/redfish/v1/systems/1/bios/"
            }, 
            "BiosVersion": "U----------------)", 
            "Boot": {
          "BootSourceOverrideMode": "-----y", 
          "BootSourceOverrideTarget": "None", 
          "BootSourceOverrideEnabled": "Disabled", 
          "BootSo-----------arget@Redfish.AllowableValues": [
            "None", 
            "Cd", 
            "Hdd", 
            "Usb", 
            "Utilities", 
           "Diags", 
           "BiosSetup", 
            "Pxe", 
           "UefiShell"
          ]

代码:

<?php

 $connect = mysqli_connect("reserve1", 
"root", "","server_31");

 $filename = "-----.json";

 $data = file_get_contents($filename);

 $array = json_decode($data, true);

 foreach($array as $row)
    {
  $sql = "INSERT INTO servers (Model, 
    Manufacturer, BIOSFamily, 
       BIOSDate, 
    SerialNumber)  VALUES 
    ('".$row["Comments"]["Model"]."' , 
    '".$row["Comments"] 
     ["Manufacturer"]."',
   '".$row["Comments"] 
  ["BIOSFamily"]."','".$row["Comments"] 
   ["BIOSDate"]."','".$row["Comments"] 
   ["SerialNumber"]."')";
        mysqli_query($connect, $sql);
       }




    echo "Data in";

   ?>

错误:“注意:未定义的索引:评论”

我尝试过的其他 forloops 是:

foreach($data as $Comments)
{
    $sql =" INSERT INTO 
'servers'('Manufacturer','Model', 
'BIOSFamily','BIOSDate', 
'SerialNumber'), VALUES('{$Comments- 
   >Manufacturer}', '{$Comments- 
   >Model}',  
    '{$Comments->BiosFamily}', 
    '{$Comments->BiosDate}',
                 '{$Comments- 
   >SerialNumber}')";

    }

错误:“注意:试图获取非对象的属性”

重申:第一种方法确实将我的信息放到 sql 中,但这样做了 3 次,最后 2 个条目为空白。第二种方法不会向我的表中插入任何内容。


编辑:

所以我尝试了 vardump,使用文件本身,我得到的只是 NULL,复制并粘贴内容并在我得到的脚本中将其标记为 $json='content'..

 C:\Users\Administrator\Desktop\Reserve1\newtry\NEWJSONP.php:16:
array (size=1)
  0 => 
    object(stdClass)[1]
      public 'Comments' => 
        object(stdClass)[2]
         public 'Manufacturer' => string 'HPE' (length=3)
          public 'Model' => string '-------------' (length=20)
          public 'BIOSFamily' => string '---' (length=3)
          public 'BIOSDate' => string '--/--/----' (length=10)
          public 'SerialNumber' => string '-------' (length=10)
C:\Users\Administrator\Desktop\Reserve1\newtry\NEWJSONP.php:17:
array (size=1)
  0 => 
    array (size=1)
      'Comments' => 
        array (size=5)
          'Manufacturer' => string '---' (length=3)
          'Model' => string '------ ----------' (length=20)
          'BIOSFamily' => string '---' (length=3)
          'BIOSDate' => string '--/--/----' (length=10)
          'SerialNumber' => string '-------' (length=10)

【问题讨论】:

  • 你好,你试过var_dump($array)吗?编辑:也许这是一个错误,但在你的 json 中它错过了一个结束 ]
  • 这不是有效的 JSON,但如果是:foreach($array[0] as $row)
  • 对不起,我错过了“]”。我现在就试试你说的。
  • 最后两行是空白的三次?您将不得不向我们展示 json 的内容,因为您所展示的以及您所描述的是错误......不要对齐。
  • 我已经添加了我试图解析的整个 JSON 文件。

标签: php sql json parsing insert


【解决方案1】:

只需在 foreach 循环中索引第一项,因为 $array 对象仅在第一个位置维护 Comments。从var_dump 输出中查看 0 索引:

array (
  0 => 
  array (
    'Comments' => 
    array (
      'Manufacturer' => '--E',
      'Model' => '----- -----  ----',
      'BIOSFamily' => '---',
      'BIOSDate' => ' --/--/-- - 8 ',
      'SerialNumber' => '---------',
    ),
  ),
  1 => 
  array (
    '#ComputerSystem.v1-----------ystem' => 
  ...

因此,遍历 Comments 数组并使用参数化以提高可读性:

$connect = new mysqli($servername, $username, $password, $dbname);

// PREPARED STATEMENT
$sql = "INSERT INTO servers (Model, Manufacturer, BIOSFamily, BIOSDate, SerialNumber)
        VALUES(?, ?, ?, ?, ?)";

// INDEX FIRST ITEM AT 0
foreach($array[0] as $row) { 

    $stmt = $connect->prepare($sql);

    // BIND PARAMETERS (NO COMMENTS INDEX)
    $stmt->bind_param("sssss", $row["Model"], 
                               $row["Manufacturer"],
                               $row["BIOSFamily"],
                               $row["BIOSDate"],
                               $row["SerialNumber"]);

    // EXECUTE STATEMENT
    $result = $stmt->execute();    
}

【讨论】:

  • 非常感谢!虽然我没有使用你的方法,但你帮助我理解了我做错了什么。我删除了脚本中的 [cmets] 部分,它运行良好! vardump 和你的解释帮助我理解了它。再次感谢您!
  • 太棒了!乐意效劳。我确实希望您使用参数化(在 PHP 等应用层使用 SQL 的行业最佳实践)。
  • 我是新手,但我会立即就这件事进行自我教育
猜你喜欢
  • 2014-04-27
  • 1970-01-01
  • 1970-01-01
  • 2013-02-10
  • 2018-05-10
  • 2021-10-09
  • 1970-01-01
  • 1970-01-01
  • 2012-11-22
相关资源
最近更新 更多