我的代码目前有点问题,希望你能帮助我。
第一个表格
SELECT artist, album, song
FROM artist
LEFT JOIN album
on artist.artist_ID = album.artist_ID
LEFT JOIN song
on album.album_ID = song.album_ID
ORDER BY artist.artist, album.album_ID, song.song_ID
我试图在php的帮助下将其导出为XML,因此我直接在文档中创建XML,因此我只需按一个链接即可查看和访问xml。但我遇到的问题是这首歌不会叠加在专辑中。相反,他们这样做:
<music>
<artist name="$artist1">
<album name="$album1">
<song>$song1</song>
</album>
</artist>
</music>
<music>
<artist name="$artist1">
<album name="$album1">
<song>$song2</song>
</album>
</artist>
</music>
我想要像这样堆叠:
<music>
<artist name="$artist1">
<album name="$album1">
<song>$song1</song>
<song>$song2</song>
<song>$song3</song>
</album>
</artist>
</music>
这是我目前用于导出到XML的PHP代码,这里没有用的东西。 我一直试图在过去的12个小时内修复它而没有运气。
$export = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n";
$export="<myTunes>";
while($row = mysqli_fetch_array($result))
{
$export.="<music>";
$artist=$row["artist"];
$album=$row["album"];
$song=$row["song"];
$export.=" <artist name='$artist'>
<album name='$album'>
<song>$song</song>
</album>
</artist>";
$export.="</music>";
}
$export.="</myTunes>";
file_put_contents("export.xml", $export);
echo "<a href='export.xml' target='_blank'>Export database as XML</a>";
如果可以,请帮忙,我开始在这里放松心情。 最好的祝福, 克里斯
答案 0 :(得分:4)
我会建议一种不同的方法来实现你想要的XML
1.我将使用PHP附带的XMLWriter
和
2.依赖于经常查询数据库。转到数据库经常会给你的db-server带来一些负担,如果你每隔一分钟左右创建一些XML文件就会很糟糕,或者如果很多用户同时这样做,那么如果你在同一时间执行此操作就可以了。而:-)
3.我将使用PDO
而不是那些旧的mysql_*-functions
使用prepared statements
访问数据库,这是一个很酷的功能。
// setting up PDO
$dbLocation = 'mysql:dbname=db001;host=localhost';
$dbUser = 'user';
$dbPass = 'password';
$db = new PDO($dbLocation, $dbUser, $dbPass);
// prepare all queries...
$dbArtists = $db->prepare("SELECT * FROM artist");
$dbAlbums = $db->prepare("SELECT * FROM album WHERE artist_ID=:artist_id");
$dbSongs = $db->prepare("SELECT * FROM song WHERE album_ID=:album_id");
// fetch all artists
$dbArtists->execute();
$artists=$dbArtists->fetchAll(PDO::FETCH_ASSOC);
$x=new XMLWriter();
$x->openMemory();
$x->startDocument('1.0','UTF-8');
$x->startElement('music');
foreach ($artists as $artist) {
$x->startElement('artist');
$x->writeAttribute('name',$artist['artist']);
// fetch all albums of this artist
$dbAlbums->execute(array(':artist_id' => $artist['artist_id']));
$albums = $dbAlbums->fetchAll(PDO::FETCH_ASSOC);
foreach ($albums as $album) {
$x->startElement('album');
$x->writeAttribute('name',$album['album']);
// fetch all songs from this album
$dbSongs->execute(array(':album_id' => $album['album_id']));
$songs = $dbSongs->fetchAll(PDO::FETCH_ASSOC);
foreach ($songs as $song) {
$x->startElement('song');
$x->text($song['song']);
$x->endElement(); // song
} // foreach $songs
$x->endElement(); // album
} // foreach $albums
$x->endElement(); // artist
} // foreach $artists
$x->endElement(); // music
$x->endDocument();
$xml = $x->outputMemory();
// now save $xml to a file etc.
答案 1 :(得分:1)
下面的代码仅反映了其中一种算法的一般概念,当然,它应该在生产版本中重构。
$export = "<?xml version=\"1.0\" encoding=\"UTF-8\" ?>\n";
$export .= "<myTunes>";
$export .= "<music>";
$lastArtist = $lastAlbum = null;
while($row = mysqli_fetch_array($result))
{
$artist=$row["artist"];
$album=$row["album"];
$song=$row["song"];
if(($lastArtist == null) and ($lastAlbum == null))
$export.="<artist name='$artist'><album name='$album'>";
else
{
if($artist != $lastArtist)
$export.="</artist><artist name='$artist'>";
if($album != $lastAlbum)
$export.="</album><album name='$album'>";
}
$export.=" <song>$song</song>";
$lastArtist = $artist;
$lastAlbum = $album;
}
$export.="</album></artist></music>";
$export.="</myTunes>";
file_put_contents("export.xml", $export);
echo "<a href='export.xml' target='_blank'>Export database as XML</a>";
答案 2 :(得分:0)
问题似乎是你循环遍历所有结果并在每次迭代时写出所有信息。
您可以考虑使用两个查询。第一个获得你的艺术家和专辑,你可以循环,然后一秒钟来获得你的歌曲,其结果也可以在你的外部循环中循环,以将歌曲作为子元素添加到你的专辑元素。