kostenloser Webspace werbefrei: lima-city


XML-Feed aus Datenbank erstellen

lima-cityForumProgrammiersprachenPHP, MySQL & .htaccess

  1. Autor dieses Themas

    jnuk

    jnuk hat kostenlosen Webspace.

    Hey Leute
    Ich würde gerne für meine Webseite ein RSS-Feed erstellen, welches erst Daten aus einer Datenbank liest und diese dann in eine XML-Datei packt. Dieses Skript soll immer dann ausgeführt werden, wenn ein neuer Datensatz in die Datenbank geschrieben wird. Das sollte kein Problem darstellen, da ich das Skript einfach in die Datei packen kann, mit der man in die DB schreibt. Ich habe auch schon das 'ergooglet':
    <?php
        
       $link = mysql_connect("mysql.lima-city.de","*****","*****") or die ("Keine Verbindung moeglich"); 
       mysql_select_db("db_******_1") or die ("Die Datenbank existiert nicht"); 
    
        $query = "SELECT name, inhalt, datum FROM teacher_text";
        $erg = mysql_query($query);
        while($row = mysql_fetch_object($erg)) 
        { 
            $inhalt = $row->inhalt; 
            $inhalt = htmlentities($inhalt); 
            $inhalt = nl2br($inhalt); 
            $datum = date("d.m.Y H:i", $row->datum); 
            $name = $row->name;
        }
        
        
        
        $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('Lehrer-Feed')); 
        $cha->appendChild($hea);
        $hea = $xml->createElement('description', utf8_encode('Immer auf dem neusten Stand!')); 
        $cha->appendChild($hea);
        $hea = $xml->createElement('language', utf8_encode('de')); 
        $cha->appendChild($hea);
        $hea = $xml->createElement('link', htmlentities('http://www.ass-g7a.tk/teacher')); 
        $cha->appendChild($hea);
        $hea = $xml->createElement('lastBuildDate', utf8_encode(date("D, j M Y H:i:s ").'GMT'));
        $cha->appendChild($hea);
        $itm = $xml->createElement('item');
        $cha->appendChild($itm);
        $dat = $xml->createElement('title', utf8_encode($name)); 
        $itm->appendChild($dat);    
        $dat = $xml->createElement('description', utf8_encode($inhalt)); 
        $itm->appendChild($dat);    
        $dat = $xml->createElement('link', htmlentities('http://www.ass-g7a.tk/teacher/'));
        $itm->appendChild($dat);    
        $dat = $xml->createElement('pubDate', utf8_encode($datum)); 
        $itm->appendChild($dat);    
        $dat = $xml->createElement('guid', htmlentities('http://www.ass-g7a.tk/teacher/')); 
        $itm->appendChild($dat);
        $xml->save('feed.xml');
    ?>
    Das Problem hierbei ist, dass die Datei anscheinend überschrieben wird und somit immer nur der neuste Beitrag angezeigt wird. Kennt ihr andere Möglichkeiten um Feeds zu erstellen oder könnt ihr mir bei dem Skript oben helfen?
    Danke im Voraus
  2. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

  3. jnuk schrieb:
    Das Problem hierbei ist, dass die Datei anscheinend überschrieben wird und somit immer nur der neuste Beitrag angezeigt wird. Kennt ihr andere Möglichkeiten um Feeds zu erstellen oder könnt ihr mir bei dem Skript oben helfen?
    Danke im Voraus


    Falsch. Das Problem ist, dass du es dir total umständlich machst :D

    Da du einen Dynamischen RSS-Feed haben möchtest fügst du aber VORHER deine RSS-Definition ein...

    <?php header("Content-type: text/xml");
    echo "<?xml version=\"1.0\" encoding=\"ISO-8859-1\" ?>"; ?>
    <rss version="2.0">
    <channel>


    Warum als echo ist schnell erklärt: Das <? bei der xml Definition wird in Php dateien als "php Anfang" angesehen und endet nur mit einem Parse Fehler.

    Nachdem du jetzt deinen Header hast kannst du deinen Feed ein wenig mit Informationen schmücken, dass geht wie folgt:

    <title>Website name</title> 
    <link>http://www.beispiel.de</link> 
    <description>Beschreibung von Website</description> 
    <language>de-de</language> 
    <pubDate>Datum der Erstellung</pubDate>
    <docs>http://www.beispiel.to/rss.php</docs>
    <webMaster>info@beispiel.de</webMaster>


    Jetzt erst geht es an den eigentlichen Inhalt:

    <?php
       $link = mysql_connect("mysql.lima-city.de","*****","*****") or die ("Keine Verbindung moeglich"); 
       mysql_select_db("db_******_1") or die ("Die Datenbank existiert nicht"); 
    
        $query = "SELECT name, inhalt, datum FROM teacher_text";
        $erg = mysql_query($query);
        while($row = mysql_fetch_object($erg)) 
        { 
            $inhalt = $row->inhalt; 
            $inhalt = htmlentities($inhalt); 
            $inhalt = nl2br($inhalt); 
            $datum = date("d.m.Y H:i", $row->datum); 
            $name = $row->name;
    ?>
        <item>
        <title><?php echo $name; ?></title>    
        <link>
        Hier könntest du noch einen Link zum Inhalt einfügen
        </link>    
        <pubDate>
        <?php echo $datum; ?>
        </pubDate>
        <description>
        <?php  echo $inhalt; ?>
        </description>
        </item>
       <?php 
    }
    mysql_free_result($erg);
    mysql_close($link);
     ?>



    Was viele nicht wissen, ist dass man php auch schließen kann ohne alle klammern zu schließen.. Das habe ich getan, danach dann den RSS-Inhalt eingebaut und anschließend erst die Klammer geschlossen, die Ergebnisse befreit und die Verbindung geschlossen.

    Wenn du ein wenig Englisch kannst ist der Feed selbst-erklären, an sonsten nachfragen ;)

    Und PS:
    Vielleicht findest du ja den Fehler ;) Ich habe mit Absicht vergessen einige Tags zu schließen (kein php), damit du mal selbst durch schaust und etwas besser verstehst. Wenn du die Fehler nicht findest sag bescheid..



    Beitrag zuletzt geändert: 3.3.2012 19:10:17 von kill-a-teddy
  4. @kill-a-teddy: Die Idee, den Feed in einer XML-Datei zu speichern ist nicht umständlich, sondern sinnvoll.
    So muß der Feed nur dann neu generiert werden, wenn wirklich neue Inhalte zur Verfügung stehen, das ist, sofern sich nicht zu häufig Inhalte ändern, performanter.

    Das Problem hierbei ist, dass die Datei anscheinend überschrieben wird und somit immer nur der neuste Beitrag angezeigt wird.

    Die Datei wird überschrieben und das ist auch in Ordnung. Dein Problem liegt im while-Block. Du überschreibst dort mit jedem Durchgang die ausgelesenen Werte. Dementsprechend kommt an Ende nur der letzte Eintrag an.

    Ein leichte Änderung in der Reihenfolge hilft dem ab:


    <?php
    
    //Feed-Header generieren
        $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('Lehrer-Feed')); 
        $cha->appendChild($hea);
        $hea = $xml->createElement('description', utf8_encode('Immer auf dem neusten Stand!')); 
        $cha->appendChild($hea);
        $hea = $xml->createElement('language', utf8_encode('de')); 
        $cha->appendChild($hea);
        $hea = $xml->createElement('link', htmlentities('http://www.ass-g7a.tk/teacher')); 
        $cha->appendChild($hea);
        $hea = $xml->createElement('lastBuildDate', utf8_encode(date("D, j M Y H:i:s ").'GMT'));
        $cha->appendChild($hea);
        
    
    //Daten aus der DB holen
       $link = mysql_connect("mysql.lima-city.de","*****","*****") or die ("Keine Verbindung moeglich"); 
       mysql_select_db("db_******_1") or die ("Die Datenbank existiert nicht"); 
    
        $query = "SELECT name, inhalt, datum FROM teacher_text";
        $erg = mysql_query($query);
        while($row = mysql_fetch_object($erg)) 
        { 
            $inhalt = $row->inhalt; 
            $inhalt = htmlentities($inhalt); 
            $inhalt = nl2br($inhalt); 
            $datum = date("d.m.Y H:i", $row->datum); 
            $name = $row->name;
    
    //Itemdaten schreiben
            $itm = $xml->createElement('item');
            $cha->appendChild($itm);
            $dat = $xml->createElement('title', utf8_encode($name)); 
            $itm->appendChild($dat);    
            $dat = $xml->createElement('description', utf8_encode($inhalt)); 
            $itm->appendChild($dat);    
            $dat = $xml->createElement('link', htmlentities('http://www.ass-g7a.tk/teacher/'));    
            $itm->appendChild($dat);    
            $dat = $xml->createElement('pubDate', utf8_encode($datum)); 
            $itm->appendChild($dat);    
            $dat = $xml->createElement('guid', htmlentities('http://www.ass-g7a.tk/teacher/')); 
            $itm->appendChild($dat);
        }
    
    
    //Feed in Datei schreiben
        $xml->save('feed.xml');
    ?>


    Wenn ich mich jetzt nicht verkopiert habe, müßte es so funktionieren. :wink:

  5. Autor dieses Themas

    jnuk

    jnuk hat kostenlosen Webspace.

    Danke Fatfreddy, aber jetzt wird nur der erste Eintrag angezeigt... Also wenn ich in der DB hab
    NAME   |   INHALT
    -----------------
    jnuk   |   ASDF
    kunj  |   GHJK

    Dann wird im Feed nur jnuk/ASDF angezeigt, obwohl die feed.xml so aussieht:
    <?xml version="1.0" encoding="UTF-8"?>
    <rss version="2.0">
      <channel>
        <title>Lehrer-Feed</title>
        <description>Immer auf dem neusten Stand!</description>
        <language>de</language>
        <link>http://www.ass-g7a.tk/teacher</link>
        <lastBuildDate>Sat, 3 Mar 2012 20:49:34 GMT</lastBuildDate>
        <item>
          <title>jnuk</title>
          <description>ASDF</description>
          <link>http://www.ass-g7a.tk/teacher/</link>
          <pubDate>03.03.2012 20:48</pubDate>
          <guid>http://www.ass-g7a.tk/teacher/</guid>
        </item>
        <item>
          <title>kunj</title>
          <description>GHJK</description>
          <link>http://www.ass-g7a.tk/teacher/</link>
          <pubDate>03.03.2012 20:49</pubDate>
          <guid>http://www.ass-g7a.tk/teacher/</guid>
        </item>
      </channel>
    </rss
    Ich glaube, dass immer nur die Zeile mit der ID 1 ausgegeben wird.

    Beitrag zuletzt geändert: 3.3.2012 20:58:48 von jnuk
  6. Die XML-Datei scheint mir in Ordnung zu sein.

    Eventuell hängt da noch was im Browser-Cache. Einfach mal selbigen löschen. :wink:
  7. Autor dieses Themas

    jnuk

    jnuk hat kostenlosen Webspace.

    Hab ich bereits mehrfach getan... Kannst ja selber mal hier gucken. Vielleicht liegst auch nur an Safari.
    EDIT: Ja, es liegt an Safari, im FireFox geht's.

    Beitrag zuletzt geändert: 3.3.2012 21:58:47 von jnuk
  8. http://www.myfreak.tk/2012/server/cachen-von-html-verhindern-mit-htaccess/

    Statt
    htm|html|php
    nimmst du eine änderung vor:
    xml


    EDIT: Wenn du eine Seite Ohne Cache reloaden willst hilft bei den meisten (zumindest Chrome und Firefox) Strg + Umschalt + R

    Beitrag zuletzt geändert: 3.3.2012 22:04:46 von dexus85
  9. Diskutiere mit und stelle Fragen: Jetzt kostenlos anmelden!

    lima-city: Gratis werbefreier Webspace für deine eigene Homepage

Dir gefällt dieses Thema?

Über lima-city

Login zum Webhosting ohne Werbung!