-1

我在第 54 行不断收到此错误,我不知道为什么。我要做的就是处理查询结果的第一个条目:提取它的 URL 以便构造一个可嵌入的视频对象。

<?php
    function extractID($youtubeURL)
    {
        //split off the final bit of the URL beginning with ‘=’
        $youtubeID = strchr($youtubeURL,'=');
        //remove that equals sign to get the video ID 
        $youtubeID = substr($youtubeID,1);
        return $youtubeID;
    }
?>
<?php
    // set feed URL
    $lang = $_POST['language'];
    $query = $_POST['query'] . "%20review";
    switch($lang){
        case "English":
            $feedURL = <<<URL
            http://gdata.youtube.com/feeds/api/videos
            ?q=<?php echo $query; ?>
            &v=2
            &format=5
            &lr=en
            URL;
            break;
        case "French":
            $feedURL = <<<URL
            http://gdata.youtube.com/feeds/api/videos
            ?q=<?php echo $query; ?>
            &v=2
            &format=5
            &lr=fr
            URL;
            break;
        case "Spanish":
            $feedURL = <<<URL
            http://gdata.youtube.com/feeds/api/videos
            ?q=<?php echo $query; ?>
            &v=2
            &format=5
            &lr=es
            URL;
            break;                    
    }

    // read feed into SimpleXML object
    $sxml = simplexml_load_file($feedURL);

    // get the first media entry &
   // get nodes in media: namespace for media information
   $media = $sxml->entry[0]->children('http://search.yahoo.com/mrss/');

   // get video player URL
   $attrs = $media->group->player->attributes();
   // **THIS KEEPS CAUSING THE ERROR.**
   $videoURL = $attrs['url'];
   // extract the video's ID from the URL
   $videoID = extractID($videoURL);       
?>

<?php
    echo <<<EOD 
    <objectwidth="425" height="350" data="http://www.youtube.com/v/
    <?php echo $videoID ?> 
    type="application/x-shockwave-flash"><param name="src" 
    value="http:/www.youtube.com/v/<?php echo $videoID ?>" /></object>
    EOD;
?>
4

2 回答 2

2

您提供的 PHP 代码中的问题似乎出在构建 YouTube RSS 提要 URL 的部分。它如下所示:

<?php
// set feed URL
$lang = $_POST['language'];
$query = $_POST['query'] . "%20review";
switch($lang){
    case "English":
        $feedURL = <<<URL
        http://gdata.youtube.com/feeds/api/videos
        ?q=<?php echo $query; ?>
        &v=2
        &format=5
        &lr=en
        URL;
        break;
    case "French":
        $feedURL = <<<URL
        http://gdata.youtube.com/feeds/api/videos
        ?q=<?php echo $query; ?>
        &v=2
        &format=5
        &lr=fr
        URL;
        break;
    case "Spanish":
        $feedURL = <<<URL
        http://gdata.youtube.com/feeds/api/videos
        ?q=$query;
        &v=2
        &format=5
        &lr=es
        URL;
        break;
}

我可以看到有两件事是错误的:

  1. heredocsURL;末尾的行不应缩进。它们应该如下所示:

        case "English":
            $feedURL = <<<URL
            http://gdata.youtube.com/feeds/api/videos
            ?q=<?php echo $query; ?>
            &v=2
            &format=5
            &lr=en
    URL;
            break;
    
  2. 不要<?php echo $query; ?>在 heredocs 中使用。只需单独使用$query,如case "Spanish":上面的块中所示。

修复这些 heredocs 后,您会发现代码无法执行您想要的操作。 $feedURL将包含很多不需要的空格,这将导致您的调用simplexml_load_file失败。但是,如果您仔细查看提要 URL,您会注意到除了末尾的“语言代码”( en, fr, )之外,它们都是相同的。es我要做的是使用一个将语言名称转换为语言代码的数组,并使用它将语言代码附加到提要 URL。例如,以下内容应该可以工作:

$lang_codes = array(
    "English" => "en",
    "French"  => "fr",
    "Spanish" => "es"
);

$feedURL = "http://gdata.youtube.com/feeds/api/videos?q=$&v=2&format=5&lr=" . $lang_codes[$lang];

您的其余代码似乎可以工作。一旦我修复了获取 RSS 提要 URL,它就会非常高兴地获取提要,从中提取一个 YouTube URL 并获取视频 ID。

于 2009-05-09T17:19:17.867 回答
-2

问题是 $media->group 是空的。它没有孩子。这意味着 $media->group->player 为 NULL。您不能在 NULL 上调用 attributes(),因此会出现语法错误。

于 2009-05-08T22:01:02.537 回答