Archiv verlassen und diese Seite im Standarddesign anzeigen : Fehlermeldung im PHP Code für RSS Feed
belanglos 07-02-2008, 15:06 Hallo,
ich möchte, News auslesen und diese dann als RSS anbieten. Dazu habe ich in diesem Forum ein PHP Code gefunden und diesen entspreched modifiziert.
Allerdings bekomme ich die Fehlermeldung:
Warning: Cannot modify header information - headers already sent
by (output started at /www/htdocs/test/test/test.php:1) in
/www/htdocs/test/test/news.php on line 9
http://www.test.de Beschreibung de-de You have an error
in your SQL syntax; check the manual that corresponds to your
MySQL server version for the right syntax to use near '(created, '%a,
%d %b %Y %H:%i:%s') as created ORDER BY id DESC LIMIT 0,20' at line 1
Ich habe den folgenden Code benutzt:
<?php
define("ABSPATH", "http://".$_SERVER['HTTP_HOST'].dirname($_SERVER['PHP_SELF']));
$dbLink = mysql_connect("***", "***", "***") or die(mysql_error());
if( $dbLink ) {
mysql_select_db("***") or die(mysql_error());
}
header("Content-type: text/xml; charset=iso-8859-1");
echo "<?xml version=\"1.0\" encoding=\"iso-8859-1\"?>\n";
?>
<rss version="2.0">
<channel>
<title>Name des Feeds</title>
<link>http://www.test.de</link>
<description>Beschreibung</description>
<language>de-de</language>
<?php
$sqlQuery = "SELECT * from _news";
$sqlQuery.= "DATE_FORMAT(created, '%a, %d %b %Y %H:%i:%s') as created";
$dbRes = mysql_query($sqlQuery." ORDER BY id DESC LIMIT 0,20")
or die(mysql_error());
while( $dbRow = mysql_fetch_object($dbRes) ) {
echo "<item>\n";
echo "<title>".$dbRow->titel."</title>\n";
echo "<link>".ABSPATH."/artikel.php?id=".$dbRow->id."</link>\n";
echo "<description><![CDATA[".$dbRow->head."]]></description>\n";
echo "<pubDate>".$dbRow->created." ".date("O")."</pubDate>\n";
echo "</item>\n";
}
?>
</channel>
</rss>
Kann mir vielleicht jemand helfen und mir einen Tipp geben, warum ich diese Fehlermeldung erhalte?
Dafür bedanke ich mich bereits im Voraus
Gruß
1. Regeln beachten (code umbrechen!). ich will nicht auf einem 21" monitor scrollen
2. http://php-resource.de/forum/showthread.php?s=&threadid=62965
belanglos 07-02-2008, 15:16 Schon mal vielen Dank!
Ich hatte tatsächlich ein Leerzeichen vorm beginnenden PHP-Code.
Leider wird mir jetzt kein Inhalt angezeigt. Demnach werden wohl die News nicht ausgelesen. Was kann das noch für Gründe haben?
jahlives 07-02-2008, 15:21 in your SQL syntax; check the manual that corresponds to your
MySQL server version for the right syntax to use near '(created, '%a,
%d %b %Y %H:%i:%s') as created ORDER BY id DESC LIMIT 0,20' at
line 1
Du hast noch einen MySql Fehler in deiner Query
Leider wird mir jetzt kein Inhalt angezeigt.
im browser und/oder quelltext?? ;)
error_reporting oben??
belanglos 07-02-2008, 15:24 Original geschrieben von jahlives
Du hast noch einen MySql Fehler in deiner Query
Obwohl ich gar keine Fehlermeldung erhalte? Kann es dann sein, dass nicht zur Datenbank verbunden wird?
belanglos 07-02-2008, 15:26 Original geschrieben von arkos
im browser und/oder quelltext?? ;)
error_reporting oben??
Wenn ich die Datei jetzt aufrufe, sehe ich nur den üblichen RSS Feed Bildschirm im Firefox angezeigt. Und da wo die Titel mit Beschreibung stehen sollten, steht nur:
Name des Feeds
Beschreibung des Feeds
Original geschrieben von belanglos
Obwohl ich gar keine Fehlermeldung erhalte? Kann es dann sein, dass nicht zur Datenbank verbunden wird? jahlives hat ja nur aus der von dir geposteten Meldung zitiert. Falls du sie nicht mehr siehst, schau deinen Quelltext an.
Ausserdem ist deine Abfrage so offensichtlich falsch, dass du nicht mal Debug-Ausgaben benötigen solltest, um das zu sehen. Und sonst lass dir halt die Abfrage mal ausgeben.
belanglos 07-02-2008, 15:52 Original geschrieben von H2O
jahlives hat ja nur aus der von dir geposteten Meldung zitiert. Falls du sie nicht mehr siehst, schau deinen Quelltext an.
Ausserdem ist deine Abfrage so offensichtlich falsch, dass du nicht mal Debug-Ausgaben benötigen solltest, um das zu sehen. Und sonst lass dir halt die Abfrage mal ausgeben.
Kannst du mir einen Tipp geben? Ich bin ein aboluter Anfänger.
Den Tipp hab ich dir eigentlich schon gegeben. Aber wenn du es nicht schaffst, deine Abfrage auszugeben; so sieht sie aus:SELECT * from dfc_news DATE_FORMAT(created, '%a, %d %b %Y %H:%i:%s') as created ORDER BY id DESC LIMIT 0,20Wahrscheinlich sollte sie aber etwa so aussehen (ich eliminiere mal das SELECT * FROM (http://www.php-faq.de/q/q-sql-select.html)):SELECT
titel,
id,
head,
DATE_FORMAT(created, '%a, %d %b %Y %H:%i:%s') AS created
FROM
dfc_news
ORDER BY
id
LIMIT
0, 20;
jahlives 07-02-2008, 16:05 Lass dir mal deine Query ausgeben, wo wie du sie an die DB schickst. Poste das Resultat hier
belanglos 07-02-2008, 16:37 Original geschrieben von jahlives
Lass dir mal deine Query ausgeben, wo wie du sie an die DB schickst. Poste das Resultat hier
Meinst du direkt in der DB? Dort erhalte ich dann die entsprechenden News.
tontechniker 07-02-2008, 16:41 Lies den letzten Post von H2O (http://php-resource.de/forum/showthread.php?s=&threadid=89999#post571952), mach dir Gedanken darüber was dein Code hier macht: $sqlQuery = "SELECT * from _news";
$sqlQuery.= "DATE_FORMAT(created, '%a, %d %b %Y %H:%i:%s') as created";
$dbRes = mysql_query($sqlQuery." ORDER BY id DESC LIMIT 0,20")... und bau deine Query richtig um.Meinst du direkt in der DB? Dort erhalte ich dann die entsprechenden News. jahlives meint folgendes:echo $sqlQuery . " ORDER BY id DESC LIMIT 0,20";
Ich habs sie ja schon ausgegeben (ausser dass du nachträglich den Tabellennamen geändert hast).
Offensichtlich liest du aber die Antworten gar nicht, sonst wüstest du auch wie sie aussehen sollte.
belanglos 07-02-2008, 18:17 Original geschrieben von H2O
Offensichtlich liest du aber die Antworten gar nicht, sonst wüstest du auch wie sie aussehen sollte.
Sorry, diesen Eindruck wollte ich nicht erwecken.
Ersetzte ich dann
$sqlQuery = "SELECT * from _news";
$sqlQuery.= "DATE_FORMAT(created, '%a, %d %b %Y
%H:%i:%s') as created";
durch
$sqlQuery = "SELECT titel, id, head, DATE_FORMAT(created, '%a, %d %b %Y %H:%i:%s') AS created FROM
dfc_news ORDER BY id LIMIT 0, 20"; ?
Und benötige ich dann überhaupt noch:
$dbRes = mysql_query($sqlQuery." ORDER BY id DESC
LIMIT 0,20")
or die(mysql_error()); komplett? Die Sortierung kann wahrscheinlich raus oder?
Ich habe den PHP-Code jetzt folgendermaßen abgeändert:
<?php
define("ABSPATH",
"http://".$_SERVER['HTTP_HOST'].dirname($_SERVER['PHP_SELF']));
$dbLink = mysql_connect("***", "***", "***") or die(mysql_error());
if( $dbLink ) {
mysql_select_db("***") or die(mysql_error());
}
header("Content-type: text/xml; charset=iso-8859-1");
echo "<?xml version=\"1.0\" encoding=\"iso-8859-1\"?>\n";
?>
<rss version="2.0">
<channel>
<title>TITEL</title>
<link>http://www.test.de</link>
<description>Feed</description>
<language>de-de</language>
<?php
$sqlQuery = "SELECT titel, id, head, DATE_FORMAT(created,
'%a, %d %b %Y %H:%i:%s') AS created FROM _news ORDER BY id
LIMIT 0, 20";
$dbRes = mysql_query($sqlQuery)
or die(mysql_error());
while( $dbRow = mysql_fetch_object($dbRes) ) {
echo "<item>\n";
echo "<title>".$dbRow->titel."</title>\n";
echo "<link>".ABSPATH."/testphp=".$dbRow->id."</link>\n";
echo "<description><![CDATA[".$dbRow->head."]]></description>\n";
echo "<pubDate>".$dbRow->created." ".date("O")."</pubDate>\n";
echo "</item>\n";
}
?>
</channel>
</rss>
belanglos 07-02-2008, 20:49 Der nachfolgende Code scheint zu funktionieren. Ich habe jetzt nur folgenden Probleme:
1. Wie bekomme ich es hin, dass ich bei <pubDate>".$dbRow->date."</pubDate> das Datum als "RFC-822 date-time" formatiert wird_
2. Ich habe ein Problem mit dem Link. Im Link zur News kommt bspw. "&" vor. Und laut XML-Spezifikation ist dies nicht erlaubt. Wie kann ich jetzt noch die News verlinken?
<?php
define("ABSPATH", "http://".$_SERVER['HTTP_HOST'].dirname($_SERVER['PHP_SELF']));
$dbLink = mysql_connect("***", "***", "***") or die(mysql_error());
if( $dbLink ) {
mysql_select_db("***") or die(mysql_error());
}
header("Content-type: text/xml; charset=iso-8859-1");
echo "<?xml version=\"1.0\" encoding=\"iso-8859-1\"?>\n";
?>
<rss version="2.0">
<channel>
<title>TITEL</title>
<link>http://www.test.de</link>
<description>Feed</description>
<language>de-de</language>
<?php
$sqlQuery = "SELECT titel, id, head, date FROM _news ORDER BY id DESC LIMIT 0, 20";
$dbRes = mysql_query($sqlQuery)
or die(mysql_error());
while( $dbRow = mysql_fetch_object($dbRes) ) {
echo "<item>\n";
echo "<title>".$dbRow->titel."</title>\n";
echo "<link>".ABSPATH."</link>\n";
echo "<description><![CDATA[".$dbRow->head."]]></description>\n";
echo "<pubDate>".$dbRow->date."</pubDate>\n";
echo "</item>\n";
}
?>
</channel>
</rss>
1. würde ich direkt in mysql machen...
SELECT DATE_FORMAT(date, %a, %d %b %Y %H:%i:%s GMT) AS datum
(btw. is "date" nicht reserviert? schau besser noch mal nach)!
2. das & habe ich seinerzeit (lange nicht gexmlt ;) ) immer ganz flauschig mit CDATA ausgegeben.... gibt aber vielleicht noch bessere wege
belanglos 08-02-2008, 13:19 Wenn ich daraus
$sqlQuery = "SELECT titel, id, head, date DATE_FORMAT(date, %a, %d %b %Y %H:%i:%s GMT) AS date FROM
dfc_news ORDER BY id DESC LIMIT 0, 20";
mache, bekomme ich die Fehlermeldung:
# You have an error in your SQL syntax; check the
manual that corresponds to your MySQL server version for the right
syntax to use near 'DATE_FORMAT(date, %a, %d %b %Y %H:%i:%s
GMT) AS date FROM dfc_news ORDER BY id D' at line 1
Und wenn ich zwei Abfragen erstelle, wie z.B.:
$sqlQuery = "SELECT titel, id, head, date FROM dfc_news
ORDER BY id DESC LIMIT 0, 20";
$sqlQuery = "SELECT DATE_FORMAT(date, %a, %d %b %Y
%H:%i:%s GMT) AS date";
erhalte ich die Fehlermeldung:
# You have an error in your SQL syntax; check the
manual that corresponds to your MySQL server version for the right
syntax to use near '%a, %d %b %Y %H:%i:%s GMT) AS date' at line
1
Also irgendwie scheint was mit dem Datum nicht zu passen. Nur was?
sorry, kleiner faux pas (oder wie dat heißt) bei mir ;)
hochkommata rein, komma raus:
SELECT DATE_FORMAT(date, '%a %d %b %Y %H:%i:%s GMT') AS datum
und fehler bei dir:
nimm das erste unterstrichene date weg
SELECT date DATE_FORMAT(date, '%a %d %b %Y %H:%i:%s GMT') AS datum
----
belanglos 08-02-2008, 14:51 Fauxpas war schon richtig ;)
Muss ich daraus dann eine Abfrage machen oder in zwei packen? Wenn ich daraus:
$sqlQuery = "SELECT titel, id, head, DATE_FORMAT(date,
'%a %d %b %Y %H:%i:%s GMT') AS datum FROM dfc_news ORDER BY
id DESC LIMIT 0, 20";
mache, bekomme ich immer die Fehlermeldung:
line 15, column 9: pubDate must be an RFC-822 date-time: (6 occurrences) [help]
<pubDate></pubDate>
sollte nu schon richtig sein (wenn ich das rcc-format richtig verstanden habe)
du musst allerdings bedenken, dass in der jetzigen version das formatierte datum in 'datum' steht und nicht mehr in 'date'
also NICHT:
echo "<pubDate>".$dbRow->date."</pubDate>\n";
sondern:
echo "<pubDate>".$dbRow->datum."</pubDate>\n";
;)
belanglos 08-02-2008, 16:11 Hast recht :) Hat geklapppt.
Nur jetzt sehe ich noch ein kleines Problem. In der News selber werden gewisse Sachen mit zum Beispiel BBCode formatiert. Diese werden jetzt auch mit angezeigt. Beispielsweise sieht man im RSS Feed [b] [url] oder ähnliches BBCode typische Zeichen. Habe ich ein Möglichkeit, diese Zeichen noch auszufiltern?
Und ich habe noch eine Frage: Gibt es eine Möglichkeit, alles in eine Datei wie zum Beispiel test.xml auszugeben. Denn ich habe sonst die Befürchtung, dass das zu viele Zugriffe auf die Datenbank sein werden.
jahlives 08-02-2008, 16:23 Beispielsweise sieht man im RSS Feed [b] [url] oder ähnliches BBCode typische Zeichen
Mit RegExp kein Problem
$pattern = '/\[.*\]/isU';
und preg_replace(). Als Ersatzstring gibst du '' (Leerstring) an
Gruss
tobi
tontechniker 08-02-2008, 16:48 Und ich habe noch eine Frage: Gibt es eine Möglichkeit, alles in eine Datei wie zum Beispiel test.xml auszugeben. Denn ich habe sonst die Befürchtung, dass das zu viele Zugriffe auf die Datenbank sein werden.file_put_contents - wieviele Zugriff sollens denn werden?
belanglos 08-02-2008, 16:57 Schon mal einen fetten Dank an euch.
Original geschrieben von jahlives
Mit RegExp kein Problem
$pattern = '/\[.*\]/isU';
und preg_replace(). Als Ersatzstring gibst du '' (Leerstring) an
Gruss
tobi Wie binde ich das denn am besten mit ein? Bin da gerade etwas ratlos wie ich das an welcher Stelle einbinde.
Original geschrieben von tontechniker
file_put_contents - wieviele Zugriff sollens denn werden? An dieser Geschichte bastel ich später. Danke
tontechniker 08-02-2008, 17:36 Wie binde ich das denn am besten mit ein? Bin da gerade etwas ratlos wie ich das an welcher Stelle einbinde.An dieser Stelle:echo "<description><![CDATA[".$dbRow->head."]]></description>\n";
|
-
- |