我试图从XML中检索数据并将其插入MySQL中,但是数据一直在重复或循环,不知道如何修复它。
这是我的PHP脚本,它通过audioscrobbler.com API获取XML数据。(请参阅本页下面的完整XML数据)

$artist = 'metallica';
$title = 'whiskey in the jar';
$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");

foreach($xml->track->children() as $track => $data){

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

  $xml = NULL;

}

我将这些值插入到MySQL中,这是可行的,但是使用$song_album和$song_tag,我会一遍又一遍地重复相同的数据,而且我找不到只插入一次文本值的方法。
这就是插入a行后mysql中的*song_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_tag*列的外观如下:
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>

谢谢。

最佳答案

我不知道你为什么要连接字符串,我用你的代码做了实验,这看起来很好。在变量赋值时删除了点,并为个人测试添加了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();
}

?>

我也不确定你是否需要那些你声明的变量。
只是一个便条:
如果您有$text = 'dachi';
然后给出$text .= 'boy';
$text则等于“dachiboy”
所以.=用于连接,这就是您在循环中所做的。使用.=将唱片集名称分配给同一个变量,从而将它们相加。

关于php - 从XML向MySQL插入数据,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/21104831/

10-10 21:44
查看更多