2014-01-14 61 views
0

有人正在幫我用這個腳本來將XML數據插入到MySQL中,XML數據來自audioscrobbler.com API,並且我需要將一行插入到mysql數據庫中XML數據$ song_album$ song_albumURL$ song_tag,但即使我得到的數據庫中的數據,我喜歡增加12倍,同一首歌的數據,而數據則是在不同的行。我可以幫助解決這個問題嗎?從XML提要中插入數據到MySQL數據庫

<?php 
error_reporting(E_ALL); 
$mysql_hostname = "localhost"; 
$mysql_user = "user"; 
$mysql_password = "pass"; 
$mysql_database = "database"; 
$myAPIKey = '****'; 

// Connect 
$mysqli = new mysqli($mysql_hostname, $mysql_user, $mysql_password, $mysql_database); 

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

$artist_raw = 'Metallica'; 
$title_raw = 'Whiskey In The Jar'; 
$artist = urlencode($artist_raw); 
$title = urlencode($title_raw); 

$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_albumURL = $data->image[2]; 

$xml = NULL; 
$stmt = $mysqli->prepare("INSERT INTO `music` (`song_title`, `song_artist`, `song_album`, `song_tag`, `song_albumURL`) values ('{$title_raw}', '{$artist_raw}', '{$song_album}', '{$song_tag}', '{$song_albumURL}')"); 
$stmt->bind_param('s', $song_album, $song_albumURL, $song_tag); 
$stmt->execute(); 
$stmt->close(); 

} 
?> 

這裏是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> 
+0

請分享你迄今所做的調試 – RandomSeed

+0

我沒有得到任何錯誤信息,所有的值都會返回,但它只是反覆插入數據。 – AJ152

+0

你確定嗎?不過,它看起來像'$ title_raw'是硬編碼的。如果'simplexml_load_file()'總是加載相同的URL,我不會感到驚訝) – RandomSeed

回答

1

foreach迭代的<track>節點的孩子,並在每次迭代插件(不完全統計)行(每個子節點,即是)。

這不是你想要的。你想在這裏插入一行。刪除你的循環,並做一些事情,如:(???如預期那樣代碼完整是否所有函數返回值的任何錯誤消息)與我們

$song_album = $xml->track->album->title; 
$song_tag = $xml->track->toptags->tag[0]->name; 
dbQuery('INSERT INTO ...'); 
+0

就是這樣,它工作正常!非常感謝! :) – AJ152