RSS mit PHP füttern

Berbatov

Rated R Superstar
ID: 208039
L
20 April 2006
3.979
192
Hey,
ich bin zur Zeit einen RSS Feed am erstellen, wo ich den Großteil aus einer MySQL Datenbank auslese, soweit klappt alles.

Probleme habe ich allerdings mit der <description> von den items. Dort würde ich gerne den Beginn des contents anzeigen.

Dafür habe ich folgende Funktion gebastelt:
PHP:
<?php
$test = substr(strstr(file_get_contents('https://www.domain.com/Unterseite'), "<!-- bodytext -->"), 20, 183);
echo $test;
?>

Zuerst lese ich also den Quelltext ein, finde die bodytext-phrase und lasse mir dann die ersten x Zeichen dahinter ausgeben.

Ist sicherlich nicht das sauberste, funktioniert aber. bodytext kommt nur einmal vor und zwar direkt vor dem content. Somit gibt er mir also die ersten Zeichen des Contents an. Wenn man diese Funktion alleine als Datei speichert, klappt auch alles prima, Probleme gibt es allerdings, wenn ich es in die RSS Datei einfüge:

PHP:
...
echo "<link>https://www.domain.com/Unterseite</link>";
$test = substr(strstr(file_get_contents('https://www.domain.com/Unterseite'), "<!-- bodytext -->"), 20, 183);
echo "<description>".$test."</description>";
...

Ist ja an sich nichts anderes, dennoch zeigt er mir kein einziges Item mehr an. Weiss jemand woran es liebt? Das <pubDate> habe ich zB auch mit einer Variablen eingefügt und es klappt...

Muss dazu sagen, dass ich den Text aus verschiedenen Gründen nicht aus der MySQL Datenbank einlesen kann, muss also irgendwie so gehen.
 
wie fütterst du denn die andere Variable in dem Fall wo es geht ?
Poste mal den Code dazu bitte und vll siehst oder verstehst du dann auch warum es nicht geht ?
 
wie fütterst du denn die andere Variable in dem Fall wo es geht ?
Poste mal den Code dazu bitte und vll siehst oder verstehst du dann auch warum es nicht geht ?

Bitteschön:
PHP:
echo "<item>";

echo "<title>".$r['page_title']."</title>";

echo "<link>https://www.domain.com/".$r['page_title']."</link>";

$text = substr(strstr(file_get_contents('https://www.domain.com/Unterseite'), '<!-- bodytext -->'), 20, 183);
echo "<description>".$text."</description>";

    $year = substr($r['page_touched'], 0, 4);
    $month = substr($r['page_touched'], 4, 2);
    $day = substr($r['page_touched'], 6, 2);
    $hour = substr($r['page_touched'], 8, 2);
    $min = substr($r['page_touched'], 10, 2);
    $sec = substr($r['page_touched'], 12, 2);
    $pubdate = date('D, d M Y H:i:s O', mktime($hour, $min, $sec, $month, $day, $year));
echo "<pubDate>".$pubdate."</pubDate>";

echo "</item>";

Wird jeweils durch eine Schleife immer wiederholt.
Normal liegt mir das Datum immer so vor: 20101112145632. Zuerst zerteil ich das halt und steck es dann in die pubdate Variable. Die wird dann nur ausgebenen. Alles klappt bis auf Description.

An sich ist das mit dem date ja genau wie bei Description, Variable wird mit einer Funktion gefüttert und dann ausgegeben...

Edit: Das $r['page_title'] stammt aus dem while($r = mysqli_fetch_assoc($q)) und aus der MySQL Abfrage.
 
Zuletzt bearbeitet:
steht der befehl mit substr auf 2 zeilen ?
für das RSS Format gibt es ein restriktives Format.
Da du in der Zeile mit einem / beginnst kann er eventuell durcheinander kommen, oder hast du den Code nur auf 2 Zeilen hier gepostet, der Leserlichkeit wegen ?
 
Zuletzt bearbeitet:
steht der befehl mit substr auf 2 zeilen ?
für das RSS Format gibt es ein restriktives Format.
Da du in der Zeile mit einem / beginnst kann er eventuell durcheinander kommen, oder hast du den Code nur auf 2 Zeilen hier gepostet, der Leserlichkeit wegen ?

Wird automatisch von der Forensoftware hier umgebrochen. Normal geht die Zeile von $text bis 183);
 
Zuletzt bearbeitet:
Dann ist das auch nur ein Synonym für den eigentlichen Text oder
"... <!-- bodytext --> ..." <- ?

Wenn du < oder > in "" hast, ersetze sie mit < >

Schau einfach mal durch, welche Zeichen im Text vorhanden sind und schau dir bitte die Spezifikation an für HTML konforme Zeichen in dem Text.

Eventuell liegt es an so etwas
 
Dann ist das auch nur ein Synonym für den eigentlichen Text oder
"... <!-- bodytext --> ..." <- ?

Wenn du < oder > in "" hast, ersetze sie mit < >

