Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/267.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php 从XML向MySQL插入数据_Php_Mysql_Xml_Foreach - Fatal编程技术网

Php 从XML向MySQL插入数据

Php 从XML向MySQL插入数据,php,mysql,xml,foreach,Php,Mysql,Xml,Foreach,我试图从XML中检索数据并将其插入MySQL,但数据不断重复或循环,不确定如何修复它 下面是我的PHP脚本,它通过audioscrobbler.com API从中获取XML数据。(请参阅本页下面的完整XML数据) 我正在将这些值插入MySQL,这是可行的,但是使用$song\u-album和$song\u-tag我一遍又一遍地得到相同数据的重复,我找不到只插入一次文本值的方法 这是mysql中插入a行后,*song\u album*列的外观: Garage, Inc.Garage, Inc.G

我试图从XML中检索数据并将其插入MySQL,但数据不断重复或循环,不确定如何修复它

下面是我的PHP脚本,它通过audioscrobbler.com API从中获取XML数据。(请参阅本页下面的完整XML数据)

我正在将这些值插入MySQL,这是可行的,但是使用$song\u-album$song\u-tag我一遍又一遍地得到相同数据的重复,我找不到只插入一次文本值的方法

这是mysql中插入a行后,*song\u album*列的外观:

 Garage, Inc.Garage, Inc.Garage, Inc.Garage, Inc.Garage, Inc.Garage, Inc.Garage, Inc.Garage, Inc.Garage, Inc.Garage, Inc.Garage, Inc.Garage, Inc.Garage, Inc.
它应该在哪里:

Garage, Inc.
下面是在mysql中插入该行后,*song\u标记*列的外观:

metalmetalmetalmetalmetalmetalmetalmetalmetalmetalmetalmetalmetal
它应该在哪里:

metal
以下是XML原始数据:

<lfm status="ok">
<track>
<id>1003737</id>
<name>Whiskey in the Jar</name>
<mbid>664ae92a-f25a-4df4-a564-66ee87dff1c8</mbid>
<url>...</url>
<duration>303000</duration>
<streamable fulltrack="0">0</streamable>
<listeners>433263</listeners>
<playcount>3389216</playcount>
<artist>
<name>Metallica</name>
<mbid>65f4f0c5-ef9e-490c-aee3-909e7ae6b2ab</mbid>
<url>http://www.last.fm/music/Metallica</url>
</artist>
<album position="9">
<artist>Metallica</artist>
<title>Garage, Inc.</title>
<mbid/>
<url>http://www.last.fm/music/Metallica/Garage,+Inc.</url>
<image size="small">http://userserve-ak.last.fm/serve/64s/54059755.png</image>
<image size="medium">http://userserve-ak.last.fm/serve/126/54059755.png</image>
<image size="large">http://userserve-ak.last.fm/serve/174s/54059755.png</image>
<image size="extralarge">http://userserve-ak.last.fm/serve/300x300/54059755.png
</image>
</album>
<toptags>
<tag>
<name>metal</name>
<url>http://www.last.fm/tag/metal</url>
</tag>
<tag>
<name>heavy metal</name>
<url>http://www.last.fm/tag/heavy%20metal</url>
</tag>
<tag>
<name>hard rock</name>
<url>http://www.last.fm/tag/hard%20rock</url>
</tag>
<tag>
<name>rock</name>
<url>http://www.last.fm/tag/rock</url>
</tag>
<tag>
<name>cover</name>
<url>http://www.last.fm/tag/cover</url>
</tag>
</toptags>
<wiki>...</wiki>
</track>
</lfm>

