Undefined index/Non-Object Fehler (PHP/JSON)

Hallöchen!

In folge eines aktuellen Projektes, arbeite ich mit PHP und JSON zusammen, bisher funktioniert das auch Problemlos.
Nur jetzt auf einmal, wird bei selben Code, ein Fehler ausgegeben.
Je nachdem ob ich json_decode() nun mit true oder eben ohne übergebe, erhalte ich ein Undefined index bzw. Non-Object Meldung.
Versuche ich aber via var_dump(); mal die entsprechenden Daten zu prüfen, stimmen die Angegebenen Variablen.

Hier mal als Beispiel der Code um den es geht (minimiert auf das nötigste):

$json= “https://api2.double-spoiler.de/lodestone/topics”;
$options = [
‘ssl’ => [
‘verify_peer’ => false,
‘verify_peer_name’ => false,
],
];
$xiv_lodestone = file_get_contents($json, false, stream_context_create($options));
$xiv_lodestone = json_decode($xiv_lodestone, true);

echo $xiv_lodestone[‘title’];

Im Normalfall, sollte er nun ja sämtliche “title” Angaben ausgeben.
Hoffe doch das hier jemand weiß, weshalb es nun nicht mehr so klappt, wie “gewohnt”.

MfG Syntafin

Was steht denn in $xiv_lodestone?

Darin sollte der Inhalt folgender Datei per array ausgegeben werden:

https://api.double-spoiler.de/lodestone/topics?language=de&pretty=1

Das sieht mit nach normalem JSON ohne Fehler aus.
Hast du bplaced Pro?
Wenn nicht koenntest du nicht auf externe Server zugreifen.
Wenn ja,hast du vielleicht dein taegliches Limit erreicht (Gibts ueberhaupt eins,bin mir gerade nicht ganz sicher)?
In deinem Script gibts auch einen Fehler,denn es gibt ja nicht nur ein title.
Du musst das in einer for Schleife abarbeiten.

Vorab: Läuft alles nicht auf bplaced :slight_smile: (egal wie hoch das Limit für externe Zugriffe ist, ich glaube spätestens in 1-2 Monaten dürfte es in 1-2h jeden Tag erreicht sein :wink: ).

Die Idee mit der for-Schleife war gut, jetzt muss ich nur noch das ganze in verschiedene Variablen packen, daraus soll ja am Ende ein RSS-Feed generiert werden.

Hab das jetzt mal Testweise ausprobiert, es klappt auch und er gibt den Spaß aus.
Kann jetzt leider aber im Internet nichts genaues finden wie ich das ganze “verpacken” könnte nun. (Ich geb zu, MySQL basierte RSS-Feeds waren schöner…).

Hier mal übrigens der “ganze Code”. Dürfte vlt. etwas hilfreicher sein, sämtliche RSS bezogenen Dinge, sind derzeit auskommentiert:

<?php error_reporting(E_ALL); ini_set('display_errors', 1); /*$title_feed = 'Lodestone RSS German'; $description_feed = 'German LodestoneRSS Feed'; $language_feed = 'de-DE';

$xml = new DOMDocument(‘1.0’, ‘UTF-8’);
$xml->formatOutput = true;
$roo = $xml->createElement(‘rss’);
$roo->setAttribute(‘version’, ‘2.0’);
$xml->appendChild($roo);
$cha = $xml->createElement(‘channel’);
$roo->appendChild($cha);

$hea = $xml->createElement(‘title’,utf8_encode(’’. $title_feed .’’));
$cha->appendChild($hea);
$hea = $xml->createElement(‘description’,utf8_encode(’’. $description_feed .’’));
$cha->appendChild($hea);
$hea = $xml->createElement(‘language’,utf8_encode(’’. $language_feed .’’));
$cha->appendChild($hea);
$hea = $xml->createElement(‘link’,htmlentities(‘https://api.double-spoiler.de/feed/’));
$cha->appendChild($hea);
$hea = $xml->createElement(‘lastBuildDate’,utf8_encode(date("". date(‘r’) ."").‘GMT’));
$cha->appendChild($hea);*/

