Muszę wyodrębnić dane z pliku JSON i wstawić je do MySQL za pomocą PHP. To jest kod,

<?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
  }

Kod działa dobrze z następującym plikiem json:

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

Ale to nie działa z następującym plikiem json:

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

Nie wiem, jak poprawnie napisać zapytanie

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

Dzięki!

-1
Mariano Munarriz 3 kwiecień 2020, 17:13

4 odpowiedzi

Najlepsza odpowiedź

„nie działa z następującym plikiem json”

... to dlatego, że struktura w JSON jest inna. Powinno to być dość oczywiste - nie możesz oczekiwać, że po prostu automatycznie zadziała z dowolną dowolną strukturą danych, którą mu podasz.

Kod wymaga modyfikacji, aby odczytać nową strukturę. W tym konkretnym przypadku jest to dość trywialne - masz obiekt wewnętrzny przechowujący tablicę, więc musisz wykonać pętlę przez ten obiekt zamiast najwyższego poziomu:

Zmiana

foreach($array as $row)

Do

foreach($array["items"] as $row)
1
ADyson 3 kwiecień 2020, 14:17

Najpierw należy sparametryzować zapytanie, a następnie powiązać wartości, co chroni przed SQL Atak wtryskowy.

Pozwala to również na jednorazowe przygotowanie zapytania, ale wykonanie go z różnymi parametrami wiele razy, oszczędzając w ten sposób wycieczki w obie strony do bazy danych i wielokrotne kompilacje zapytania.

I oczywiście tablica zaczyna się od $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>";
}
2
RiggsFolly 3 kwiecień 2020, 14:31

Twój drugi obiekt Json zawiera pole „items”. Musisz więc tylko dokonać niewielkiej korekty w swoim kodzie:

    <?php
         ...
          $array = json_decode($data, true); 
          $items = $array["items"];
          foreach($items as $row){
          ...
          }
0
JBS 3 kwiecień 2020, 14:17

Korzystając z tego samego kodu, wystarczy dostosować w pętli foreach. Użyj $array['items'] instancji tylko $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
      }
-1
Goms 3 kwiecień 2020, 14:16