Crear RSS con PHP a partir de tabla MySQL

  • Por
Script PHP para generar un archivo RSS con los registros extraídos de una tabla en base de datos MySQL.
En este artículo vamos a aprender a crear un RSS con PHP y con los datos que vienen de una base de datos MySQL. Es una tarea que resultará bastante interesante para todas las personas que creen su propio sitio con PHP y quieran dar esta opción de suscripción a los contenidos por un feed RSS.

Para las personas que no conozcan RSS y sus aplicaciones recomendamos la lectura del Manual de RSS que hemos publicado en DesarrolloWeb.com. Además, también queremos señalar que existe otro artículo publicado anteriormente en este sitio que también explica cómo generar un RSS desde PHP. El artículo anterior no estaba mal y la idea funciona, pero deja en el aire la posibilidad de hacer un recorrido a una base de datos para generar los registros para el RSS. En cambio, genera una sola entrada en el RSS y además saca los datos de la misma de una manera un tanto "misteriosa".

Para cubrir un poco mejor este asunto, pues la creación de un RSS desde PHP es algo bastante consultado y que merecía la pena ver en nuevos ejemplos más completos, vamos a publicar un script completo que extrae los datos de una tabla MySQL para crear el RSS con varias entradas, que se van generando por medio de un bucle al recorrer la consulta a la base de datos.

Tabla MySQL desde donde vamos a sacar los RSS

Para crear el RSS extraeremos las distintas entradas de una tabla, en una base de datos MySQL. Este sería el create table de la tabla que vamos a utilizar en el código del ejemplo.

CREATE TABLE IF NOT EXISTS `post` (
`id_post` int(11) NOT NULL AUTO_INCREMENT,
`titulo` varchar(100) NOT NULL,
`descripcion` varchar(200) DEFAULT NULL,
`enlace` varchar(120) NOT NULL DEFAULT '',
`tiempo` varchar(15) NOT NULL,
PRIMARY KEY (`id_post`)
);

Además, para que las personas puedan probar este ejercicio de manera más sencilla, aquí hay un enlace a un txt con las sentencias SQL para generar no sólo la estructura de la tabla, sino también los INSERT para dar de alta varios registros. Con esto conseguiremos que la tabla no esté vacía y así el RSS que generemos tenga algunos registros.

Puedes acceder al txt con las SQL para generar la tabla MySQL y los registros de prueba.

Script PHP para generar el RSS

Ahora que ya tenemos una tabla MySQL desde donde extraer los contenidos para nuestro RSS, vamos a ver lo que realmente nos importa en este artículo, que sería la creación del archivo XML para hacer el feed RSS.

Este código lo podemos ver a continuación, con diversos comentarios para que se pueda entender con mayor facilidad.

<?php

// Elimina caracteres extraños que me pueden molestar en las cadenas que meto en los item de los RSS
function clrAll($str) {
   $str=str_replace("&","&",$str);
   $str=str_replace(""",""",$str);
   $str=str_replace("'","'",$str);
   $str=str_replace(">",">",$str);
   $str=str_replace("<","<",$str);
   return $str;
}

//creo cabeceras desde PHP para decir que devuelvo un XML
header("Content-type: text/xml");

//comienzo a escribir el código del RSS
echo "<?xml version="1.0""." encoding="ISO-8859-1"?>";

//conecto con la base de datos
$Servidor = "localhost";
$usuario = "root";
$clave = "";
$bbdd = "aplicacionarticulos";
$connectid = mysql_connect($Servidor, $usuario, $clave);
mysql_select_db($bbdd);

//sentencia SQL para acceder a los últimos 20 artículos publicados
$ssql = "select * from post order by tiempo desc limit 10";
$result = mysql_query($ssql);

//Cabeceras del RSS
echo '<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:itunes="http://www.itunes.com/dtds/podcast-1.0.dtd">';
//Datos generales del Canal. Edítalos conforme a tus necesidades
echo "<channel>\n";
echo "<title>Novedades de Desarrolloweb.com</title>";
echo "<link>http://www.desarrolloweb.com</link>";
echo "<description>Ejemplo sobre cómo hacer un RSS desde PHP y trayendo los datos desde MySQL.</description>";
echo "<language>es-es</language>";
echo "<copyright>DesarrolloWeb.com</copyright>\n";

//para cada registro encontrado en la base de datos
//tengo que crear la entrada RSS en un item
while ($registro = mysql_fetch_array($result))
{
   //elimino caracteres extraños en campos susceptibles de tenerlos
   $titulo=clrAll($registro["titulo"]);         
   $desc=clrAll($registro["descripcion"]);

   echo "<item>\n";
   echo "<title>$titulo</title>\n";
   echo "<description>$desc</description>\n";
   echo "<link>" . $registro["enlace"] . "</link>\n";
   echo "<pubDate>". date ( "r" , $registro['tiempo'] )."</pubDate>\n";
   echo "</item>\n";
}

