У меня есть цикл, проходящий результаты с помощью фида 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, и он отлично работает. Еще не на сервере. Live, миниатюры после элемента 24 никакие эскизы не возвращаются.
Из сообщения об ошибке видно, что он может быть разбит на эту строку:
$thumbnail = (string)$media->group->thumbnail[0]->attributes()->url;
Возможно ли, что вы получаете результат без эскизов? Кажется, вы не проверяете, что коллекция миниатюр содержит хотя бы один.
Когда вы захватываете узел с помощью children (), он может не возвращать допустимое значение (именно поэтому вы получаете предупреждение), тогда вы пытаетесь выполнить операцию над плохим объектом, который вызывает ошибку. PHP позволит вам обернуть обработчик ошибок, чтобы получить более подробную информацию.
Вероятно, я просто проверил бы возвращаемое значение у детей ().
Убедитесь, что PHP 5 правильно установлен на сервере. Поскольку для расширения SimpleXML
требуется PHP 5. Если он установлен, включите его из файла php.ini.
Вы уверены, что вы не сериализуете / десериализируете свои узлы в любом месте? Даже неявно, например, используя сеансы или ORM? "Node no longer exists"
– типичная ошибка для ситуаций, когда узел, родительский узел или документ владельца больше не «живы». (У нас было это при хранении узлов в сеансе, не вставляя их сначала в строки).
Является ли код, который вы отправили на 100%, точно так же, как тот, который вы используете на вашем сервере разработки и в реальном времени? Как вы его запускаете (командная строка или CGI или модуль Apache)? Являются ли версии одинаковыми?
Я не могу воспроизвести ошибку, но я мог бы получить достаточную информацию.
Я использую тот же фрагмент, и все, кажется, работает отлично, я даже внес небольшие изменения, и он отлично работает:)