从嵌套数组插入数据到MySQL使用PHP
我有这个JSON数据的嵌套数组,我试图插入特定的数据到MYSQL数据库。但即时通讯出现错误,我根本不知道我的代码有什么问题。对不起,对PHP/MySQL仍然陌生。任何帮助表示赞赏从嵌套数组插入数据到MySQL使用PHP
这里是JSON数组:
[
{
"title": "★ (Blackstar)",
"artist": "David Bowie",
"year": "2016",
"genre": "Jazz",
"media": [
{
"totalDiscs": "1",
"position": "1",
"tracks": [
{
"title": "★ (Blackstar)",
"number": "1",
"artists": []
},
{
"title": "'Tis A Pity She Was A Whore",
"number": "2",
"artists": []
},
{
"title": "Lazarus",
"number": "3",
"artists": []
},
{
"title": "Sue (Or In A Season Of Crime)",
"number": "4",
"artists": []
},
{
"title": "Girl Loves Me",
"number": "5",
"artists": []
},
{
"title": "Dollar Days",
"number": "6",
"artists": []
},
{
"title": "I Can't Give Everything Away",
"number": "7",
"artists": []
}
]
}
],
"score": 1
}
]
这里是我的代码:
$json = json_decode($result, true);
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "4tracks";
// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
die("Connection failed: " . $conn->connect_error);
} else {
//echo "connected <br/>";
}
$sql = "INSERT INTO tracks (artist_name)
VALUES ('".$json[0]['artist']."')";
if (array_key_exists('genre',$json[0])){
$sql = "INSERT INTO tracks (track_genre)
VALUES ('".$json[0]['genre']."')";
}
foreach($json[0]['media'] as $key => $values){
foreach($values['tracks'] as $key1 => $values1) {
$sql .= "INSERT INTO tracks (track_name)
VALUES ('".$values1['title']."')";
}
}
if ($conn->query($sql) === TRUE) {
echo "New record created successfully";
} else {
echo "Error: " . $sql . "<br>" . $conn->error;
}
$conn->close();
这里是输出当我运行WAMP .php为:
Error: INSERT INTO tracks (artist_name) VALUES ('David Bowie'); INSERT INTO tracks (track_genre) VALUES ('Jazz');
INSERT INTO tracks (track_name) VALUES ('★ (Blackstar)');
INSERT INTO tracks (track_name) VALUES (''Tis A Pity She Was A Whore');
INSERT INTO tracks (track_name) VALUES ('Lazarus');
INSERT INTO tracks (track_name) VALUES ('Sue (Or In A Season Of Crime)');
INSERT INTO tracks (track_name) VALUES ('Girl Loves Me');
INSERT INTO tracks (track_name) VALUES ('Dollar Days');
INSERT INTO tracks (track_name) VALUES ('I Can't Give Everything Away');
You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'INSERT INTO tracks (track_genre) VALUES ('Jazz');INSERT INTO tracks (track_n' at line 2---
INSERT INTO tracks (track_name) VALUES (''Tis A Pity She Was A Whore');
'Tis - 你需要逃脱t帽子单引号。
$sql = "INSERT INTO tracks (artist_name)
VALUES ('". addslashes ($json[0]['artist']) ."');";
使用[编写参数化语句](http://php.net/manual/en/mysqli.quickstart.prepared-statements.php) – RiggsFolly
逃逸将确保没有特殊的符号(如在JSON的“符号)将MySQL的解析。
逃避你的查询,使用$mysqli->real_escape_string($my_json);
。
始终逃脱不管你尝试插入到数据库中,甚至更好 - 使用参数化或准备好的语句(阅读更多here)
看看在[Little Bobby Tables]发生了什么事情(http://bobby-tables.com/)即使是 [如果你正在逃避输入,它不安全!](http:// stackoverflow。com/questions/5741187/sql -injection-that-around-mysql-real-escape-string) 使用[prepared parameterized statements](http://php.net/manual/en/mysqli.quickstart.prepared- statement.php) – RiggsFolly
为什么downvote? (给大家) – Jared
建议不好,你错过了很多OP的错误 – RiggsFolly
最明显的问题是您正在构建一个包含多个查询的字符串。 eries有可能使用mysqli_
它没有使用方法完成,并且可以更简单地独立执行每个查询。
此外,您可以在tracks
表中为每列写入一个查询,此时您可以在一个查询中同时将多个列插入到表中。
然后,您将需要使用多个循环来循环您的JSON数据结构,foreach循环最适合此目的。
另外你也可以使用参数化查询,像"title": "'Tis A Pity She Was A Whore"
这样的字符串中的引号问题会自动处理好。
所以我的建议是作为解决
<?php
$servername = "localhost";
$username = "root";
$password = "";
$dbname = "4tracks";
// Create connection
$conn = new mysqli($servername, $username, $password, $dbname);
// Check connection
if ($conn->connect_error) {
echo "Connection failed: " . $conn->connect_error;
exit;
}
$j = file_get_contents('tst.json');
$json = json_decode($j);
if (json_last_error() != 0) {
echo json_last_error_msg();
}
// Notice we prepare the query ONCE, but later execute it many times
// with different data in the parameters
$sql = "INSERT INTO tracks (artist_name, track_genre, track_name) VALUES (?,?,?)";
$stmt = $conn->prepare($sql);
// check the prepare worked, if not report errors and exit
if (! $stmt) {
echo $conn->error;
exit;
}
// bind the variables names to the ? place holders
// the variables at this point do not have to exists, or have data in them
$stmt->bind_param('sss', $artist, $genre, $title);
foreach($json as $cd) {
foreach($cd->media as $media) {
foreach($media->tracks as $track){
// load the bound variables with the data for this insert execution
$artist = $cd->artist;
$genre = $cd->genre;
$title = $track->title;
$result = $stmt->execute();
// check the insert worked, if not report error
if (!$result) {
echo $conn->error;
exit;
}
}
}
}
经过一些小的调整后,代码工作!从中学到了很多东西。谢谢你,先生。干杯! –
你在哪里执行?您是否使用支持多个查询执行的功能?您还应该使用参数化查询,您永远不知道歌曲/艺术家是否会在其中有引号。 – chris85
数据库方案说明,我想你会想在'track_name'中引用该艺术家。 – chris85
正如@ chris85所说,你的查询实际上是一组串联在一起的查询。注意它在第二个查询的开始处吐出。另外,你可以考虑在数据库中规范你的数据结构。 – Berniev