PHP и League of Legends API - Как определить переменные в уникально именованных массивах JSON для вставки в БД MySQL?

php mysql arrays json mysqli

120 просмотра

3 ответа

8 Репутация автора

Я звоню в League of Legends API и получаю ответ ниже (только часть):

{
"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"
}, …

Мне нужно проанализировать значения в каждом массиве и определить их как переменные для вставки в базу данных MySQL в качестве новой строки. Я могу сделать это для одного массива (для Thresh, который показан в моем php ниже), но только если я задаю имя по одному за раз.

// 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);
}

Как я могу получить значения из каждого массива и вставить их в мою базу данных как новую строку, не делая это по очереди?

Автор: elofox Источник Размещён: 13.07.2016 12:17

Ответы (3)


0 плюса

6140 Репутация автора

Это на самом деле очень просто:

foreach($jsonarray['data'] as $key => $val) {
  // your code here, 'Thresh' is now $key
  // and e.g. $val['id'] gives the $riot_id
}

http://php.net/manual/en/control-structures.foreach.php

Автор: maraca Размещён: 13.07.2016 12:26

0 плюса

23803 Репутация автора

Решение

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

Я улучшил ваш код, добавив защиту от 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);
Автор: BeetleJuice Размещён: 13.07.2016 12:54

0 плюса

41119 Репутация автора

$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();
Автор: meda Размещён: 13.07.2016 01:24
Вопросы из категории :
32x32