Jorge Vallejo Blog

Blog del creativo, ilustrador y profesor de videojuegos Jorge Vallejo

php

Como hacer un feed rss con php

Quiza alguna vez hayais visto este logo en pequeño al lado de la dirección del navegador en firefox o en como un botoncito en el explorer,os remito a la wikipedia para la
definición, es basicamente un archivo con estructura xml, de hecho puede ser un xml, que sirve para dar un resumen de las noticias y estar suscrito al mismo, de forma que no tengamos que entrar siempre en las paginas para saber si hay alguna novedad sino simplemente ver , en mi caso con la pagina personalizada de google y el google reader, las nuevas noticias rapidamente, despues si nos interesa alguna pinchamos en el enlace que nos llevara a la pagina de la noticia.
RECETA DE RSS CON PHP y MYSQL
Una vez que sabemos un poco mas sobre rss, empezaremos a hacernos nuestro primer rss con php y base de datos mysql,
1º) Deberemos tener una base de datos mysql con una tabla noticia, los campos que no pueden faltar seran titulo, enlace o id, texto.
2º)
Vemos como es la estructura del .rss


<?xml version="1.0" encoding="ISO-8859-1" ?>
<rss version="2.0">
<channel>
<title>Mi titulo de pagina</title>
<link>http://www.mipagina/noticias.rss</link> <description>Todas las noticias en formato RSS desde mipagina </description>
<item>
<title>Titulo de 1º Noticia</title>
<link>Enlace a 1 noticia/link>
<description>
  descripcion de 1 Noticia</description>
</item>
<item>
<title>Titulo de 2º Noticia</title>
<link>Enlace a 2 noticia/link>
<description>
  descripcion de 2 Noticia</description>
</item>
......
</channel>
</rss>

Como vemos la estructura de etiquetas tiene un encabezado <?xml version=”1.0″ encoding=”ISO-8859-1″ ?>
el cuerpo <rss version=”2.0″></rss>
y dentro de este el canal <channel></channel>
Despues viene una descripcion de todo este canal, donde normalmente pondremos de que va a tratar, por ejemplo noticias de mi sitio, eventos para el grupo etc.
A continuación vienen las etiquetas item, que como vemos son las que contendran las noticias, y que costan de 3 elementos titulo,enlace y descripcion.
3) Vamos a generar nuestro rss,


<?php
include("bd/configuracion.php");
$fp = fopen ("noticias.rss", "w+");
fwrite($fp,'<?xml version="1.0" encoding="ISO-8859-1" ?>');
fwrite($fp,"\n");
fwrite($fp,'<rss version="2.0">');
fwrite($fp,"\n");
fwrite($fp,'<channel>');
fwrite($fp,"\n");
fwrite($fp,'<title>Mis noticias </title>');
fwrite($fp,"\n");
fwrite($fp,' <link>enlace</link>');
fwrite($fp,' <description>Todas las noticias en formato RSS </description>');
fwrite($fp,"\n");
$noticias=mysql_query("SELECT * FROM noticias ORDER BY fecha DESC LIMIT 3", $link);

while($row=mysql_fetch_array($noticias)){
fwrite($fp,"<item>");
fwrite($fp,"\n");
fwrite($fp,"<title>");
$cadena=$row['titulo'];
fwrite($fp,substr(strip_tags($row["titulo"]),0,100));
fwrite($fp,"</title>");
fwrite($fp,"\n");
fwrite($fp,"<link>");
fwrite($fp,"http://www.misitio.com/noticias.php?id=".$row['id']);
fwrite($fp,"</link>");
fwrite($fp,"\n");
fwrite($fp,"<description>");
fwrite($fp,substr(strip_tags($cadena),0,450)."..");
fwrite($fp,"</description>");
fwrite($fp,"\n");
fwrite($fp,"</item>");
fwrite($fp,"\n");

}
fwrite($fp,"\n");
fwrite($fp,'</channel>');
fwrite($fp,"\n");
fwrite($fp,'</rss>');

fclose($fp);
?>

NOTAS ACLARATORIAS
Lo primero es conectarnos a nuestra base de datos, yo normalmente lo hago con un archivo aparte al que llamo mediante include.
El codigo php genera un archivo con la extension .rss, deberiamos hacer otro con la extension .xml para que el explorer lo interprete bien, hacemos un bucle while para sacar las 3 ultimas noticias, aun que podriamos aunmentar el numero, sin embargo no conviene crear archivos demasiado grandes, ademas lo importante es mostrar las ultimas noticias.Descatamos substr(strip_tags($cadena),0,450).”..”) , esta linea, quita las etiquetas html para q no se produzcan errores y coge solo 450 caracteres, se podrian coger hasta 500, que es el maximo que permite el description.
4º) Ya solo nos queda poner en el HEAD de la pagina principal o donde queremos q aparezca nuestro rss.

<link rel="alternate" type="application/rss+xml" title="Myas.info - RSS" href="http://www.misitio.com/noticias.rss" />

<link rel="alternate" type="application/rss+xml" title="Myas.info - RSS" href="http://www.misitio.com/noticias.xml" />

Recordad que este codigo genera todas las etiquetas, sobreescribiendo el archivo (w+).

De repente casca php Cuidadin variables globales


