3

現在、コードに少し問題があります。助けていただければ幸いです。

最初のテーブル

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>";

できれば助けてください。私はここで頭がおかしくなり始めています。敬具、クリス

4

3 に答える 3

4

必要な XML につながる別のアプローチを提案します。
1. XMLWriterPHP に付属の を使用します
。2. データベースへのクエリを頻繁に実行します。データベースに頻繁にアクセスすると、db サーバーに負荷がかかります。XML ファイルを 1 分おきに作成する場合や、多くのユーザーが同時にこれを行う場合は、1 回に 1 回実行しても問題ありません。 while :-)
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.
于 2013-04-12T23:50:25.437 に答える
0

問題は、すべての結果をループして、反復ごとにすべての情報を書き出していることのようです。

2 つのクエリを使用することを検討してください。最初にループできるアーティストとアルバムを取得し、次に曲を取得します。その結果を外側のループ内でループして、曲を子要素としてアルバム要素に追加することもできます。

于 2013-04-12T01:30:56.677 に答える