views:

1228

answers:

2

I keep getting this error in line 54 and I don't know why. All that I'm trying to do is to process the first entry of the query result: extract it's URL so as to construct an embeddable video object.

<?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;
?>
A: 

The problem is that $media->group is empty. It has no children. That means that $media->group->player is NULL. You cannot call attributes() on NULL so you get a syntax error.

Sander Marechal
Thanks for your answer. One more question: how do I ensure that $media->group is non-empty?
Tunji Gbadamosi
-1: this is not the problem at all. Attempting to call attributes() on NULL will give you a runtime error, never a syntax error.
Pourquoi Litytestdata
+1  A: 

The problem in the PHP code you've presented appears to be in the part of it that constructs the YouTube RSS feed URL. It looks like the following:

<?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;
}

There are two things that I can see are wrong with this:

  1. The URL; lines at the end of the heredocs should not be indented. They should look something like the following:

        case "English":
            $feedURL = <<<URL
            http://gdata.youtube.com/feeds/api/videos
            ?q=<?php echo $query; ?>
            &v=2
            &format=5
            &lr=en
    URL;
            break;
    
  2. Don't use <?php echo $query; ?> within heredocs. Just use $query on its own, as in the case "Spanish": block above.

After fixing these heredocs, you'll find that the code won't do what you want. $feedURL will contain a lot of unwanted whitespace, and this will cause your call to simplexml_load_file to fail. But if you look closely at the feed URLs, you'll notice that they are all the same apart from the 'language code' (en, fr, es) at the end. What I would do would be to use an array that translates language names into language codes, and use that to append the language code to the feed URL. For example, something like the following should work:

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

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

The rest of your code appears to work. Once I had fixed up getting the RSS feed URL, it quite happily fetched the feed, pulled a YouTube URL out of it and got the video ID.

Pourquoi Litytestdata
Thanks so much for your help! I really appreciate it!
Tunji Gbadamosi