tutorials.de Buch-Aktion 05/2012
ERLEDIGT
NEIN
ANTWORTEN
13
ZUGRIFFE
471
EMPFEHLEN
  • An Twitter übertragen
  • An Facebook übertragen
AUF DIESES THEMA
ANTWORTEN
  1. #1
    filament filament ist offline Mitglied Silber
    Registriert seit
    Oct 2010
    Beiträge
    53
    Hallo liebe Community,

    ich habe auf meiner Webseite ein eigenes Script geschrieben zum News verwalten. Dieses habe ich erweitert, um einen RSS Feed zu erzeugen. Mir wird allerdings beim Aufrufen der XML Datei mitgeteilt, dass diese fehlerhaft wäre. Mach ich bei der Erzeugung etwas falsch****?

    Hier mein Code:

    PHP-Code:
    <?php
       
    if (isset($_SESSION["user_premium"]) AND $_SESSION["user_premium"] > 0)
       {
        
    unlink("rss/rss.xml");
        
    $fp fopen("rss/rss.xml","w+");
        
    fwrite($fp,"<?xml version=\"1.0\" encoding=\"iso-8859-1\" ?>\n");
        
    $verbindung mysql_connect($server$user$passwort) or die ("Es konnte keine Verbindung zum Server hergestellt werden!");
        
    mysql_select_db($datenbank) or die ("Diese Datenbank existiert nicht!");
        
    fputs($fp,"<rss version=\"2.0\">\n");
        
    fputs($fp," <channel>\n");
        
    fputs($fp,"  <title>RSS-Feed</title>\n");
        
    fputs($fp,"  <link>URL</link>\n");
        
    fputs($fp,"  <discription>Mybetstats News Feed</discription>\n");
        
    fputs($fp,"  <language>de-DE</language>\n");
        
    $datensatz mysql_query("SELECT datum FROM news ORDER BY id DESC LIMIT 0,1");
        
    $row mysql_fetch_assoc($datensatz);
        
    $pubDate date("D, d M Y H:i:s T"$row['datum']);
        
    fputs($fp,"  <lastBuildDate>$pubDate</lastBuildDate>\n");
        
    $daten_news mysql_query("SELECT * FROM news ORDER BY id DESC LIMIT 0,200");
        while (
    $row mysql_fetch_assoc($daten_news))
        {
         
    $schrift3 mysql_real_escape_string($row['schrift']);
         
    $autor3 mysql_real_escape_string($row['autor']);
         
    $id3 $row['id'];
         
    $text3 mysql_real_escape_string($row['text']);
         
    fputs($fp," <item>\n");
         
    fputs($fp,"  <title>$schrift3</title>\n");
         
    fputs($fp,"  <author>$autor3</author>\n");
         
    fputs($fp,"  <pubDate>$pubDate3</pubDate>\n");
         
    fputs($fp,"  <link>http://www.seite.php?id=$id3</link>\n");
         
    fputs($fp,"  <discription>$text3</discription>\n");
         
    fputs($fp," </item>\n");
        }
        
    fputs($fp," </channel>\n");
        
    fputs($fp,"</rss>\n");
        
    fclose($fp);
        
    mysql_close($verbindung);
        echo 
    "<p class='success'>RSS Datei erfolgreich aktualisiert!</p>";
       }
       else
       {
        echo 
    "Du bist nicht berechtigt dazu oder nicht eingeloggt!";
       }
       
    ?>
     

  2. #2
    Avatar von saftmeister
    saftmeister saftmeister ist offline Der Saft sei mit dir
    tutorials.de Premium-User
    Registriert seit
    May 2006
    Ort
    There is no place like 127.0.0.1
    Beiträge
    3.521
    Schon den Quelltext des XML im Browser anzeigen lassen? Welchen Browser verwendest du zum testen?
     
    Grüße
    --
    Qualität des Codes wird in WTF's/Min gemessen: Je mehr, desto schlechter der Code ;-)

  3. #3
    filament filament ist offline Mitglied Silber
    Registriert seit
    Oct 2010
    Beiträge
    53
    Du kannst es dir ja gerne selbst ansehen: www.mybetstats.de/rss/rss.xml

    Ich hab mir die XML runtergeladen und angesehen. Er gibt scheinbar einiges an Sachen richtig aus. Aber irgendwo mag er nicht mehr. Er sagt mir dann, dass er irgendwo Anführungszeichen erwartet hätte, die er aber nicht gefunden hat.

    Aus dem Grund hatte ich versucht es mit mysql_escape_string umzuwandeln. Scheint nicht geklappt zu haben?

    Im Prinzip habe ich es nur gemacht weil ich den Feed wo anmelden wollte und ich dort die Nachricht bekam, dass es keinen Link zu einem Feed gebe. Dann habe ich es hier aufgerufen und die Fehlermeldung gesehen. (Hab hier allerdings gerade nur nen IE6)

    Den im Header habe ich nichts anders als bei meinen anderen Seiten gemacht, die aber funktioniert haben. Dort läuft es allerdings über Wordpress muss ich sagen.
    Geändert von filament (28.11.11 um 17:03 Uhr) Grund: Was vergessen
     

  4. #4
    Avatar von saftmeister
    saftmeister saftmeister ist offline Der Saft sei mit dir
    tutorials.de Premium-User
    Registriert seit
    May 2006
    Ort
    There is no place like 127.0.0.1
    Beiträge
    3.521
    Also bei mir im FF 8.0 siehts prima aus:

    Mybetstats RSS-Feed



    Mehr News in Zukunft
    Wieder zurück..
    Top-Wette des Wochenende, Dynamo Dresden gegen Hansa Rostock
    Was ist mybetstats? Wetten analysieren einfach gemacht!
    Wird als RSS Feed angeboten. Funktioniert 1a! Browserwechsel schon in Betracht gezogen? IE 6.0 is ja nicht grad.... nicht ja?
     
    Grüße
    --
    Qualität des Codes wird in WTF's/Min gemessen: Je mehr, desto schlechter der Code ;-)

  5. #5
    filament filament ist offline Mitglied Silber
    Registriert seit
    Oct 2010
    Beiträge
    53
    Naja war auf Arbeit. Hab zu hause mehrere Browser. Aber trotzdem sagt mir der Dienst es gibt keinen feed. Also scheint ja irgendwas nicht zu stimmen oder nicht? Schliesslich erkennt der dienst zwei andere feeds von mir auch? Oder könnte das daran liegen das in Wordpress der Ordner direkt feed heisst?
     

  6. #6
    Avatar von saftmeister
    saftmeister saftmeister ist offline Der Saft sei mit dir
    tutorials.de Premium-User
    Registriert seit
    May 2006
    Ort
    There is no place like 127.0.0.1
    Beiträge
    3.521
    Ich hab das grad mal durch den XML-Validator von w3.org geschickt und bin auf den Fehler gestoßen:

    <a href=\'http://www.sportwettenvergleich.net/\' target=\'_blank\'>Sportwettenanbieter im Vergleich</a>

    Versuch doch mal

    - nicht zu maskieren (\ vor dem ' weglassen)
    - statt dem Single- (') ein Double-Quote (") zu verwenden
     
    Grüße
    --
    Qualität des Codes wird in WTF's/Min gemessen: Je mehr, desto schlechter der Code ;-)

  7. #7
    filament filament ist offline Mitglied Silber
    Registriert seit
    Oct 2010
    Beiträge
    53
    So nun bin ich zu Hause am Rechner und kann folgendes sagen. Mein Firefox zeigt mir den Feed auch korrekt an. Mein IE9 aber sagt genau das gleiche wie mein IE6 auf Arbeit.

    Also ich hab mir das jetzt mal genau angeguckt und einige Änderungen auch in den Texten innerhalb der Datenbank vorgenommen. Hat aber nichts gebracht. Nun habe ich mir die Fehlermeldung mal genau angesehen. Er schreibt mir, dass das Start-Tag nicht mit dem End-Tag zusammen passt. Er scheint hier wohl die HTML Elemente durcheinander zu bringen denn laut Datei kommt <p>Text</p></discription>
     

  8. #8
    Avatar von saftmeister
    saftmeister saftmeister ist offline Der Saft sei mit dir
    tutorials.de Premium-User
    Registriert seit
    May 2006
    Ort
    There is no place like 127.0.0.1
    Beiträge
    3.521
    Richtig, ich hab es sowohl mit w3 als auch validome versucht:

    Fehler (2)ZeileDateiname:http://www.mybetstats.de/rss/rss.xml2Spalte:21 Fehlerie Deklaration des Elementes 'rss' kann nicht gefunden werden. Fehlerstelle:<rss version='2.0'>

    ZeileDateiname:http://www.mybetstats.de/rss/rss.xml182Spalte:1776 Fehler:Elemententyp "p" muss mit dem passenden Endtag "</p>" geschlossen werden. Fehlerstelle:...heiden, um Ihre Wetten noch genauer analysieren zu können!</discription>
    Ein großes Problem sehe ich darin, dass das XML nicht formatiert ist, das könntest du so umgehen:

    - Lade den kompletten XML-Output in simplexml_load_string()
    - Du bekommst ein SimpleXMLElement zurück (vermutlich knallt es dort schon, was aber nicht schlecht wäre)
    - Das SimpleXMLElement bietet eine Methode asXml() an, was dir dann das XML schön formatiert zurück geben sollte.

    Wahlweise kannst du natürlich auch alles über DOM machen (ist meine persönliche Empfehlung).
     
    Grüße
    --
    Qualität des Codes wird in WTF's/Min gemessen: Je mehr, desto schlechter der Code ;-)

  9. #9
    filament filament ist offline Mitglied Silber
    Registriert seit
    Oct 2010
    Beiträge
    53
    Zitat Zitat von saftmeister Beitrag anzeigen
    Richtig, ich hab es sowohl mit w3 als auch validome versucht:



    Ein großes Problem sehe ich darin, dass das XML nicht formatiert ist, das könntest du so umgehen:

    - Lade den kompletten XML-Output in simplexml_load_string()
    - Du bekommst ein SimpleXMLElement zurück (vermutlich knallt es dort schon, was aber nicht schlecht wäre)
    - Das SimpleXMLElement bietet eine Methode asXml() an, was dir dann das XML schön formatiert zurück geben sollte.

    Wahlweise kannst du natürlich auch alles über DOM machen (ist meine persönliche Empfehlung).
    Okay, hab mir die Links mal angeschaut und parallel dazu meine xml so validiert, dass es zumindest erstmal angezeigt wird. Es funktioniert auch bei dem Anbieter und wird jetzt erkannt. Dazu habe ich den Text einfach als String genommen und erstmal die <p> und </p> durch "" ersetzt. Damit treten dann scheinbar keine Probleme mehr auf. Dazu habe ich festgestellt, dass es natürlich description heißen muss und nicht discription. Allerdings ist das noch nicht die schönste Lösung für das Problem.

    DOM hört sich für mich an, als wenn ich mich in eine neue Sprache reinfuchsen muss. Das will ich eigentlich vermeiden, dass wäre dann doch zuviel aufwand.

    Wenn ich dich richtig verstanden habe, dann nehme ich nun meinen kompletten Inhalt aus der Datenbank mit den XML Befehlen und stecke Sie in einen String.

    PHP-Code:
    unlink("rss/rss.xml");
    $string = "<?xml version='1.0' encoding='iso-8859-1' ?>\n<rss version='2.0'>\n<channel>\n<title>MyBetstats RSS-Feed</title>\n<link>http://www.mybetstats.de</link>\n<description>Mybetstats News Feed</description>\n<language>de-DE</language>\n";
    $verbindung = mysql_connect($server, $user, $passwort) or die ("Es konnte keine Verbindung zum Server hergestellt werden!");
    mysql_select_db($datenbank) or die ("Diese Datenbank existiert nicht!");
    $datensatz = mysql_query("SELECT datum FROM news ORDER BY id DESC LIMIT 0,1");
    $row = mysql_fetch_assoc($datensatz);
    $pubDate = date("D, d M Y H:i:s T", $row['datum']);
    $string.= "<lastBuildDate>$pubDate</lastBuildDate>\n";
    $daten_news = mysql_query("SELECT * FROM news ORDER BY id DESC LIMIT 0,200");
    while ($row = mysql_fetch_assoc($daten_news))
    {
     $string.="<item>\n";
     $string.="<title>$row['schrift']</title>\n";
     $string.="<author>$row['autor']</author>\n";
     $string.="<pubDate>$row['datum']</pubDate>\n";
     $string.="<link>http://www.mybetstats.de/kommentare.php?id=$row['id']</link>\n";
     $string.="<description>$row['text']</description>\n";
     $string.="</item>\n";
    }
    $string.="</channel>\n";
    $string.="</rss>\n";
    mysql_close($verbindung);
    Nun nehm ich den String und lade ihn mit simplexml_load:

    PHP-Code:
    $xml simplexml_load_string($string); 
    Danach nehme ich die Variable und mache ein Element daraus und gebe es dann aus?

    PHP-Code:
    $new_xml = new SimpleXMLElement($xml);
    echo 
    $new_xml->asXML(); 
    Falls richtig verstanden, wie speicher ich das nun in die XML Datei die auf meinem Server liegt? (Denn die Aktualisierung meiner XML geschieht beim Newsposten nicht beim Aufruf, weil ich dem Server die Last nehmen will)
    Geändert von filament (28.11.11 um 21:00 Uhr) Grund: Letzten Satz vergessen ;)
     

  10. #10
    Avatar von saftmeister
    saftmeister saftmeister ist offline Der Saft sei mit dir
    tutorials.de Premium-User
    Registriert seit
    May 2006
    Ort
    There is no place like 127.0.0.1
    Beiträge
    3.521
    Die Methode asXML() akzeptiert einen Parameter (default null), der den Dateinamen darstellt, unter dem die Datei gespeichert werden soll.

    DOM ist das Document Object Modell, eine Technologie, mit der du immer dann zu tun hast, wenn du im Internet surfst. HTML ist eine Untermenge von XML und XML ist quasi der Quellcode des DOM.

    Du kannst durch DOM eine XML-Root definiereren und dort Childs reinhängen. Das ist kein Hexenwerk, erfordert nur Sorgfalt beim Entwickeln. Macht sich aber durch prima Validierungsmöglichkeiten und nicht zu letzt sauberen PHP-Code bemerkbar. Das ist aber deine Entscheidung Wenn du dich dem noch nicht gewachsen fühlst, ist SimpleXML evtl. erstmal die bessere Wahl.
     
    Grüße
    --
    Qualität des Codes wird in WTF's/Min gemessen: Je mehr, desto schlechter der Code ;-)

  11. #11
    filament filament ist offline Mitglied Silber
    Registriert seit
    Oct 2010
    Beiträge
    53
    Erstmal nochmal für alle vorherigen Posts, danke für deine Hilfe.

    Zum Thema:
    Ist mein Code wie oben geschrieben denn richtig?
    Wie sähe das mit dem Dateinamen aus?

    PHP-Code:
    echo $new_xml->asXML(rss/rss.xml); 
    so?
     

  12. #12
    Avatar von saftmeister
    saftmeister saftmeister ist offline Der Saft sei mit dir
    tutorials.de Premium-User
    Registriert seit
    May 2006
    Ort
    There is no place like 127.0.0.1
    Beiträge
    3.521
    Zeichenketten müssen immer als solche ausgewiesen werden:

    Code php:
    1
    
    $new_xml->asXML("rss/rss.xml");

    Dann sollte im Verzeichnis rss eine Datei mit dem Namen rss.xml erzeugt werden, die die Inhalt des SimpleXMLElement-Objekts und seiner Kinder hat. Sollte dann direkt über den Browser erreichbar sein.

    Im übrigen empfehle ich dir, bei Tests folgende zwei Zeilen in die ersten Zeilen deiner Scripts einzubauen:

    Code php:
    1
    2
    
    error_reporting(E_ALL|E_STRICT);
    ini_set('display_errors', 1);

    Dadurch kannst du Fehler und Warnungen sehen und das hilft uns bei der Analyse der Probleme.

    EDIT: Zu deinem Code von oben. Eigentlich brauchst du kein neues SimpleXMLElement erzeugen, denn die Funktion simplexml_load_string() gibt schon ein SimpleXMLElement-Objekt zurück, das du direkt verwenden kannst. Du könntest also die Aktion asXML() direkt mit der Variable $xml verwenden.
    Geändert von saftmeister (28.11.11 um 21:54 Uhr)
     
    Grüße
    --
    Qualität des Codes wird in WTF's/Min gemessen: Je mehr, desto schlechter der Code ;-)

  13. #13
    filament filament ist offline Mitglied Silber
    Registriert seit
    Oct 2010
    Beiträge
    53
    Das heißt ich mache direkt $xml->asXML("rss/rss.xml"); ?
    Wie sieht das bei der Funktion mit ChmodRechten aus? Wie muss ich die verteilen? Kann ich vorher bei der Funktion die Datei mit unlink löschen, und die Funktion aufrufen? Sprich wird dann mit Aufruf direkt eine neue Datei erstellt?
     

  14. #14
    Avatar von saftmeister
    saftmeister saftmeister ist offline Der Saft sei mit dir
    tutorials.de Premium-User
    Registriert seit
    May 2006
    Ort
    There is no place like 127.0.0.1
    Beiträge
    3.521
    Genau.

    Die Zugriffsrechte der neu erstellten Datei (wenn du vorher mit unlink löschst) kann ich nicht vorhersagen, denn das ist System-Konfigurationsabhängig. Wenn du sicher gehen willst, kannst du mit dem Befehl chmod() die Zugriffsrechte in einen definierten Zustand bringen. Beispiel:

    Code php:
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    
    // Nur als Hilfe den Pfad in eine Variable speichern
    $datei = "rss/rss.xml";
    // Erst Datei löschen
    if(!unlink($datei)) {
      die("Konnte $datei nicht löschen");
    }
    // Dann Datei neu erzeugen
    $xml->asXML($datei);
    if(!file_exists($datei)) {
      die("Konnte XML nicht in $datei schreiben");
    }
    // Dann Zugriffsrechte definieren (Eigentümer=lesen,schreiben; Gruppe=lesen; Sonstige=lesen)
    if(!chmod($datei, 0644)) {
      die("Konnte die Zugriffsrechte nicht definieren");
    }
     
    Grüße
    --
    Qualität des Codes wird in WTF's/Min gemessen: Je mehr, desto schlechter der Code ;-)

Ähnliche Themen

  1. Variable wird nich richtig ausgegeben/übergeben
    Von Captain Subtext im Forum Flash Plattform
    Antworten: 5
    Letzter Beitrag: 18.12.07, 09:37
  2. Checkbox wird nicht richtig ausgegeben
    Von Luke85 im Forum PHP
    Antworten: 8
    Letzter Beitrag: 02.11.07, 12:15
  3. Array wird "nicht richtig" ausgegeben
    Von Gifty43 im Forum PHP
    Antworten: 4
    Letzter Beitrag: 29.04.07, 11:23
  4. Datei wird nicht richtig
    Von okoman im Forum .NET Archiv
    Antworten: 5
    Letzter Beitrag: 12.05.05, 17:54
  5. Top 10 wird nicht richtig ausgegeben
    Von ultrasonic im Forum PHP
    Antworten: 15
    Letzter Beitrag: 17.10.03, 12:50

Stichworte