Неустранимая ошибка: вызов атрибутов функции-члена () для не-объекта

Я пытаюсь сделать свою XML-карту сайта из канала Blogger, поэтому я попробовал ее с приведенным ниже кодом, после чего она работает нормально.

<?php
header('application/rss+xml; charset=utf-8');
header('Content-Type: text/xml');
header('Pragma: public');
header('Cache-control: private');
header('Expires: -1');
echo '<?xml version="1.0" encoding="utf-8"?>
<urlset
xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9
http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd">
';
$sitemapONE = simplexml_load_file('http://www.exeideas.com/atom.xml?redirect=false&start-index=1&max-results=368');
foreach($sitemapONE->entry as $value)
{
echo '
<url>
<loc>http://www.exeideas.com/'.$value->link[4]->attributes()->href.'</loc>
<lastmod>'.$value->updated.'</lastmod>
<changefreq>always</changefreq>
</url>
';
}
echo '</urlset>';
?>

Но когда я увеличил свой «max-results = 368» до «max-results = 369», я получил ошибку «Дополнительный контент в конце документа». И в конце страницы XML он показывает:

( !) Неустранимая ошибка: вызов атрибутов функции-члена() для не-объекта.............

Что делать сейчас?


person Muhammad Hassan    schedule 07.01.2014    source источник
comment
Его простое значение $value-›link[4] не является объектом и не имеет метода с именем attribute(); До этой строки вы могли использовать var_dump($values); для проверки данных, которые вы используете.   -  person Rottingham    schedule 07.01.2014
comment
@Rottingham Спасибо за комментарий, но user2191572 сделал это отлично. Посмотрите ниже.   -  person Muhammad Hassan    schedule 08.01.2014


Ответы (2)


Поскольку он динамический, вам нужно проверить его существование перед вызовом:

foreach($sitemapONE->entry as $value)
{
    if(isset($value->link[4]))
    {
        echo '
        <url>
        <loc>http://www.exeideas.com/'.$value->link[4]->attributes()->href.'</loc>
        <lastmod>'.$value->updated.'</lastmod>
        <changefreq>always</changefreq>
        </url>
        ';
    }
}
echo '</urlset>';
?>
person MonkeyZeus    schedule 07.01.2014
comment
Это не поможет, поскольку вы все еще вызываете attributes() для link[4], вам нужно проверить, что link[4] является ожидаемым объектом. - person naththedeveloper; 07.01.2014
comment
@fdl вы правы, я не заметил скобки, прикрепленной к attributes() - person MonkeyZeus; 07.01.2014
comment
@ user2191572 Вы сделали это... Спасибо... :-) - person Muhammad Hassan; 08.01.2014

Спасибо user2191572, вы решили мою проблему. Теперь для новичков. Здесь я прикрепляю идеальный код для создания вашей карты сайта Blogger с помощью php, который также проверяется validator.w3.org...

<?php
header('application/rss+xml; charset=utf-8');
header('Content-Type: text/xml');
header('Pragma: public');
header('Cache-control: private');
header('Expires: -1');
echo '<?xml version="1.0" encoding="utf-8"?>
<urlset
xmlns="http://www.sitemaps.org/schemas/sitemap/0.9"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://www.sitemaps.org/schemas/sitemap/0.9
http://www.sitemaps.org/schemas/sitemap/0.9/sitemap.xsd">
';
$sitemapONE = simplexml_load_file('http://www.exeideas.com/atom.xml?redirect=false&start-index=1&max-results=500');
foreach($sitemapONE->entry as $value)
{
echo '
<url>
<loc>http://www.exeideas.com/'.$value->link[4]->attributes()->href.'</loc>
<lastmod>'.$value->updated.'</lastmod>
<changefreq>always</changefreq>
</url>
';
}
echo '</urlset>';
?>
person Muhammad Hassan    schedule 08.01.2014