2009-05-08 4 views
-1

Я продолжаю получать эту ошибку в строке 54, и я не знаю почему. Все, что я пытаюсь сделать, это обработать первую запись результата запроса: извлечь URL-адрес, чтобы создать встраиваемый видеообъект.Ошибка синтаксиса PHP с API Youtube: ошибка синтаксиса: ошибка синтаксиса, неожиданный T_ENCAPSED_AND_WHITESPACE, ожидающий T_STRING или T_VARIABLE или T_NUM_STRING

<?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; 
?> 
+0

Похоже на синтаксическую ошибку PHP, а не на ошибку Youtube ... – Kekoa

+0

Спасибо за ваш вклад. Я думаю ты прав. Возникает вопрос: где синтаксическая ошибка? – Fortisimo

ответ

2

Проблема в представленном вами 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": выше.

После исправления этих 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]; 

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

+0

Большое спасибо за вашу помощь! Я очень ценю это! – Fortisimo

-2

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

+0

Спасибо за ваш ответ. Еще один вопрос: как я могу гарантировать, что $ media-> group не пуст? – Fortisimo

+0

-1: это не проблема. Попытка вызова атрибутов() в NULL даст вам ошибку времени выполнения, никогда не синтаксическую ошибку. –