我正在尝试将从tmdb API接收到的嵌套JSON数据插入到mySQL数据库中。
我已经知道如何插入嵌套的JSON,但是由于我需要创建的新记录将具有多对多的关系(电影和电影类型),所以我假设我必须插入具有相同数据的多行具有不同的电影流派。
我一直在尝试将另一个foreach循环用于电影体裁,但没有成功。我非常感谢您的帮助。
<?php
$api = "https://api.themoviedb.org/3/movie/popular?api_key=<<api-key>>&language=en-US&page=1";
$jsondata = file_get_contents($api);
//now you have result as associative array
$data = json_decode($jsondata, true);
$array_data = $data['results'];
$array_genre= $data['results']['genre'];//
include "indexmoviedb.php";
$stmt=$db->prepare("INSERT INTO movie VALUES(:title,:poster_path,:backdrop_path,:rating,:overview,:genre)");
foreach($array_data as $row){
foreach ($array_genre as $genrerow) {// I'm assuming I have to do something like this
$stmt->bindParam(":title",$row['title'] );
$stmt->bindParam(":poster_path",$row['poster_path'] );
$stmt->bindParam(":backdrop_path",$row['backdrop_path'] );
$stmt->bindParam(":rating",$row['vote_average'] );
$stmt->bindParam(":overview",$row['overview'] );
$stmt->bindParam(":genre",$row['genres_ids'][] );// what goes in here?
$stmt->execute();
}
}
?>
这是我要插入的json文件
{
"results": [{
"id": 351286,
"vote_average": 6.6,
"title": "Jurassic World: Fallen Kingdom",
"popularity": 228.669,
"poster_path": "/c9XxwwhPHdaImA2f1WEfEsbhaFB.jpg",
"genre_ids": [
28,
12,
878
],
"backdrop_path": "/gBmrsugfWpiXRh13Vo3j0WW55qD.jpg"
}]
}
答案 0 :(得分:1)
首先,您的一行:
$array_genre= $data['results']['genre'];//
不能正常工作,因为该密钥不存在。 您在
中再次使用它foreach ($array_genre as $genrerow) { //...
您可能想在哪里:
foreach ($row['genre_ids'] as $genre_id) {
// all the other bindings
$stmt->bindParam(":genre",$genre_id )
}
假设您要为每种类型插入一行。否则,您的数据库架构需要更多说明...这可能意味着一个新问题...
foreach($row['genre_ids'] ...
遍历该特定行的genre_id,json_decode
将其转换为数组供您使用。
但是,我认为您的数据库方案可以改进。将一行变成多行通常是个坏主意,除非您有解决方法。通常的方法是:特殊的数据库字段(数组,json)或将电影链接到流派的联接表(仅包含genre_id和movie_id或其他内容)。 -两者都解决了归一化问题,在这一点上这可能是个小麻烦,但很快就会变得更加烦人。