【问题标题】:SimpleXML loop works but breaks half way throughSimpleXML 循环有效,但中途中断
【发布时间】:2010-07-14 17:53:47
【问题描述】:

我有一个循环遍历 youtube 提要的结果,它工作正常,但到最后它失败并出现错误:

Warning: main() [function.main]: Node no longer exists in ../youtubereader.php on line 8
Warning: main() [function.main]: Node no longer exists in .../youtubereader.php on line 8
Fatal error: Call to a member function attributes() on a non-object in .../youtubereader.php on line 9

我的代码是:

<?php
error_reporting(E_ALL);
$feedURL = 'http://gdata.youtube.com/feeds/api/users/USERNAME/uploads?max-results=50';
$sxml = simplexml_load_file($feedURL);
$i=0;
foreach ($sxml->entry as $entry) {
      $media = $entry->children('media', true);
      $watch = (string)$media->group->player->attributes()->url;
      $thumbnail = (string)$media->group->thumbnail[0]->attributes()->url;
      ?>
      <div class="videoitem">
        <div class="videothumb"><a href="<?php echo $watch; ?>" class="watchvideo"><img src="<?php echo $thumbnail;?>" alt="<?php echo $media->group->title; ?>" /></a></div>
        <div class="videotitle">
            <h3><a href="<?php echo $watch; ?>" class="watchvideo"><?php echo $media->group->title; ?></a></h3>
            <p><?php echo $media->group->description; ?></p>
        </div>
      </div>      
<?php $i++; if($i==3) { echo '<div class="clear small_v_margin"></div>'; $i=0; } } ?>

我的 xml 很好地从 youtube 上回来了,肯定有比它中断的地方更多的结果,任何想法为什么会这样做?

编辑: 在本地测试,使用 wamp,它工作正常。还是不在服务器上。直播,第 24 项之后的缩略图不返回任何缩略图。

【问题讨论】:

  • 等待它工作还是失败?
  • 直到 24 号我得到那个错误
  • 错误指向&lt;media:group&gt; 没有&lt;media:player&gt;(错误指向第8 行)和/或&lt;media:thumbnail&gt;(错误指向第9 行)。并非所有组节点都包含这些节点。
  • 是的,我发现它的缩略图没有被返回。它们在我的本地开发机器上,但不在实时服务器上

标签: php simplexml youtube-api


【解决方案1】:

从错误消息中可以看出它可能在这一行中断:

$thumbnail = (string)$media->group->thumbnail[0]->attributes()->url;

您是否有可能得到没有缩略图的结果?您似乎没有检查缩略图集合是否至少包含一个。

【讨论】:

  • 是的,Feed 会为每个项目返回缩略图(YouTube 会为您完成)。
  • 今天重新检查了一下,好像是缩略图的问题。在本地,它们都返回了,但直播 YouTube 没有返回它们。任何想法为什么?
  • 不是真的,我自己没有使用过 YouTube 的 API。然而,我看到人们偶尔会抱怨 YouTube 需要一段时间来制作缩略图,所以无论如何你的代码处理“无缩略图”的情况(显示通用图像或其他)可能是值得的。不过,这确实看起来很奇怪。您可以在查询字符串中传递任何影响缩略图的参数吗?
  • 不要认为有任何参数可以传递过来,无论哪种方式,代码都是完全一样的 live 和 local 并且它在本地工作。这些视频来自 2007 年,因此不制作缩略图应该不是问题。同样,代码是相同的,它必须与服务器(媒体殿堂)或 youtube 处理来自本地服务器而不是实时的请求的方式有关
【解决方案2】:

当您使用 children() 抓取节点时,它可能不会传回有效值(这就是您收到警告的原因),然后您正在尝试对导致错误的坏对象进行操作。 PHP 将允许您包装错误处理程序以获取更详细的信息。

我可能只是检查 children() 的返回值。

【讨论】:

  • 儿童工作正常,只是没有返回缩略图。他们在本地,但不是现场的
【解决方案3】:

确保在服务器中正确安装了 PHP 5。因为SimpleXML 扩展需要 PHP 5。如果已安装,则从 php.ini 文件启用它。

【讨论】:

    【解决方案4】:

    你确定你没有在任何地方序列化/反序列化你的节点吗?甚至不是隐含的,例如使用会话或 ORM? "Node no longer exists" 是节点、父节点或所有者文档不再“活动”的情况下的典型错误。 (我们在会话中存储节点时有它,而不是先将它们转换为字符串。)

    您发布的代码是否与您在开发和实时服务器上运行的代码 100% 完全相同?你是如何运行它的(命令行或 CGI 或 Apache 模块)?版本一样吗?

    我无法重现该错误,但如果有足够的信息,我可能会。

    【讨论】:

    • 完全相同的代码。在实时服务器上,如果我跳过获取缩略图,它会返回所有其他值 ok
    • @Ashley:两者的环境(服务器、操作系统、PHP 版本……)是什么?
    【解决方案5】:

    我使用相同的 sn-p,一切似乎都运行良好我什至做了一些小改动,它运行良好:)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2023-03-26
      • 1970-01-01
      • 1970-01-01
      • 2020-02-07
      • 1970-01-01
      • 2013-03-23
      相关资源
      最近更新 更多