This small snippet will create an RSS feed. I've tested the format using several popular RSS readers and it seems to work fine.
<?php
// Some RSS readers don't like certain characters in the text so this function will replace them with HTML entities
function escape_upper_chars($text) {
// 32-90, 97-122
for ($x = 0; $x < strlen($text); $x++) {
$w = $text{$x};
if ((ord($w) < 32) || ((ord($w) > 90) && (ord($w) < 97)) || (ord($w) > 122)) {
$q .= '&#'.ord($w).';';
} else {
$q .= $w;
}
}
return $q;
}
header("Content-type: text/xml");
// Send the header data
echo "<?xml version=\"1.0\"?><!DOCTYPE rss SYSTEM \"http://my.netscape.com/publish/formats/rss-0.91.dtd\">
<rss version=\"0.91\">
<channel>
<title>RSS Feed</title>
<language>en</language>
<link>http://www.website.com</link>
<description>RSS Feed Description</description>\n";
// Force int data type on $limit to prevent SQL injection attacks
$limit = (int)$_GET['limit'];
if (($limit < 1) || ($limit > 50)) { $limit = 15; } // Set the default number of results
// Query the database (make sure you have included the necessary commands to connect to a MySQL server)
$query = "SELECT id,title,time,author
FROM articles
ORDER BY time DESC
LIMIT $limit";
$s = mysql_query($query);
// Change the variables here according to your query above
while (list($id,$title,$time,$author) = mysql_fetch_row($s)) {
$title = escape_upper_chars($title);
// Customize the data sent to the RSS reader. You should pass text grabbed from the database through escape_upper_chars()
echo "<item>\n"; // Begin a new item
echo "<title><![CDATA[$title]]></title>\n"; // Send the title
echo "<link><![CDATA[http://www.website.com/view.php?id=$id]]></link>\n"; // Send link to the item
echo "<description><![CDATA[Posted by $author on " . date("l dS of F @ h:ia",$time) . "]]></description>\n"; // Send description
echo "</item>\n"; //End the item
}
echo "</channel>\n</rss>"; // Close the RSS channel
?>
I modified this code a little to better learn PHP (I\'m a PHP newbie). Since I currently have each datafeed source in a separate table in my database, I can add a ?x=tablename to pull a feed from that table instead of from the database in general. The description area is modified to work with CSV files from Shareasale, but you could just replace the table names with those from your network.
<?php
// Some RSS readers don\'t like certain characters in the text so this function will replace them with HTML entities
function escape_upper_chars($text) {
// 32-90, 97-122
for ($x = 0; $x < strlen($text); $x++) {
$w = $text{$x};
if ((ord($w) < 32) || ((ord($w) > 90) && (ord($w) < 97)) || (ord($w) > 122)) {
$q .= \'&#\'.ord($w).\';\';
} else {
$q .= $w;
}
}
return $q;
}
$x = mysql_real_escape_string($_GET[x]);
if(!$x) { $x = \'exampletablename\'; }
header(\"Content-type: text/xml\");
// Send the header data
echo \"<?xml version=\\"1.0\\"?><!DOCTYPE rss SYSTEM \\"http://my.netscape.com/publish/formats/rss-0.91.dtd\\">
<rss version=\\"0.91\\">
A little food for thought..
<?php
/ RSS feeds /
if (($fd1 = @fopen(\"rss.xml\", \"w\")) && ($fd2 = fopen(\"rssdd.xml\", \"w\")))
{
$cats = \"\";
$res = mysql_query(\"SELECT id, name FROM categories\");
while ($arr = mysql_fetch_assoc($res))
$cats[$arr[\"id\"]] = $arr[\"name\"];
$s = \"<?xml version=\\"1.0\\" encoding=\\"iso-8859-1\\" ?>\n<rss version=\\"0.91\\">\n\n\" .
\"Torrenfilez\ntorrents\n$DEFAULTBASEURL/\n\";
@fwrite($fd1, $s);
@fwrite($fd2, $s);
$r = mysql_query(\"SELECT id,name,descr,filename,category FROM torrents ORDER BY added DESC LIMIT 15\") or sqlerr(FILE, LINE);
while ($a = mysql_fetch_assoc($r))
{
$cat = $cats[$a[\"category\"]];
$s = \"\n\" . htmlspecialchars($a[\"name\"] . \" ($cat)\") . \"\n\" .
\"\" . htmlspecialchars($a[\"descr\"]) . \"\n\";
@fwrite($fd1, $s);
@fwrite($fd2, $s);
@fwrite($fd1, \"$DEFAULTBASEURL/details.php?id=$a[id]&hit=1\n\n\");
$filename = htmlspecialchars($a[\"filename\"]);
@fwrite($fd2, \"$DEFAULTBASEURL/download/$a[id]/$filename\n\n\");
}
$s = \"\n\n\";
@fwrite($fd1, $s);
@fwrite($fd2, $s);
@fclose($fd1);
@fclose($fd2);
}
?>