miércoles, agosto 23, 2006

RSS Feed y Coldfusion

El otro dia tenia que incluir unas noticias RSS en una web.

Parece fácil pero al seguir otros tutoriales en la web me encontré con unos de problemas.

1. Primero tenia que mirar el "character set" del XML que iba a leer y ponerlo en el tag CFHTTP. En este caso use utf-8 pero puede cambiar dependiendo del idioma.

2. Algunos RSS estan malformados y tienes que quitar el primer caracter porque sino te da un error "Document root element is missing". Esto siendo mi caso tenia que añadir la linea
(algunos como RSS Yahoo funcionan perfectamente y sobra esta linea)

3. En otros tutoriales he visto que el codigo para leer el XML es objRSS.channel.item pero en mi caso yo tuvé que añadir XMLRoot. (objRSS.XMLRoot.channel.item)

Al final decidi usar el "schedule" de Coldfusion y llamar este codigo una vez al dia a las 5 de la mañana y copiar este código a un archivo .htm y despues incluir esto en la página. Asi evitar llamadas CFHTTP cada vez que alguien vea la web.

Abajo esta el codigo

<cfset html="">
<cfhttp method="get" url="http://www.menafn.com/rss/menafn_UAE.xml" charset="utf-8"></cfhttp>
<cfset xml= RemoveChars(cfhttp.filecontent,1,1)>
<cfset objrss= xmlParse(xml)>
<cfset numberofnewsitems= arraylen(objRSS.XMLRoot.channel.item)>
<cfloop from="1" to="#NumberOfNewsItems#" index="ind">
<cfset headlinetoadd='<A" href="http://www.noticiasweb.es/#objRSS.XMLRoot.channel.item[ind].link.xmltext#" target="_blank">#objRSS.XMLRoot.channel.item[ind].title.xmltext#</A>'>
<cfset html= HTML & HeadlineToAdd>
</CFLOOP>
<cffile action="WRITE" file="C:\inetpub\wwwroot\miweb.com\rssfeed.htm" output="#HTML#">

viernes, agosto 11, 2006

Unsupported data conversion

Recientemente he añadido una columna extra a una base de datos en SQL.
Al guardar la tabla otras consultas (<cfquery>) que usan la misma table han dejado de funcionar.
El mensaje que me da es "Unsupported data conversion"

Aqui esta la consulta:

<cfquery datasource="#request.maindsn#" name="CheckEmail">
SELECT *
FROM Requests
WHERE email = <cfqueryparam cfsqltype="CF_SQL_VARCHAR" value="#Trim(attributes.email)#">
</cfquery>

La unica manera de arreglarlo es quitar el <cfqueryparam>

<cfquery datasource="#request.maindsn#" name="CheckEmail">
SELECT *
FROM Requests
WHERE email = '#Trim(attributes.email)#'
</cfquery>

Uso CFMX 7, SQL 2000 en un servidor Windows.

Despues de preguntar en las listas de Coldfusion parece que no tiene que ver con la base de datos sino con un error que tiene Coldfusion.
De alguna forma Coldfusion hace sus consultas de una copia "antigua" de la base.

Solución?
1. Resetear CFMX Server
(no siempre posible si tienes alojamiento compartido)
2. Quitar <cfqueryparam>
(puedes esperar un tiempo y volver a poner el <cfqueryparam> cuando Coldfusion haya cogido una nueva conexión a la base)
3. La mejor solucion que he encontrado es de especificar en el SELECT, los campos exactos que necesitas. (SELECT nombre, email FROM emails)
Además hace que escribas codigo más preciso.


Por si sirve de ayuda.