//cierro las etiquetas del XML
echo "</channel>";
echo "</rss>";

?>

Nota: He subido los códigos fuente de este ejemplo al repositorio de código de Github. Están disponibles al público en http://github.com/desarrollowebcom/Creaci-n-de-RSS-con-PHP-a-partir-de-una-tabla-MySQL/downloads

El ejemplo está probado y funciona correctamente, pero si lo editas, ten mucho cuidado de que el formato del XML no se altere, pues en XML cualquier problemilla de sintaxis deriva en un mal reconocimiento del archivo y el RSS no se verá. Por ejemplo, una etiqueta sin cerrar hará que el RSS de un problema y no se vean las novedades. Si finalmente sigues experimentando problemas, accede a la URL comentada en la nota anterior para hacer la descarga del código, que así no debería haber problemas con la transcripción de texto en el artículo.

El RSS que hemos visto aquí no muestra más que las descripciones de los artículos del sitio, si queremos además el contenido completo del artículo tendríamos que hacer alguna modificación e indicarlo todo en una etiqueta <content:encoded> dentro de <item>. Pero esto lo veremos en un artículo más adelante.

Autor

Miguel Angel Alvarez

Miguel es fundador de DesarrolloWeb.com y la plataforma de formación online EscuelaIT. Comenzó en el mundo del desarrollo web en el año 1997, transformando su hobby en su trabajo.

Compartir

Comentarios

fernando

05/5/2010
rss con php
muy bueno el script, funciona bien, pero tengo una duda sobre esto:

echo "<item>n";

¿esas n finales son saltos de carro o línea como ?

bocho0610

19/5/2010
genial
se ve bueno, es lo que estaba buscando. a penas termine de actualizar lo probare.

sabrina1887

19/5/2010
PHP
ESTA MUY BUENO EL MANUAL ...GRACIAS

kyke_mx

19/5/2010
No funciona
en la linea 6. $str=str_replace(""",""",$str); marca el siguiente error "Parse error: syntax error, unexpected T_CONSTANT_ENCAPSED_STRING ", ¿Alguien sabe como resolverlo?

midesweb

19/5/2010
Los n en las cadenas son saltos de línea
Hola!

LA pregunta sobre los "n" en las cadenas de caracteres es justamente por lo que apuntas, en realidad son saltos de línea... deberían aparecer como " ", pero por un error en la transcripción del script se perdieron las contrabarras.

Lo hemos reparado!

De todos modos, también he colocado en el artículo una nota para acceder a los códigos del ejemplo en Github. Por lo que no debería haber problemas con la descarga de los códigos correctos.

Arturin

19/7/2010
Porque no hay respuestas?
Hola... ustedes perdonen.. pero he visto en varios sitios de desarroloweb... que muchos tenemos dudas y preguntas.. .y he visto con suma tristeza, de que no hay respuestas... es estoy normal?.... o existe algun foro para hacer preguntas... gracias

CHARLIE

12/8/2010
UNA DUDA CON ESTA LINEA
HOLA MUCHISIMAS GRACIAS EL CODIGO FUNCIONA PERFECTO SOLO QUE TENGO ESTA INQUIETUD

echo "<link>" . $registro["enlace"] . "</link> ";

EN ESA LINEA SE ESTA LLAMANDO A LA CASILLA "enlace" EN LA BASE DE DATOS

Y NO TENGO LAS URLS EN LA BASE DE DATOS... QUICIERA QUE SE LLAMARA POR EL NUMERO DE ID... PERO CUANDO LO CAMBIO ASI:

echo "<link>" . $registro["id"] . "</link> ";

NO ME DA EL LINK

AYUDA...

DE ANTE MANO MUCHAS GRACIAS

Jose

20/8/2010
No se actualiza el lector de rss
Hola, he probado el script y funciona correctamente, pero cuando creo una nueva noticia en la base de datos no se ve en el lector de rss, es decir, no se actualiza, aunque si voy al php si veo la nueva noticia generada.

¿Cómo puedo hacer para que se actualicen las noticias en el lector de rss?
Muchas gracias

Isaac

21/8/2010
Una duda con el código
Una pregunta, en la parte de la fecha de publicación la escriben con date ( "r" , $registro['tiempo'] ), aquí la "r" es para transformar el registro "tiempo" en el formato de fecha para rss, ahora mi pregunta es en qué formato de fecha deben estar guardados los registros "tiempo" para que sean reconocidos?pues esa es la única parte que no comprendo, y si cambio directamente el formato de fecha directamente en los registros entonces no me detecta los 10 más nuevos. ¡Ayuda!;)

