1

私は simplexml_load_file を使用して LastFM API からアルバム情報を取得していますが、要求されたアルバムが一致する場合は問題ありません。

ただし、アルバムが見つからない場合、LastFM はエラーを返すため、以下のコードで「ストリームを開くことができませんでした」というエラーが出力されます。

LastFM が必要なものを正確に提供していることはわかりますが、どうすればよいかわかりません。このエラー/エラー コードが正しく処理されるようにコードを更新する適切な方法は何ですか?

コード:

$feed = simplexml_load_file("http://ws.audioscrobbler.com/2.0/?method=album.getinfo&api_key=".$apikey."&artist=".$artist."&album=".$album."&autocorrect=".$autocorrect);

$albums = $feed->album;
foreach($albums as $album) {

    $name = $album->name;
    $img = $album->children();
    $img_big = $img->image[4];
    $img_small = $img->image[2];
    $releasedate = $album->releasedate;
    $newdate = date("F j, Y", strtotime($releasedate));

    if ($img == "") {
            $img = $emptyart; }
}
?>
4

3 に答える 3

1
   if ($headers[0] == 'HTTP/1.0 400 Bad Request') {
      $img_big = $emptyart;
      $img_small = $emptyart;
   }

それは403エラーで壊れます...

方法 1 (実用的ではありません): 基本的に、@ でエラーをミュートし、$feed が空かどうかを確認できます。その場合、「なんらかのエラー」が発生しました。URL のエラーか、last.fm からのステータスが失敗しました。

    $feed = @simplexml_load_file("http://ws.audioscrobbler.com/2.0/?method=album.getinfo&api_key=".$apikey."&artist=".$artist."&album=".$album."&autocorrect=".$autocorrect);
    if ($feed)
    {
        // fetch the album info
    }
    else
    {
        echo "No results found.";
    }

どちらの方法でも結果が得られないため、おそらくニーズを満たすことができ、「Last.fmエラーステータスコードなど」を表示する代わりに「結果が見つかりません」と表示できます。

方法 2 (推奨) - curl を使用します。

    function load_file_from_url($url) {
        $curl = curl_init();
        curl_setopt($curl, CURLOPT_URL, $url);
        curl_setopt($curl, CURLOPT_RETURNTRANSFER, true);
        curl_setopt($curl, CURLOPT_REFERER, 'http://www.test.com/');
        $str = curl_exec($curl);

        if(str === false)
        {
            echo 'Error loading feed, please try again later.';
        }

        curl_close($curl);
        return $str;
    }

    function load_xml_from_url($url) {
        return @simplexml_load_string(load_file_from_url($url));
    }

    function getFeed($feedURL)
    {
        $feed = load_xml_from_url($feedURL);
        if ($feed)
        {
                if ($feed['status'] == "failed")
            {
                echo "FAIL";
            }
            else
            {
                echo "WIN";
            }
        }
        else {echo "Last.fm error";}
    }

    /* Example:
       Album: Heritage
       Artist: Opeth
    */

    $url = "http://ws.audioscrobbler.com/2.0/?method=album.getinfo&api_key=273f3dc84c2d55501f3dc25a3d61eb39&artist=opeth&album=hwwXCvuiweitage&autocorrect=0";
    $feed = getFeed ($url);
    // will echo FAIL

    $url2 = "http://ws.audioscrobbler.com/2.0/?method=album.getinfo&api_key=273f3dc84c2d55501f3dc25a3d61eb39&artist=opeth&album=heritage&autocorrect=0";
    $feed2 = getFeed ($url2);
    // will echo WIN
于 2012-11-08T15:28:48.590 に答える
0

URL を に渡す前に URL の状態を評価する方法に沿って作業しsimplexml_load_file、 を試してみget_headersましたが、if/else ステートメントと組み合わせることで、うまくいったようです。

$url = "http://ws.audioscrobbler.com/2.0/?method=album.getinfo&api_key=".$apikey."&artist=".$artist."&album=".$album."&autocorrect=".$autocorrect;

$headers = get_headers($url, 1);

if ($headers[0] == 'HTTP/1.0 400 Bad Request') {
    $img_big = $emptyart;
    $img_small = $emptyart;
    }

else {
    $feed = simplexml_load_file($url);

    $albums = $feed->album;
    foreach($albums as $album) {

        $name = $album->name;
        $img = $album->children();
        $img_big = $img->image[4];
        $img_small = $img->image[2];
        $releasedate = $album->releasedate;
        $newdate = date("F j, Y", strtotime($releasedate));

        if ($img == "") {
            $img_big = $emptyart;
            $img_small = $emptyart;
            }
    }
}
于 2012-10-22T00:40:58.990 に答える
0

最初に URL を取得し、エラーが含まれていないかどうかを確認してから、代わりに simplexml_load_string を使用する方がよいのではないでしょうか?

于 2012-10-21T00:33:15.010 に答える