Schau einfach mal durch, welche Zeichen im Text vorhanden sind und schau dir bitte die Spezifikation an für HTML konforme Zeichen in dem Text.

Eventuell liegt es an so etwas

Danke schonmal, hab die ganzen Sonderzeichen bei bodytext mal entfernt.

PHP:
$text = substr(strstr(file_get_contents('https://www.domain.com/Unterseite'), 'bodytext'), 20, 179);
echo "<description>".$text."</description>";

Funktioniert leider immer noch nicht. Im Trockenen (nur das alleine in einer .php Datei) klappts, sobald ich es in der rss Datei ausgebe, zeigt er mir kein einziges Item mehr an.
bodytext ist kein Platzhalter, sondern steht bei mir als Kommentar im Quelltext auf jeder Unterseite vor dem Content. Da es nur einmal vorkommt und wohl kaum als Wort im Text gebraucht wird, bin ich so sicher, den Anfang des contents zu erwischen.


Hier mal zwei Beispiel Dateien:

info.php
PHP:
<?php
$test = substr(strstr(file_get_contents('https://www.tagesschau.de/inland/stuttgart498.html'), 'topline'), 9, 150);
echo $test;
?>

Funktioniert einwandfrei

feedexample.php
PHP:
<?php
echo "<?xml version='1.0' ?>";
echo "<rss version='2.0'>";

echo "<channel>";
echo "<title>Name</title>";
echo "<link>https://www.domain.com</link>";
echo "<description>blablabla</description>";

echo "<item>";
echo "<title>Titel</title>";
echo "<link>https://www.tagesschau.de/inland/stuttgart498.html</link>";
$text = substr(strstr(file_get_contents('https://www.tagesschau.de/inland/stuttgart498.html'), 'topline'), 9, 150);
echo "<description>".$text."</description>";
    $year = substr('20101111111111', 0, 4);
    $month = substr('20101111111111', 4, 2);
    $day = substr('20101111111111', 6, 2);
    $hour = substr('20101111111111', 8, 2);
    $min = substr('20101111111111', 10, 2);
    $sec = substr('20101111111111', 12, 2);
    $pubdate = date('D, d M Y H:i:s O', mktime($hour, $min, $sec, $month, $day, $year));
echo "<pubDate>".$pubdate."</pubDate>";
echo "</item>";
echo "</channel>";
echo "</rss>";
?>

Funktioniert nicht...
 
Zuletzt bearbeitet:
RSS nutzt XML, das is Dir klar.
Aber XML hat wohl andere Restriktive als RSS.

Schau mal bitte die XML Spezifikation an.

"<!" bedeutet dort etwas ganz anderes. Eventuell gibt es hier das Problem mit der Wurzel des Übels.

Warum läßt Du DIr nicht einfach aus einer PHP Datei heraus eine XML Datei erzeugen, die dann alles enthält, was dein RSS Feed braucht ?
 
RSS nutzt XML, das is Dir klar.
Aber XML hat wohl andere Restriktive als RSS.

Schau mal bitte die XML Spezifikation an.

"<!" bedeutet dort etwas ganz anderes. Eventuell gibt es hier das Problem mit der Wurzel des Übels.

Warum läßt Du DIr nicht einfach aus einer PHP Datei heraus eine XML Datei erzeugen, die dann alles enthält, was dein RSS Feed braucht ?


Hab mal zwei Beispieldateien gepostet (s. einen Post weiter oben), damit man weiss wie meine Datei aussieht. Schleife fehlt halt jetzt, ändert aber am Problem nichts.
 
steht denn auf der ausgegebenen Seite im Browser beim anschauen im Quelltext ein leeres Description Feld oder fehlt es ganz und gar ?
 
steht denn auf der ausgegebenen Seite im Browser beim anschauen im Quelltext ein leeres Description Feld oder fehlt es ganz und gar ?

YES, funktioniert.
Im Quellcode steht alles drin. Hab aber gesehen, dass da auch der ganze HTML Kram von den Seiten mit drinsteht (wenns halt in den ersten x Zeichen vorkommt).
Ein strip_tags() um die ganze Auslesefunktion und Problem ist gelöst :)

Danke
 
PHP:
    $year = substr('20101111111111', 0, 4);
    $month = substr('20101111111111', 4, 2);
    $day = substr('20101111111111', 6, 2);
    $hour = substr('20101111111111', 8, 2);
    $min = substr('20101111111111', 10, 2);
    $sec = substr('20101111111111', 12, 2);
    $pubdate = date('D, d M Y H:i:s O', mktime($hour, $min, $sec, $month
Wieso vergewaltigst du das Datum so? 8O
 
Weil es so in der Datenbank gespeichert wird.
Was fürn Feldtyp hat das denn? Wieso nimmst du kein DATETIME?

Kleiner Tip: SELECT UNIX_TIMESTAMP('20101112131415') funktioniert tadellos. ;)
Ok, war mir nicht bekannt, finde dieses Format aber irgendwie sehr "unschön". Wenn ich dann jedesmal erst den Unix-Timestamp errechnen muss, ist das ja auch keine schöne Lösung.