Como crear un feed RSS desde MySQL con PHP
Recientemente he tenido que hacer un feed RSS para una página de antigüedades que tenía unos 90-100 artículos en puro HTML.
Así que he optado por utilizar una base de datos.
Mejor de cara a futuras actualizaciones (nuevos artículos) e incluso más practico ahora.
El feed RSS es un sencillo formato de datos que es utilizado para redifundir contenidos a suscriptores de un sitio web. El formato permite distribuir contenido sin necesidad de un navegador, utilizando un software diseñado para leer estos contenidos RSS (agregador). A pesar de eso, es posible utilizar el mismo navegador para ver los contenidos RSS. Las últimas versiones de los principales navegadores permiten leer los RSS sin necesidad de software adicional.
Base de datos
El primer paso será crear la base de datos y añadir los datos. Si nuestra página ya utiliza algún tipo de base de datos para guardar los artículos no será necesario crear otra base de datos ni tampoco hacer cambios.
Básicamente necesitaremos estos campos en la tabla:
• id - no es obligatorio pero siempre me gusta que las tablas estén numeradas
• categoria - categoría o tag del articulo (nos permitirá organizar mejor)
• titulo - título que veremos en el RSS
• resumen - un breve resumen del articulo (si ponemos el texto entero, el usuario no tendrá interés de visitar nuestra página)
• fecha - fecha del articulo para la organización (los más nuevos son los primeros)
• enlace - enlace a la pagina del articulo completo
Esta sería la estructura SQL para facilitar un poco el proceso:
CREATE TABLE `articulos` ( `id` INT(11) NOT NULL AUTO_INCREMENT, `categoria` TEXT NOT NULL, `titulo` TEXT NOT NULL, `resumen` TEXT NOT NULL, `fecha` DATE NOT NULL, `enlace` TEXT NOT NULL, UNIQUE KEY `id` (`id`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
Código PHP
Lo primero será abrir un archivo RSS (.xml / .rss):
$fp = fopen('index.xml', 'w');
El siguiente paso es escribir la cabecera en el archivo index.xml (esta información suele ser estática):
$rand = "\n"; fwrite($fp, '<?xml version="1.0" encoding="UTF-8"?>' .$rand); fwrite($fp, '<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">' .$rand); fwrite($fp, '<channel>' .$rand); fwrite($fp, '<title>Bujorel' .$dirname. '</title>' .$rand); fwrite($fp, '<description>Bj - El blog de un limonero</description>' .$rand); fwrite($fp, '<link>http://www.bujorel.net' .$dirname. '/</link>' .$rand); fwrite($fp, '<language>es-sp</language>' .$rand); fwrite($fp, '<copyright>Copyright ' .date('Y'). ' Bujorel.net</copyright>' .$rand .$rand);
Ahora es el turno de la base de datos (información que se actualiza continuamente).
Realiza la conexión a la base de datos:
$db=mysql_connect('localhost','usuario','contraseña'); mysql_select_db('base_de_datos',$db);
Crea la consulta (query):
$category = substr(dirname($_SERVER['PHP_SELF']), 1); if ($category != '') { $dirname = dirname($_SERVER['PHP_SELF']); } if (! $dirname) { $sql = "SELECT id,categoria,titulo,resumen,fecha,enlace FROM articulos ORDER BY fecha DESC"; } else { $sql = "SELECT * FROM articulos WHERE categoria='$categoria' ORDER BY fecha DESC"; } $result = mysql_query($sql) or die('No se ha podido realizar la consulta.');
Extrae la información:
while ($row = mysql_fetch_array($result)) { $id = $row['id']; $categoria = strip_tags($row['categoria']); $titulo = htmlentities(strip_tags($row['titulo']), ENT_QUOTES); $resumen = htmlentities(strip_tags($row['resumen']), ENT_QUOTES); $fecha = $row['fecha']; $enlace = $row['enlace'];
Y después escribe la información (contenido BBDD) en el archivo index.xml:
fwrite($fp, '<item>' .$rand); fwrite($fp, '<title>' .$titulo. '</title>' .$rand); fwrite($fp, '<description>' .$resumen. '</description>' .$rand); fwrite($fp, '<category>![CDATA[' .$categoria. ']]</category>' .$rand); fwrite($fp, '<link>' .$enlace. '</link>' .$rand); fwrite($fp, '<pubDate>' .date('D, d M Y H:i:s O', strtotime($fecha)). '</pubDate>' .$rand); fwrite($fp, '</item>' .$rand .$rand);}
Finalmente escribe el “pie de página” (footer) del archivo index.xml:
fwrite($fp, '</channel>' .$rand); fwrite($fp, '</rss>');
Cierra el archivo:
fclose($fp);
Y termina mostrando un mensaje:
print ('Creado Feed RSS.');
Resultado final:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 | <?php $fp = fopen('index.xml', 'w'); $rand = "\n"; fwrite($fp, '<?xml version="1.0" encoding="UTF-8"?>' .$rand); fwrite($fp, '<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">' .$rand); fwrite($fp, '<channel>' .$rand); fwrite($fp, '<title>Bujorel' .$dirname. '</title>' .$rand); fwrite($fp, '<description>Bj - El blog de un limonero</description>' .$rand); fwrite($fp, '<link>http://www.bujorel.net' .$dirname. '/</link>' .$rand); fwrite($fp, '<language>es-sp</language>' .$rand); fwrite($fp, '<copyright>Copyright ' .date('Y'). ' Bujorel.net</copyright>' .$rand .$rand); $db=mysql_connect('localhost','usuario','contraseña'); mysql_select_db('base_de_datos',$db); $category = substr(dirname($_SERVER['PHP_SELF']), 1); if ($category != '') { $dirname = dirname($_SERVER['PHP_SELF']); } if (! $dirname) { $sql = "SELECT id,categoria,titulo,resumen,fecha,enlace FROM articulos ORDER BY fecha DESC"; } else { $sql = "SELECT * FROM articulos WHERE categoria='$categoria' ORDER BY fecha DESC"; } $result = mysql_query($sql) or die('No se ha podido realizar la consulta.'); while ($row = mysql_fetch_array($result)) { $id = $row['id']; $categoria = strip_tags($row['categoria']); $titulo = htmlentities(strip_tags($row['titulo']), ENT_QUOTES); $resumen = htmlentities(strip_tags($row['resumen']), ENT_QUOTES); $fecha = $row['fecha']; $enlace = $row['enlace']; fwrite($fp, '<item>' .$rand); fwrite($fp, '<title>' .$titulo. '</title>' .$rand); fwrite($fp, '<description>' .$resumen. '</description>' .$rand); fwrite($fp, '<category>![CDATA[' .$categoria. ']]</category>' .$rand); fwrite($fp, '<link>' .$enlace. '</link>' .$rand); fwrite($fp, '<pubDate>' .date('D, d M Y H:i:s O', strtotime($fecha)). '</pubDate>' .$rand); fwrite($fp, '</item>' .$rand .$rand);} fwrite($fp, '</channel>' .$rand); fwrite($fp, '</rss>'); fclose($fp); print ('Creado Feed RSS.'); ?> |
Ahora para utilizar esto si tenemos una página que no actualizamos muy a menudo o tenemos que actualizar la base de datos de forma manual podemos simplemente abrir el archivo php creado cuando hace falta actualizar el feed.
Pero si tenemos una página que escribe en la base de datos directamente y la actualizamos más a menudo podemos poner este código HTML:
<a href="index.xml" title="XML" onmouseover="parent.location='index-xml.php';"> <img src="images/icon-xml.gif" class="icon-xml" alt="XML"/> </a>
Cada vez que pasemos el ratón por encima del enlace se ejecutara el archivo
index-xml.php (nuestro archivo) que actualizara el feed RSS.
Comentarios
8 respuestas para “Como crear un feed RSS desde MySQL con PHP”
Deja una respuesta





Error de lectura XML: mal formado
Ubicación: http://www.gpsonline.com.mx/index.xml
Número de línea 7, columna 14:fwrite($fp, ” .$rand);
————-^
Me muestra ese error ya verifique y todas las demas lineas estan escritas de igual manera ..
Ponle al archivo la extensión PHP.
Parse error: syntax error, unexpected T_STRING in /usr/local/psa/home/vhosts/gpsonline.com.mx/httpdocs/ feed/index.php on line 38
y en esa linea tengo, esta sintaxis:
fwrite($fp, ” .$rand);
supongo que en las demas por ende me marcara errores parecidos.
falta entre los conos, el, item ‘ ‘
El código tal y como está, funciona perfectamente.
falta el (;) en la linea 35
@manuel gracias, editado.
Hola estoy intentando hacer lo que comentas en el articulo, pero no hay manera qde conectar con la base de datos … mi principal problema es que no soy programador y no entiendo muy bien los procesos.
Tengo dudas en:
mysql_select_db(’base_de_datos’,$db);
(tengo que poner el nombre de la base de datos, digamos, mysql_select_db(’descubre’,$db);)
$sql = “SELECT id,categoria,titulo,resumen,fecha,enlace FROM articulos ORDER BY fecha DESC”;
(tengo que cambiar los campos de id,categoria,etc por los campos que tengo en la tabla que quiero mostrar)
esta duda me viene por que tu has creado esta tabla:
CREATE TABLE `articulos` (
`id` INT(11) NOT NULL AUTO_INCREMENT,
`categoria` TEXT NOT NULL,
`titulo` TEXT NOT NULL,
`resumen` TEXT NOT NULL,
`fecha` DATE NOT NULL,
`enlace` TEXT NOT NULL,
UNIQUE KEY `id` (`id`)
) ENGINE=MyISAM DEFAULT CHARSET=utf8 AUTO_INCREMENT=1 ;
pero yo tengo otras estructuras entonces me lio bastante… si me pudieras ayudar te lo agradecería mucho …
Fran
por cierto esta es la dirección del archivo:
http://www.descubrerural.com/index-xml.php