2017-12-06 11 views
0

APIからデータを取得してMySQLデータベースに保存しようとしています。JSON配列をループしてデータを変数に格納する方法

Notice: Trying to get property of non-object

私のJSONデータは次のようになります:

{"AttractionInfo":[{"Id":"sprookjesbos","Type":"Attraction","MapLocation":"1","State":"open","StateColor":"green","WaitingTime":0,"StatePercentage":0},{"Id":"zanggelukkig","Type":"Show","MapLocation":".","State":"gesloten","StateColor":"clear"}, 

私はこれがあると思う私はそれが私はこのエラーを取得していたすべての値を取得するかどうかを確認するためにデータをエコーし​​たいときに問題があります配列内にあるためです。このコードを使用するとエラーは発生しませんが、配列のインデックスを定義する必要があります。私のデータをループして変数に入れる最良の方法は何ですか?

<?php 

    //Get content 
    $url = "https://eftelingapi.herokuapp.com/attractions"; 
    $data = json_decode(file_get_contents($url)); 

    //Fetch data 
    $attractieId = $data->AttractionInfo[0]->Id; 
    $attractieType = $data->AttractionInfo[0]->Type; 
    $attractieStatus = $data->AttractionInfo[0]->State; 
    $attractieStatusKleur = $data->AttractionInfo[0]->StateColor; 
    $attractieWachttijd = $data->AttractionInfo[0]->WaitingTime; 
    $attractieStatusPercentage = $data->AttractionInfo[0]->StatePercentage; 

?> 

私はいくつかの解決策を見つけようとしましたが、それらはすべてforeachループです。しかし、私はそれがうまくいくとは思わない。誰かが良い方向に私を助けることができるか、またはこれを修正する可能性がどのように私に教えてください?私は経験が豊富なので、アドバイスは大歓迎です。前もって感謝します。

アップデートコード:

require 'database-connection.php'; 
//Get content 
$url = "https://eftelingapi.herokuapp.com/attractions"; 
$data = json_decode(file_get_contents($url)); 

//Fetch data 
$attractieId = isset($data->AttractionInfo->Id); 
$attractieType = isset($data->AttractionInfo->Type); 
$attractieStatus = isset($data->AttractionInfo->State); 
$attractieStatusKleur = isset($data->AttractionInfo->StateColor); 
$attractieWachttijd = isset($data->AttractionInfo->WaitingTime); 
$attractieStatusPercentage = isset($data->AttractionInfo->StatePercentage); 

$sql = "INSERT INTO attracties (attractieId, attractieType, attractieStatus, attractieStatusKleur, attractieWachttijd, attractieStatusPercentage) 
VALUES ('$attractieId', '$attractieType', '$attractieStatus', '$attractieStatusKleur', '$attractieWachttijd', '$attractieStatusPercentage')"; 
if ($db->query($sql) === TRUE) { 
    echo "success"; 
} else { 
    echo "Error: " . $sql . "<br>" . $db->error; 
} 

それは「成功」と言うが、私は私のデータベースに見たときにそれが唯一の空のデータを挿入します。すべてのアトラクションをデータベースに追加する必要があります。だから私は自分のデータをループする必要があります。私たちは、このコードを向上させることができます

$json = '{"AttractionInfo":[{"Id":"sprookjesbos","Type":"Attraction","MapLocation":"1","State":"open","StateColor":"green","WaitingTime":0,"StatePercentage":0},{"Id":"zanggelukkig","Type":"Show","MapLocation":".","State":"gesloten","StateColor":"clear"}]}'; 
    $arr = json_decode($json); 

    foreach ($arr->AttractionInfo as $key => $attraction) { 
     foreach($attraction as $key=> $value) { 
      print_r($key.' - '.$value.'<br>'); 
      $$key = $value; 
     } 
    } 

echo '<br>'; 
echo $Id; // it will be last item/attraction id. 

+2

アレイ内のすべてのオブジェクトがすべて同じ変数を持つわけではないようです。エラーを回避するには、各割り当てをisset()でラップする必要があります。 'print_r($ data);'を使って簡単にデバッグすることができ、どの部分が見逃されているのかを見て、それはプロパティーのエラーを投げません。 – IncredibleHat

+0

割り当ての周りにisset()をラップすると、もうエラーは発生しませんでした。しかし、変数をエコーし​​ようとすると、何も表示されません。それがなぜ起こっているのか知っていますか? @Randall – Baspa

+0

まあ、プロパティがない場合は、変数データはありません。それで、何もエコーアウトしてはいけません。私は願っています。 '$ test =(isset($ data-> AttractionInfo [0] - > StatePercentage)?$ data-> AttractionInfo [0] - > StatePercentage: 'OH NOを設定することで、 ! '); ' – IncredibleHat

答えて

2

$content = json_decode(file_get_contents($url)); 

foreach($content->AttractionInfo as $data){ 
     $id  = $data->Id; 
     $type = $data->Type; 
     $map  = $data->MapLocation; 
     $state = $data->State; 
     $color = $data->StateColor; 
     if(!empty($data->WaitingTime)) { 
     $time = $data->WaitingTime; 
     } 
    if(!empty($data->StatePercentage)) { 
     $percent = $data->StatePercentage; 
    } 

    //persist your data into DB.... 
} 
+0

このコードは私のために働いてくれてありがとう!今はすべてのアトラクションをデータベースに保存します – Baspa

0

私はあなたがこのようなものが必要だと思う...これを試してみてください。ちょうどどこでどのように使いたいのですか

関連する問題