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
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;
?>
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:
-
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;
-
Non utilizzare
<?php echo $query; ?>
in heredocs. Usa$query
da solo, come nelcase "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.