1003737
瓶中威士忌
664ae92a-f25a-4df4-a564-66ee87dff1c8
...
303000
0
433263
3389216
金属
65f4f0c5-ef9e-490c-aee3-909e7ae6b2ab
http://www.last.fm/music/Metallica
金属
车库公司。
http://www.last.fm/music/Metallica/Garage,+公司。
http://userserve-ak.last.fm/serve/64s/54059755.png
http://userserve-ak.last.fm/serve/126/54059755.png
http://userserve-ak.last.fm/serve/174s/54059755.png
http://userserve-ak.last.fm/serve/300x300/54059755.png
金属
http://www.last.fm/tag/metal
重金属
http://www.last.fm/tag/heavy%20metal
硬岩
http://www.last.fm/tag/hard%20rock
岩石
http://www.last.fm/tag/rock
盖
http://www.last.fm/tag/cover
...

谢谢。

你不能跳过整个循环,直接收集你需要的数据吗?比如:

  $xml = simplexml_load_file("http://ws.audioscrobbler.com/2.0/?method=track.getInfo&api_key=$myAPIkey&artist=$artist&track=$title") or die("Error: Cannot create object");

  $song_album = $xml->track->title;
  $song_tag = $xml->track->tag[0]->name;
  $song_imageURL = $xml->track->image[2];

我不知道为什么要连接字符串,我用你的代码做了实验,这似乎很好。只是在变量赋值时删除了点,并为个人测试添加了mysqli代码

<?php

error_reporting(E_ALL);

// Connect
$mysqli = new mysqli('localhost', 'root', '', 'dachi');

if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}


$artist = 'metallica';
$title = 'whiskey in the jar';
$xml = simplexml_load_file("test.xml") or die("Error: Cannot create object");

$song_album = '';
$song_imageURL = '';

foreach($xml->track->children() as $track => $data){
    $song_album = $data->title; // I removed dot here
    $song_tag = $data->tag->name[0];

     // Remove dot if correct (can't understand just form this snippet why you concat)
    $song_imageURL .= $data->image[2];

    $xml = NULL;

    $stmt = $mysqli->prepare("INSERT INTO `test` (`test`) VALUES (?)");
    $stmt->bind_param('s', $song_album);
    $stmt->execute();
    $stmt->close();
}

?>
track->children()作为$track=>$data){
$song_album=$data->title;//我在这里删除了点
$song_tag=$data->tag->name[0];
//如果正确,请删除圆点(无法理解仅从这段代码中填写为什么要使用concat)
$song_imageURL.=$data->image[2];
$xml=NULL;
$stmt=$mysqli->prepare(“插入到`test`(`test`)值(?);
$stmt->bind_param('s',$song_相册);
$stmt->execute();
$stmt->close();
}
?>
我也不确定你是否需要那些你声明的变量

请注意:

如果你有
$text='dachi'

然后你给
$text.='boy'

$text
则等于“dachiboy”


因此,
=
用于串联,这就是您在循环中所做的。使用
=
将唱片集名称分配给同一个变量,从而将它们添加到一起。

我没有得到此建议的任何数据。我删除了点并停止循环值,但我在mySQL数据库中添加了12次相同的歌曲,并且这些值位于不同的行中。如何仅在一行中插入数据?。谢谢,所以如果问题是关于正确解析XML并为数据库做准备,那么请给出一个完整的XML文件,并描述必须转到哪个mysql表字段的数据。我很乐意帮助你。
<?php

error_reporting(E_ALL);

// Connect
$mysqli = new mysqli('localhost', 'root', '', 'dachi');

if (mysqli_connect_errno()) {
    printf("Connect failed: %s\n", mysqli_connect_error());
    exit();
}


$artist = 'metallica';
$title = 'whiskey in the jar';
$xml = simplexml_load_file("test.xml") or die("Error: Cannot create object");

$song_album = '';
$song_imageURL = '';

foreach($xml->track->children() as $track => $data){
    $song_album = $data->title; // I removed dot here
    $song_tag = $data->tag->name[0];

     // Remove dot if correct (can't understand just form this snippet why you concat)
    $song_imageURL .= $data->image[2];

    $xml = NULL;

    $stmt = $mysqli->prepare("INSERT INTO `test` (`test`) VALUES (?)");
    $stmt->bind_param('s', $song_album);
    $stmt->execute();
    $stmt->close();
}

?>