2016-07-13 3 views
1

私は(それだけの作品)伝説APIのリーグを呼び出し、応答の下に取得しています:私は、各配列の値を解析し、MySQLのDBに挿入する変数としてそれらを定義する必要がありPHPとLeague of Legends API - MySQLデータベースに挿入するユニークな名前のJSON配列で変数を定義するには?

{ 
"data": { 
"Thresh": { 
    "id": 412, 
    "key": "Thresh", 
    "name": "Thresh", 
    "title": "the Chain Warden" 
}, 
"Aatrox": { 
    "id": 266, 
    "key": "Aatrox", 
    "name": "Aatrox", 
    "title": "the Darkin Blade" 
}, 
"Tryndamere": { 
    "id": 23, 
    "key": "Tryndamere", 
    "name": "Tryndamere", 
    "title": "the Barbarian King" 
}, … 

新しい行として。私は1つの配列(これは私のPHPで見られるThreshのために)のためにこれを行うことができます。

// Call API 
$data = file_get_contents($api); 

// Convert response to JSON array 
$jsonarray = json_decode($data, true); 

// Parse array values 
$riot_id = $jsonarray['data']['Thresh']['id']; 
$riot_key = $jsonarray['data']['Thresh']['key']; 
$riot_name = $jsonarray['data']['Thresh']['name']; 
$riot_title = $jsonarray['data']['Thresh']['title']; 

// SQL to insert 
$query = $mysqli->query("INSERT INTO champions (riot_id, riot_key, riot_name, riot_title) VALUES ('$riot_id','$riot_key','$riot_name','$riot_title')"); 

// Display result 
if ($query === TRUE) { 
printf("success"); 
     } else { 
printf("failed: " . $query . "<br>" . $mysqli->error); 
} 

どのように私は各配列から値を取得し、一度にこれを行うことなく、新しい行としての私のdbにそれらを挿入することができますか?

+0

をPHPでMySQLの一括挿入、私は[この(http://stackoverflow.com/questions/779986/insert-multiple-rows-via-a-php-array-into-mysql)を提案します。 –

+0

_ "各**配列から値を取得するにはどうしたらいいですか?"、それは終わりです:[** foreach **](http://php.net/manual/en/control-structures.foreach。 php) – FirstOne

答えて

0

ちょうどその単一のステートメントでそれらを実行し、クエリを構築するためにforeachループを使用します。 1回のループで1回実行するよりはるかに高速です。

私はSQLインジェクションの保護(あなたのコードがそれをエスケープせずに、あなたのSQLにデータを直接挿入します。セキュリティのための非常に悪い)を追加することによって、あなたのコードに改善

:あなたがしようとしている場合

$jsonarray = json_decode($data, true); 

$values = []; //holds all value sets to be inserted 

//protects against SQL injection 
$cleaner_func = function($dirty) use($mysqli){ 
    return $mysqli->real_escape_string($dirty); 
}; 

//loop through each row to collect its value set 
foreach($jsonarray['data'] as $row): 
    $clean_row = array_map($cleaner_func,$row); //clean data 

    //place clean data in vars 
    list($id,$key,$name,$title) = array_values($clean_row); 

    //add a new value set to be inserted 
    $values[] = "('$id','$key','$name','$title')"; 
endforeach; 

//build and execute the query 
$sql = "INSERT INTO champions (riot_id, riot_key, riot_name, riot_title)" 
    ." VALUES ".implode(", ",$values); 
$mysqli->query($sql); 
+0

これはうまくいくかもしれませんが、あまりにも複雑で、準備されたステートメントを使ってループをよく使うのです。 – meda

+0

私はそれが複雑であるとは確信していませんが、OPがそれを理解していなければ、溶液;私はあなたが使用しているコードを理解していることを確認するファンです。しかし、これはかなり速く実行されます。小さなデータセットでは問題はありませんが、たくさんの行があります。 – BeetleJuice

0
$stmt = $mysqli->prepare(
"INSERT INTO champions (riot_id, riot_key, riot_name, riot_title) VALUES (?, ?, ?, ?)" 
); 
$stmt->bind_param('ssss', $riot_id,$riot_key,$riot_name,$riot_title); 
$jsonarray = json_decode($data, true); 

foreach ($jsonarray['data'] as $data) { 
    $riot_id = $data['id']; 
    $riot_key = $data['key']; 
    $riot_name = $data['name']; 
    $riot_title = $data['title']; 

    $stmt->execute(); 
    printf("%d Row inserted.\n", $stmt->affected_rows); 
} 
$stmt->close(); 
+0

'$ jsonarray ['data'])'は連想配列ですが、インデックスに ' $ i'。私はあなたが行ごとに1つのクエリを実行するので、遅くなると思います。 – BeetleJuice

+0

もそれぞれうまくいくでしょうし、準備が一度だけ呼び出されるので、遅くなることはありません。 – meda

+0

(私が提起したエラーを修正したことに気付くだけで、前のコメントを編集するには遅すぎます)。スピードについては、自分でテストすることができます。私が持っています。 1つの 'prepare'と' bind_param'と10,000の 'execute'を使って10,000行を挿入してみてください。 1つの 'query'または1つの' multi_query'を使用して10,000行を挿入すると比較してください。あなたのやり方は10,000の 'query'よりも速いですが、それほど速くはありません。 – BeetleJuice

関連する問題