Errore di sintassi PHP con l'API di Youtube: errore di analisi: errore di sintassi, T_ENCAPSED_AND_WHITESPACE imprevisto, in attesa di T_STRING o T_VARIABLE o T_NUM_STRING

StackOverflow https://stackoverflow.com/questions/841766

  •  20-08-2019
  •  | 
  •  

Domanda

Continuo a ricevere questo errore nella riga 54 e non so perché. Tutto quello che sto cercando di fare è elaborare la prima voce del risultato della query: estrarre l'URL in modo da costruire un oggetto video incorporabile.

<?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;
?>
È stato utile?

Soluzione

Il problema nel codice PHP che hai presentato sembra essere nella parte di esso che costruisce l'URL del feed RSS di YouTube. È simile al seguente:

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

Ci sono due cose che posso vedere sono sbagliate in questo:

  1. Le URL; righe alla fine della heredocs dovrebbe non essere rientrato. Dovrebbero avere un aspetto simile al seguente:

        case "English":
            $feedURL = <<<URL
            http://gdata.youtube.com/feeds/api/videos
            ?q=<?php echo $query; ?>
            &v=2
            &format=5
            &lr=en
    URL;
            break;
    
  2. Non utilizzare <?php echo $query; ?> in heredocs. Usa $query da solo, come nel case "Spanish": blocco sopra.

Dopo aver corretto questi heredocs, scoprirai che il codice non farà ciò che desideri. $feedURL conterrà molti spazi bianchi indesiderati e ciò causerà il fallimento della chiamata simplexml_load_file. Ma se osservi attentamente gli URL dei feed, noterai che sono tutti uguali a parte il "codice lingua" (en, fr, es) alla fine. Quello che vorrei fare sarebbe utilizzare un array che traduce i nomi delle lingue in codici di lingua e utilizzarlo per aggiungere il codice della lingua all'URL del feed. Ad esempio, dovrebbe funzionare qualcosa di simile al seguente:

$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];

Il resto del codice sembra funzionare. Dopo aver risolto l'ottenimento dell'URL del feed RSS, è stato abbastanza felice di recuperare il feed, estrarre un URL YouTube da esso e ottenere l'ID video.

Altri suggerimenti

Il problema è che $ media - > il gruppo è vuoto. Non ha figli. Ciò significa che $ media - & Gt; gruppo - & Gt; il giocatore è NULL. Non è possibile chiamare gli attributi () su NULL in modo da ottenere un errore di sintassi.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top