Cuando uno se crece y empieza a pensar que controla algo de programación , de repente todo empieza a cascar y hacer aguas. ¿Por que demonios me falla esta consulta mysql?¿Por que no me sale esta varible php? La repuesta es por que hasta ahora no sabia que hay register_globals podéis comprobar si vuestro servidor las tiene activadas o no con &lt?php phpinfo();?>, si las tiene desactivadas como era mi caso ,entonces al pasar variables por referencia,(enviandolas por la url caso mipagina.php?mivarible=mivalor)se necesita poner $_GET['nombrevariable'], en el caso de un formulario <input type=”text” name=”mivariable” … hace falta $_POST['nombrevariable'], en vez de como hacía yo simplemente poner $nombrevariable.
Si vais a enviar un archivo en vez de poner el socorrido $userfile, deberíais poner $userfile=$HTTP_POST_FILES['userfile']['tmp_name'];
Un último consejo final, segun parece en mas seguro utilizar los metodos $_POST y $_GET, y por otro lado estos funcionan tanto si register_globals esta activado como si no, por lo que es aconsejable utilizarlo siempre, una lección que he aprendido muy bien, tras perder varias horas en resolver el problema.

Problema redimensionar imagenes con php


Voy a hablaros de un problema que a la hora de redimensionar imagenes en php, hay unas funciones muy bonitas que rulan por internet sobre el tema, pero pocos te comentan un pequeño detalle sin el cual puedes pasarte varias horas revisando codigo, y diciendote ¿Pero que demonios esta mal? .Y es que lo primero que deberias hacer es una pagina php con el codigo php.info(); para ver las librerias que tienes instaladas y comprobar que php_gd.dll esta metida , que como lo sabes, por q al ver el php.info() tiene queaparecerte algo como esto:
GD

GD Support enabled
GD Version bundled (2.0.34 compatible)
FreeType Support enabled
FreeType Linkage with freetype
FreeType Version 2.1.10
GIF Read Support enabled
GIF Create Support enabled
JPG Support enabled
PNG Support enabled
WBMP Support enabled
XPM Support enabled
XBM Support enabled

Subir archivos php problemas


Me ha surgido un problemilla que he tardado en resolver, estaba yo tratando de subir un archivo desde un formulario, compruebo que todo es correcto, q el form tiene enctype=”multipart/form-data” ok, que el input es de tipo file, y ademas le pongo un nombre original para acordarme, <input type=”file” size=”20″ class=”cajas” name=”userfile”> y cuando hago el submit del formulario, lo envio a una pagina php donde almaceno en una base de datos los datos del archivo, antes de guardarlo, y en esto q me sale la consulta todo vacia “INSERT INTO documentos (url,tipo,tamano,icono,nombre,fecha) VALUES (‘../archivos/’,”,’0.00KB’,’../graficos/ico_archivos/.png’,”,’2007/05/30′”, asi que compruebo q hay permisos de ejecucion , que tengo creada la carpeta archivos, otra tmp (por si acaso), y nada.. que me sigue dando como que no pilla $HTTP_POST_FILES['userfile']['name']; (el nombre de la variable enviada) y efectivamente, no se por q es, pero si en vez de usar $HTTP_POST_FILES poneis,$_FILES['userfile']['name']; Si que me lo coge y fin del tema, ya subo y guardo. Lo investigare mas a fondo, pero de momento os dejo un enlace que explica mejor que yo los pasos a seguir
Sube archivos.

Php problemas acentos y eñes


Algunas veces puede pasarte que al extraer el texto de una base de datos y escribirla en php , de repente los acentos y eñes, no te salgan bien en la pagina, a mi me paso utilizando la tecnologia AJAX al volcar con javascript, pos bien la solucion es simplemnte usar la funcion php <?php utf8_encode($row['titulo'])?> que codifica la cadena, y hace que salga con acentos y ñs.
Tambien me gustaría hacer una defensa de la ñ , que me parece no solo una letra q deberiamos de defender ya que es genuinamente española, sino que me es una letra que queda muy bien en diseño, y sino mirar la cantidad de carteles que al anunciar eventos españoles la han utilizado.

Problemas con Order By Rand() mysql


El otro día vi con horror como en una pagina web que llevo, se mostraba un error mysql en una de las paginas php ademas de que tardaba mucho en cargar.
Despuedes de darle algunas vueltas al codigo , llegue a la conclusion de lo que estaba ocurriendo era que la consulta duraba demasiado y por eso devolvia el error, ¿pero donde estaba el fallo? pues en SELCT * FROM imagenes ORDER BY Rand() LIMIT 1 , esta consulta que yo usaba para generar una imagen aleatoria cada vez que se recarga la pagina tarda demasiado y casca, parece ser al hacer esa consulta obligamos a php a generar un numero aleatorio distinto para cada fila de la tabla, y aun que en mi caso tampoco eran tantos (150 registros), supongo q son suficientes si coincide que entran varias personas a la vez y petan el servidor.
Sin embargo la solucion es bien sencilla, simplemente hay que generar un unico numero aleatorio, como ya se que mi tabla tiene 150 registros , genero un numero entre 1 y 150 simplemente con rand(1,150), esto lo almaceno en $aleat y se lo paso a la query.
SELECT * FROM imagenes WHERE id=$aleat, y pista. Va bien rapido.