Newsfeed

Aus php bar

Wechseln zu: Navigation, Suche

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.

 mysql_connect();
 mysql_select_db();
 
 /* Query um die letzten 25 Newseinträge auszulesen */
 
 $result = mysql_query('
     SELECT
         `news`.`title`,
         `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.

 /* Newsfeed Informationen */
 
 $feed['title']       = 'Mein Newsfeed';
 $feed['link']        = 'http://www.example.com';
 $feed['description'] = 'Eine Beschreibung über den Inhalt'; 
 
 /* Ausgabe der Newsfeed Daten */
 
 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.

 foreach($items as $item) {
     printf('
 
     <item>
         <title>%s</title>
         <description>%s</description>
         <link>%s</link>
     </item>',
 
10     htmlspecialchars($item['title']),
11     htmlspecialchars($item['message']),
12     htmlspecialchars($item['link'])
13 
14     );
15 }


fertig :)

Komplettes Script

 /* Datenbankverbindung herstellen */
 
 mysql_connect();
 mysql_select_db();
 
 /* Query um die letzten 25 Newseinträge auszulesen */
 
 $result = mysql_query('
     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]

Persönliche Werkzeuge