2014-01-14 60 views
1

我試圖從XML檢索數據並將其插入到MySQL中,但數據不斷重複或循環,不知道如何解決它。從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我得到的相同數據的重複一遍又一遍,我找不到只插入一次文本值的方法。

這是* song_album *柱看起來像在mysql中插入一個一行之後:

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. 

而這裏如何*在插入該行後,song_tag *列看起來像在mysql中:

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> 

感謝。

回答

1

難道你不能只跳過整個循環,只是直接收集你需要的數據?就像:

$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]; 
+0

我沒有收到這個建議的數據 – AJ152

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

?> 

另外我不確定你是否需要你聲明的變量。

剛一說明:

,如果你有$text = 'dachi';

奔走然後給$text .= 'boy';

$text則等於 'dachiboy'

所以.=是串聯的,那就是什麼你在做一個循環。將相冊名稱分配給與.=相同的變量,從而將它們相加。

+0

我刪除了這個點,它停止了循環值,但是我在mySQL數據庫中得到了12次相同的歌曲,並且這些值在不同的行中。我怎樣才能將數據只插入一行?謝謝 – AJ152

+0

好的,如果一個問題是關於正確解析XML併爲數據庫做準備的話,那麼請給出一個完整的XML文件並描述必須到哪個mysql表字段的數據。我很樂意幫助你。 – dachi