Ошибка синтаксиса PHP с API YouTube: ошибка синтаксического анализа: ошибка синтаксиса, непредвиденная ошибка T_ENCAPSED_AND_WHITESPACE, ожидающая T_STRING или T_VARIABLE или T_NUM_STRING - PullRequest
0 голосов
/ 09 мая 2009

Я получаю эту ошибку в строке 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;
?>

Ответы [ 2 ]

2 голосов
/ 09 мая 2009

Проблема в представленном вами PHP-коде, по-видимому, связана с тем, что он создает URL-адрес RSS-канала YouTube. Это выглядит следующим образом:

<?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. Строки URL; в конце heredocs должны иметь , а не с отступом. Они должны выглядеть примерно так:

        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": выше.

После исправления этих heredoc вы обнаружите, что код не будет делать то, что вы хотите. $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];

Остальная часть вашего кода работает. После того, как я исправил получение URL-адреса RSS-канала, он с радостью получил его, вытащил из него URL-адрес YouTube и получил идентификатор видео.

0 голосов
/ 09 мая 2009

Проблема в том, что $ media-> group пуста. У него нет детей. Это означает, что $ media-> group-> player имеет значение NULL. Вы не можете вызвать attribute () для NULL, поэтому вы получаете синтаксическую ошибку.

...