Цикл SimpleXML работает, но прерывается на полпути - PullRequest
2 голосов
/ 14 июля 2010

У меня есть цикл обработки результатов из канала 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 миниатюры не возвращаются.

Ответы [ 5 ]

2 голосов
/ 21 июля 2010

Из сообщения об ошибке видно, что в этой строке может произойти сбой:

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

Возможно ли, что вы получаете результат без миниатюр? Похоже, вы не проверяете, что в коллекции миниатюр есть хотя бы один.

0 голосов
/ 18 ноября 2011

Я использую тот же фрагмент, и все, кажется, работает отлично, я даже сделал небольшие изменения, и это прекрасно работает:)

0 голосов
/ 28 июля 2010

Вы уверены, что нигде не сериализуете и не десериализуете свои узлы? Даже неявно, например используя сеансы или ORM? "Node no longer exists" является типичной ошибкой для ситуаций, когда узел, родительский узел или документ владельца больше не «живы». (У нас было это при хранении узлов в сеансе без предварительного преобразования их в строки.)

Является ли код, который вы разместили, на 100% точно таким же, как тот, который вы используете на своем сервере разработки и живом сервере? Как у вас это работает (командная строка или CGI или модуль Apache)? Версии одинаковые?

Я не могу воспроизвести ошибку, но, учитывая достаточно информации, могу.

0 голосов
/ 23 июля 2010

Убедитесь, что PHP 5 правильно установлен на сервере.Поскольку расширение SimpleXML требует PHP 5. Если установлено, включите его из файла php.ini.

0 голосов
/ 22 июля 2010

Когда вы захватываете узел с помощью children (), он может не возвращать действительное значение (именно поэтому вы получаете предупреждение), тогда вы пытаетесь выполнить операцию с плохим объектом, который вызывает ошибку. PHP позволит вам обернуть обработчик ошибок, чтобы получить более подробную информацию.

Я бы, наверное, просто проверил возвращаемое значение от children ().

...