Как извлечь данные из JSON и вставить их в MySQL с помощью PHP? - PullRequest
0 голосов
/ 03 апреля 2020

Мне нужно извлечь данные из JSON фила и вставить их в MySQL с помощью PHP. Это код

<?php
  $connect = mysqli_connect("localhost", "root", "pass", "dbname"); //Connect PHP to MySQL Database
  $query = '';
  $table_data = '';
  $filename = "organizations.json";
  $data = file_get_contents($filename); //Read the JSON file in PHP
  $array = json_decode($data, true); //Convert JSON String into PHP Array
  foreach($array as $row) //Extract the Array Values by using Foreach Loop - "Inserto todos los campos en la tabla pero no muestro el 'id' en la web"
  {
   $query .= "INSERT INTO organizations(id, displayName, created) VALUES ('".$row["id"]."', '".$row["displayName"]."', '".$row["created"]."'); ";  // Make Multiple Insert Query 
   $table_data .= '
        <tr>
    <td>'.$row["displayName"].'</td>
    <td>'.$row["created"].'</td>
</tr>
   '; //Data for display on Web page
  }

Код отлично работает со следующим json файлом:

[
    {
      "id": "Y2lzY29z",
      "name": "Enterprise Edition",
      "totalUnits": 1000,
      "consumedUnits": 1
    },
    {
      "id": "MGUzZjBj",
      "name": "Messaging",
      "totalUnits": 1000,
      "consumedUnits": 0
    }
]   

Но он не работает со следующим json файлом:

{
  "items": [
    {
      "id": "Y2lzY29z",
      "name": "Enterprise Edition",
      "totalUnits": 1000,
      "consumedUnits": 1
    },
    {
      "id": "MGUzZjBj",
      "name": "Messaging",
      "totalUnits": 1000,
      "consumedUnits": 0
    }
  ]
}

Я не знаю, как правильно написать запрос

$query .= "INSERT INTO organizations
                    (id, displayName, created) 
            VALUES ('".$row["id"]."', '".$row["displayName"]."', 
                    '".$row["created"]."');

Спасибо!

Ответы [ 4 ]

2 голосов
/ 03 апреля 2020

Сначала вы должны параметризовать запрос, а затем связать значения, это защитит от SQL Атака инъекцией .

Это также позволяет вам подготовить запрос один раз, но выполнить его с другим параметром много раз, сохраняя, таким образом, повторные обращения к базе данных и несколько компиляций запроса.

И, конечно, массив начинается с $array['items']

<?php
//Connect PHP to MySQL Database
$connect = mysqli_connect("localhost", "root", "pass", "dbname"); 

$filename = "organizations.json";
$data = file_get_contents($filename); //Read the JSON file in PHP
$array = json_decode($data, true); //Convert JSON String into PHP Array

//prepare the query once
$query = "INSERT INTO organizations
                    (id, displayName, created) 
            VALUES (?,?,?)"; 
$stmt = $connect->prepare($query);

foreach($array['items'] as $row) {
    $stmt->bind_param('iss',  $row['id'], $row['displayName'], $row['created']);
    $stmt->execute();

    $table_data .= "<tr>
            <td>$row[displayName]</td>
            <td>$row[created]</td>
        </tr>";
}
1 голос
/ 03 апреля 2020

"он не работает со следующим json файлом"

... это потому, что структура в JSON отличается. Это должно быть довольно очевидно - вы не можете ожидать, что он просто автоматически будет работать с любой произвольной структурой данных, которую вы ему предоставите.

Код необходимо изменить, чтобы прочитать новую структуру. В этом конкретном случае c это довольно тривиально - у вас есть внутренний объект, содержащий массив, поэтому вам нужно l oop через этот объект вместо верхнего уровня:

Изменить

foreach($array as $row)

до

foreach($array["items"] as $row)
0 голосов
/ 03 апреля 2020

Ваш второй Json объект имеет поле "items". Так что вам просто нужно внести небольшую корректировку в свой код:

    <?php
         ...
          $array = json_decode($data, true); 
          $items = $array["items"];
          foreach($items as $row){
          ...
          }
0 голосов
/ 03 апреля 2020

С тем же кодом, вам просто нужно настроить в foreach l oop. Используйте $array['items'] вместо $array

  <?php
      $connect = mysqli_connect("localhost", "root", "pass", "dbname"); //Connect PHP to MySQL Database
      $query = '';
      $table_data = '';
      $filename = "organizations.json";
      $data = file_get_contents($filename); //Read the JSON file in PHP
      $array = json_decode($data, true); //Convert JSON String into PHP Array
      foreach($array['items'] as $row) //Extract the Array Values by using Foreach Loop - "Inserto todos los campos en la tabla pero no muestro el 'id' en la web"
      {
       $query .= "INSERT INTO organizations(id, displayName, created) VALUES ('".$row["id"]."', '".$row["displayName"]."', '".$row["created"]."'); ";  // Make Multiple Insert Query 
       $table_data .= '
            <tr>
        <td>'.$row["displayName"].'</td>
        <td>'.$row["created"].'</td>
    </tr>
       '; //Data for display on Web page
      }
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...