Newsfeed
Aus php bar
Inhaltsverzeichnis |
Datenbank
Die Tabelle für die Newseinträge sollte in etwa so aufgebaut sein.
+------------+------------------+------+-----+---------------------+----------------+ | Field | Type | Null | Key | Default | Extra | +------------+------------------+------+-----+---------------------+----------------+ | id | int(10) unsigned | | PRI | NULL | auto_increment | | title | varchar(255) | | | | | | message | text | | | | | | created | datetime | | | 0000-00-00 00:00:00 | | +------------+------------------+------+-----+---------------------+----------------+
PHP Script
Als erstes muss eine Verbindung zum Datenbank Server hergestellt werden und die entsprechende Datenbank ausgewählt werden. Hier müssen bei mysql_connect() und mysql_select_db() noch die passenden Daten eingetragen werden.
Im Query werden title, message und der link zum Newspost abgefragt. Da nur die letzten 25 Einträge ausgegeben werden, wird die Abfrage mit LIMIT beschränkt.
In der WHILE Schleife werden erst alle Ergebnisse der Abfrage im $item Array gespeichert und dieses dann als Unterarray in $items.
1 mysql_connect(); 2 mysql_select_db(); 3 4 /* Query um die letzten 25 Newseinträge auszulesen */ 5 6 $result = mysql_query(' 7 SELECT 8 `news`.`title`, 9 `news`.`message`, 10 `news`.`link` 11 FROM 12 `news` 13 ORDER BY 14 `news`.`id` DESC 15 LIMIT 0, 25 16 '); 17 18 /* Schleife um alle Einträge in einem Array zu speichern */ 19 20 while($item = mysql_fetch_assoc($result)) { 21 $items[] = $item; 22 }
Jetzt wird der erste Teil der Newsfeed Datei ausgegeben. Als erstes werden ein paar Daten für den Newsfeed im $feed Array gespeichert. title ist die Überschrift des Newsfeeds, link ist ein Link zur Homepage zu der der Newsfeed gehört und description eine kurze Beschreibung, um welches Thema es im Newsfeed geht.
Zur übersichtlicheren Ausgabe wird [printf] verwendet. Diese Funktion benutzt Platzhalter, die später durch die Variablen ersetzt werden, die ab dem zweiten Parameter angegeben sind.
1 /* Newsfeed Informationen */ 2 3 $feed['title'] = 'Mein Newsfeed'; 4 $feed['link'] = 'http://www.example.com'; 5 $feed['description'] = 'Eine Beschreibung über den Inhalt'; 6 7 /* Ausgabe der Newsfeed Daten */ 8 9 printf(' 10 11 <?xml version="1.0" encoding="ISO-8859-1"?> 12 <rdf:RDF 13 xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 14 xmlns="http://my.netscape.com/rdf/simple/0.9/"> 15 16 <channel> 17 <title>%s</title> 18 <link>%s</link> 19 <description>%s</description> 20 </channel>', 21 22 htmlspecialchars($feed['title']), 23 htmlspecialchars($feed['link']), 24 htmlspecialchars($feed['description']) 25 26 );
Jetzt wird eine [foreach] Schleife benutzt, um die einzelnen Newseinträge mit [printf] wieder auszugeben. Vor der Ausgabe wird auf jede Variable noch [htmlspecialchars] angewendet, um Zeichen die von XML benutzt werden in entsprechende Entities zu konvertieren.
1 foreach($items as $item) { 2 printf(' 3 4 <item> 5 <title>%s</title> 6 <description>%s</description> 7 <link>%s</link> 8 </item>', 9 10 htmlspecialchars($item['title']), 11 htmlspecialchars($item['message']), 12 htmlspecialchars($item['link']) 13 14 ); 15 }
fertig :)
Komplettes Script
1 /* Datenbankverbindung herstellen */ 2 3 mysql_connect(); 4 mysql_select_db(); 5 6 /* Query um die letzten 25 Newseinträge auszulesen */ 7 8 $result = mysql_query(' 9 SELECT 10 `news`.`title`, 11 `news`.`message`, 12 `news`.`link` 13 FROM 14 `news` 15 ORDER BY 16 `news`.`id` DESC 17 LIMIT 0, 25 18 '); 19 20 /* Schleife um alle Einträge in einem Array zu speichern */ 21 22 while($item = mysql_fetch_assoc($result)) { 23 $items[] = $item; 24 } 25 26 /* Newsfeed Informationen */ 27 28 $feed['title'] = 'Mein Newsfeed'; 29 $feed['link'] = 'http://www.example.com'; 30 $feed['description'] = 'Eine Beschreibung über den Inhalt'; 31 32 /* Ausgabe der Newsfeed Daten */ 33 34 printf(' 35 36 <?xml version="1.0" encoding="ISO-8859-1"?> 37 <rdf:RDF 38 xmlns:rdf="http://www.w3.org/1999/02/22-rdf-syntax-ns#" 39 xmlns="http://my.netscape.com/rdf/simple/0.9/"> 40 41 <channel> 42 <title>%s</title> 43 <link>%s</link> 44 <description>%s</description> 45 </channel>', 46 47 htmlspecialchars($feed['title']), 48 htmlspecialchars($feed['link']), 49 htmlspecialchars($feed['description']) 50 51 ); 52 53 /* Schleife um alle Newseinträge aus dem Array auszugeben */ 54 55 foreach($items as $item) { 56 printf(' 57 58 <item> 59 <title>%s</title> 60 <description>%s</description> 61 <link>%s</link> 62 </item>', 63 64 htmlspecialchars($item['title']), 65 htmlspecialchars($item['message']), 66 htmlspecialchars($item['link']) 67 68 ); 69 } 70 71 print('</rdf:RDF>');
Tipps
Einen Validator für den frisch erstellen News Feed findet man unter feedvalidator.org.
Dann sollte das Skript auch einen entsprechenden Content-Type mitschicken.
header ('Content-Type: application/xml');
Im HTML kann man den News Feed wie folgt im head-Bereich einbinden:
<link rel="alternate" type="application/rss+xml" title="My News Feed" href="http://www.example.org/newsfeed.xml"/>
Per mod rewrite kann man dem Server mitteilen wie er die Anforderung von /newsfeed.xml beantworten soll, z.B. so:
RewriteEngine on RewriteBase / RewriteRule ^newsfeed.xml some/ugly/path/we/want/to/hide/newsfeed.php [QSA,L]