$json= “https://api.double-spoiler.de/lodestone/topics?language=de”;
$options = [
‘ssl’ => [
‘verify_peer’ => false,
‘verify_peer_name’ => false,
],
];
$xiv_lodestone = file_get_contents($json, false, stream_context_create($options));
$xiv_lodestone = json_decode($xiv_lodestone);

foreach ($xiv_lodestone as $element) {
foreach($element as $key => $value){
echo “Key: “.$key.” Value: “.$value.”
”;
/$itm = $xml->createElement(‘item’);
$cha->appendChild($itm);
$dat = $xml->createElement(‘title’,utf8_encode(’’. $xiv_lodestone[‘title’] .’’));
$itm->appendChild($dat);
$dat = $xml->createElement(‘description’,utf8_encode(’’. $xiv_lodestone[‘html’] .’’));
$itm->appendChild($dat);
$dat = $xml->createElement(‘link’,htmlentities(’’. $xiv_lodestone[‘url’] .’’));
$itm->appendChild($dat);
$dat = $xml->createElement(‘pubDate’,utf8_encode(’’. $xiv_lodestone[‘timestamp’] .’’));
$itm->appendChild($dat);
$dat = $xml->createElement(‘guid’,htmlentities(’’. $xiv_lodestone[‘url’] .’’));
$itm->appendChild($dat);
/
}
}
/$xml->save(‘lodestone.rss’);/
?>

Hier übrigens mal sämtliche Daten “live”:
https://static.double-spoiler.de/rss_generator.php
https://api.double-spoiler.de/lodestone/topics?language=de&pretty=1

Problem gelöst, nach ein wenig Einarbeiten in for-Schleifen, klappt nun alles!

//EDIT
Hier mal wie der Code nun aussieht:

<?php error_reporting(E_ALL); ini_set('display_errors', 1); $title_feed = 'Lodestone RSS German'; $description_feed = 'German LodestoneRSS Feed'; $language_feed = 'de-DE';

$xml = new DOMDocument(‘1.0’, ‘UTF-8’);
$xml->formatOutput = true;
$roo = $xml->createElement(‘rss’);
$roo->setAttribute(‘version’, ‘2.0’);
$xml->appendChild($roo);
$cha = $xml->createElement(‘channel’);
$roo->appendChild($cha);

$hea = $xml->createElement(‘title’,utf8_encode(’’. $title_feed .’’));
$cha->appendChild($hea);
$hea = $xml->createElement(‘description’,utf8_encode(’’. $description_feed .’’));
$cha->appendChild($hea);
$hea = $xml->createElement(‘language’,utf8_encode(’’. $language_feed .’’));
$cha->appendChild($hea);
$hea = $xml->createElement(‘link’,htmlentities(‘https://api.double-spoiler.de/feed/’));
$cha->appendChild($hea);
$hea = $xml->createElement(‘lastBuildDate’,utf8_encode(date("". date(‘r’) ."").‘GMT’));
$cha->appendChild($hea);

$json= “https://api.double-spoiler.de/lodestone/topics?language=de”;
$options = [
‘ssl’ => [
‘verify_peer’ => false,
‘verify_peer_name’ => false,
],
];
iconv(“UTF-8”, “UTF-8”, $json);
$xiv_lodestone = file_get_contents($json, false, stream_context_create($options));
$xiv_lodestone = json_decode($xiv_lodestone);

foreach ( $xiv_lodestone as $output ) {
$itm = $xml->createElement(‘item’);
$cha->appendChild($itm);
$dat = $xml->createElement(‘title’,utf8_encode(’’. $output->title .’’));
$itm->appendChild($dat);
$dat = $xml->createElement(‘description’,utf8_encode(’’. $output->html .’’));
$itm->appendChild($dat);
$dat = $xml->createElement(‘link’,htmlentities(’’. $output->url .’’));
$itm->appendChild($dat);
$dat = $xml->createElement(‘pubDate’,utf8_encode(’’. $output->timestamp .’’));
$itm->appendChild($dat);
$dat = $xml->createElement(‘guid’,htmlentities(’’. $output->url .’’));
$itm->appendChild($dat);
}
$xml->save(‘lodestone.rss’);
?>

Manchmal ist die Lösung doch so einfach :D…
Jetzt mal noch schauen wieso iconv(); nicht arbeitet :3.