maxi

22/10/2010
Muy util
muchisimas gracias me re sirvio, unos pequeños cambios y ya lo tengo en funcionamiento! saludos

negociosdehoy

22/4/2011
esto me sirve para hacer un feed rss para un componente de joomla
quiero hacer un feed rss de un componente de joomla, porque los modulos y componentes que hay para hacer esto no son compatibles con este componente. quiero saber si este manual me sirve para hacer lo que quiero. Gracias

delice

01/10/2011
error de sintaxis
Hola,
uso el codigo tal y como lo descargo pero cuando lo subo al servidor me aparece este error:

Parse error: syntax error, unexpected '.', expecting '{' in /var/www/vhosts/gporiental.com/httpdocs/arteurbano/rss-articulos.php on line 2

alguien que me pueda ayudar? gracias

Esteban Emilio

23/11/2011
Felicitaciones!
Excele articulo me ha servido muchísimo, tendrás algun ejemplo de como hacerlo mismo pero con consultas SQL de SQL Server 2008?

cesar

07/11/2012
duda con los echo
Soy nuevo en estoy y bueno me surge una duda, porque pones las etiquetas de <item> y el resto, dentro de un echo?¿

No me funciona, vamos que no me genera los item

while ($registro = mysql_fetch_array($result))
{
//elimino caracteres extraños en campos susceptibles de tenerlos
$titulo=clrAll($registro["titulo"]);
$desc=clrAll($registro["entradilla"]);

echo "<item> ";
echo "<title>$titulo</title> ";
echo "<description>$desc</description> ";
echo "<link>" . "www.3010tech.com". "</link> ";
echo "<pubDate>". date ( "r" , $registro['fecha'] )."</pubDate> ";
echo "</item> ";
}


lo he modificado con mis datos de mi bbdd.

un saludo

Francisco Figueroa

30/8/2013
Corrección a fecha
Estimados: El script me sirvió mucho, pero sólo le hice una pequeña modificación:<br />
<br />
En vez de usar la siguiente linea:<br />
<br />
echo &quot;&lt;pubDate&gt;&quot;. date ( &quot;r&quot; , $registro[&#039;tiempo&#039;] ).&quot;&lt;/pubDate&gt;
&quot;;<br />
<br />
que me daba un 0 en la fecha Unix (31 de Diciembre de 1969), usé la siguiente variable, con muy buenos resultados:<br />
<br />
echo &quot;&lt;pubDate&gt;&quot;. gmdate(DATE_RSS, strtotime($registro[&#039;new_time&#039;])).&quot;&lt;/pubDate&gt;
&quot;;<br />
<br />
Así, el campo Datetime en la base de datos mysql es correctamente interpretado.<br />
<br />
Espero que haya sido útil!

NiciusB

01/9/2013
Errores
En la función clrAll deberías haber puesto:

function clrAll($str) {
return htmlspecialchars($str, ENT_QUOTES | ENT_XML1, 'ISO-8859-1');;
}

También hay un error de comillas al poner el inicio de xml... obviamente lo he arreglado fácilmente, pero a un novato igual le pierde:

//comienzo a escribir el código del RSS
echo "<?xml version='1.0' encoding='ISO-8859-1'?>";

Nestor

24/2/2014
Pequeña duda
Que tal !!, bueno, en primer lugar, pocas veces he visto un blog tan didactico como este donde la claridad meridiana es poco habitual en el mundo de la informatica.
Solo se me presentó una duda, y esta solo emerge de mi total desconocimiento, ¿como hacer o como hará el usuario para incribirse ? hay que implementar otro codigo o con esto ya es mas que suficiente.?Agradecido desde ya por vuestra gentileza y feliciitandolos por tan valorable aporte.
Saludos !
Néstor Torre

Néstor

27/2/2014
un simple y humilde aporte
Cuidado con las comas en lugar de puntos en las sintaxis, maxime aun, la que hace referencia a la fecha.

Eduardo

28/2/2014
Una consulta
Como hipervincular las url puestas como ej aca para el insert de la base de datos para que aparezcan en la pagina con su hipervicunlo hacia la pagina dirigida?

ZonaLeRoS

16/1/2015
Wow, muchas gracias, me sirvio
amigo era exactamente lo que necesitaba, muchas gracias, saludos.

Jose Alvarado

17/1/2015
¿Que sería mejor para Google?
Tengo esta duda. ¿Que sería mejor para Google: un sitemap actualizable con la URL de los posts o enviarle un Sitemap (aunque sería solo mi pagina principal) y además, enviarle el archivo rss ya que google también lo acepta?

Lo otro es, ¿se puede colocar la etiquieta priority en RSS?