miércoles, 29 de julio de 2009

Clase para crear un RSS Feed en PHP

En esta ocasión les quiero compartir una sencilla clase para poder realizar un RSS desde PHP. Con ella, simplemente es necesario traer una consulta con los campos llamados: "Title", "Link", "Description" y "PubDate", ajustables a cualquier consulta, media la clausa "AS". Ejemplo, si el campo de tu table se llama "nombre_articulo", lo seleccionas como " AS Title".

Posteriormente se crea una instancia de la clase, y se manda llamar la función principal. Mediante la instrucción "echo" se imprime el resultado, que esta en formato xml, esuqematizado para RSS versión 2.0.

Ahora veamos el código de la clase:


Codigo PHP
<?php
/**

* PHP Feeder, clase para contruir un feeder a partir de una consulta
* a una base de datos.
*/

Class Feeder
{

Function Feed($title, $link, $description, $result)
{
$feedstr = "";

$feedstr .= '<?xml version="1.0" encoding="UTF-8"?>';
$feedstr .= $this->RssTag($this->ChannelTag($this->TitleTag($title) .
$this->LinkTag($link) .
$this->DescriptionTag($description) . $this->FeedItems($result)));

return $feedstr;
}


function FeedItems($result)
{
$feefitems = "";

if( $result )
{
while($row = mysql_fetch_array($result))
{
$feeditems .= $this->ItemTag($this->TitleTag($row["Title"]) .
$this->LinkTag($row["Link"]) . $this->DescriptionTag($row["Description"]) .
$this->PubDateTag($row["PubDate"]));
}
}

return $feeditems;
}

function PubDateTag($content)
{
return "<pubDate>\n\t" . $content . "\n</pubDate>\n";
}

function DescriptionTag($content)
{
return "<description>\n\t" . $content . "\n</description>\n";
}

function LinkTag($content)
{
return "<link>\n\t" . $content . "\n</link>\n";
}

function TitleTag($content)
{
return "<title>\n\t" . $content . "\n</title>\n";
}

function ItemTag($content)
{
return "<item>\n\t" . $content . "\n</item>\n";
}

function ChannelTag($content)
{
return "<channel>\n\t" . $content . "\n</channel>\n";
}

function RssTag($content)
{
return "\n" . '<rss version="2.0">' . "\n\t" . $content . "\n</rss>\n";
}

}

?>



El uso de esta clase en una página externa quedaría:



Codigo PHP

<?php
/**

* Prueba de PHPFeeder.
*/

include("Feeder.php");

$Conn = mysql_connect("tuserverurl","tuusuario","tupassword",TRUE) or die("Error de conexion:" . mysql_error($Conn));
mysql_select_db("tubasededatos",$Conn);

$sqlqry = "SELECT Campo1 as Title,
Campo2 as Description,
Campo3 as Link,
Campo4 as PubDate
FROM TuTabla
ORDER BY Campo4 DESC
LIMIT 100;";


$rs = mysql_query($sqlqry,$Conn);

$Feed = new Feeder();
echo $Feed->Feed("Titulo del feed", "http://urlDelFeed",
"Descripción del feed", $rs);


if( $rs )
{
echo $Feed->Feed("Titulo del feed", "url del feed",
"Descripción del feed", $rs);
}
else

{
echo "Error en la conexion con MySQL Server:" . mysql_error($Conn);
}

?>






Y esto nos dará por resultado un canal de noticias en RSS.

Aunque ya la mayoría de los blogs y sistemas de administración de contenido tienen preinstaladas herramientas para feed, el tener una clase propia y sencilla de usar tiene sus ventajas, ya que se le pueden dar usos personalizados, como rastreador de eventos espeficicos, errores, auditorías, o el clasico uso de noticias con mayor control, etc., sin echar mano de correos, ya que estos pueden consumir recursos y transferencia del servidor en mayor medida que los canales de noticias.

lunes, 20 de julio de 2009

Conversiones binario, octal y hexadecimal a decimal en SQL Server

Como continuación del anterior artículo, esta vez veremos como convertir de cualquier base numérica (hexadecimal, octal y binaria) a base decimal en SQL Server. A continuación presentamos el código:


Codigo T-SQL

CREATE FUNCTION dbo.udf_base_a_decimal(@S varchar(250), @Base int)

RETURNS bigint

AS

BEGIN

DECLARE @Result bigint, @i int, @P int,

@NumChars varchar(50)

-- Declaramos las variables

SET @NumChars = '0123456789ABCDEF'

SET @Result = -1

SET @S = UPPER(@S)

SET @i = 1

-- Validamos las bases

IF ( (@Base = 2) OR (@Base = 8) OR (@Base = 16) OR (@Base = 10) )

BEGIN

SET @Result = 0

-- Iniciamos el ciclo

WHILE ( @i <= LEN(@S) )

BEGIN

SET @P = CHARINDEX(SUBSTRING(@S,@i,1),@NumChars)

IF ( (@P = 0) OR (@P > @Base) )

BEGIN

SET @Result = -1

BREAK

END

SET @Result = @Result + (@P - 1) * (POWER(@Base,(LEN(@S) - @i)))

SET @i = @i + 1

END

END

RETURN @Result

END

GO





La forma de usar esta función es:

Codigo T-SQLSELECT dbo.udf_base_a_decimal('1000111010100',2)

SELECT dbo.udf_base_a_decimal('10724', 8)

SELECT dbo.udf_base_a_decimal('11D4', 16)




Los resultados obtenidos

Resultados T-SQL
--------------------
4564

(1 row(s) affected)


--------------------
4564

(1 row(s) affected)


--------------------
4564

(1 row(s) affected)





Es todo por ahora, nos leeremos la próxima.

sábado, 18 de julio de 2009

Conversiones decimal a binario, octal y hexadecimal en SQL Server

En esta ocasión veremos una función simple para convertir numeros decimales a otras bases como son, binario, octal y hexadecimal.


Codigo T-SQLCREATE FUNCTION dbo.udf_decimal_a_base(@N bigint, @Base int)

RETURNS varchar(200)

AS

BEGIN

-- Declaramos las variables a utilizar

DECLARE @Result varchar(200),

@NumChars varchar(50)

-- Inicializamos las variables

SET @NumChars = '0123456789ABCDEF'

SET @Result = ''

-- Validamos la base a convertir

IF ( (@Base = 2) OR (@Base = 8) OR (@Base = 10) OR (@Base = 16) )

BEGIN

-- Ejecutamos el ciclo

WHILE ( @N > 0 )

BEGIN

-- Realizamos la conversion

SET @Result = SUBSTRING(@NumChars,(@N % @Base) + 1,1) + @Result

-- Disminuimos N, dividiendola entre la base

SET @N = FLOOR(@N / @Base)

END

END

-- Retornamos el resultado

RETURN @Result

END

GO



El uso de esta funcion quedaría:

SELECT dbo.udf_decimal_a_base(4564,2)

SELECT dbo.udf_decimal_a_base(4564,8)

SELECT dbo.udf_decimal_a_base(4564,16)

Codigo T-SQL

Dandonos como resultados:


Resultados T-SQL---------------------------------------------------------------------------------------------
1000111010100

(1 filas afectadas)

---------------------------------------------------------------------------------------------
10724

(1 filas afectadas)

---------------------------------------------------------------------------------------------
11D4

(1 filas afectadas)



Esta función puede incluirse dentro de Stored Procedures y tener múltiples aplicaciones, espero que les sirva. Hasta la próxima.