Problemas en la salida cuando usamos include en php

Para volverse loco!
Resulta que realizando un código en php muy sencillo, veía que el código generado no se visualizaba correctamente.
Se creaban unos espacios extraños, y viendo el código fuente de forma normal y viéndolo con el Firebug, veía que no se correspondía.

El código fuente parecía estar bien, pero en el firebug las cosas me salían de una forma muy extraña, por ejemplo, algunas referencias a css y js del head, me las ponía debajo de body.

Un auténtico misterio.

A base de ir comentando a trozos el código para detectar donde estaba el problema, me di cuenta de que el error estaba cuando utilizaba la función ‘include’.

Después de utilizar include, include_once, require, require_once, con comillas dobles, con comillas simples, con paréntesis… al final, leyendo los comentarios del include de php.net, vi que un usuario comentaba que había un ‘security flaw’ y que para solucionarlo, usaba los métodos ‘ob_start()’ y ‘ob_end_clean()’ antes y después de hacer los includes.

Con la mayor parte del código comentado, al poner estas funciones, el problema parecía haberse solucionado… pero en cuanto descomenté el resto… otra vez la cosa estaba mal.

Después de muchas pruebas, frustraciones, y búsquedas en google, di con esta página: http://bugs.php.net/bug.php?id=40072

Ahí estaba la solución! El puto BOM del utf-8!! (con perdón)

Había probado el tema de la codificación de los archivos, pero no se me había ocurrido usar la codificación “utf-8 sin BOM”.

Lo peor de todo, es que entonces recordé… que esto ya me había pasado antes!!

Ayyyy… que malo es el Alzeimer…

Pues nada.
Espero que si algún día os pasa algo así, encontréis este post y os ayude a resolver rápidamente el problema.

Recordar que en notepad++ en español tenemos las opciones “utf-8” y “utf-8 sin BOM” pero que en otros editores o versiones podemos encontrarnos con “utf-8” y “utf-8 with signature”. En este último caso, habría que utilizar el “utf-8”.

Para los que tengáis la curiosidad de saber que es el BOM, que sepáis que es el ‘Byte Order Mark’ y podéis leer más en la wikipedia.

VirtueMart 2 (Release Candidate)

Gran noticia. La nueva versión de virtuemart parece que viene cargada de nuevas mejoras:

– Media Handler (multiple images)
– Custom Fields (replacing the old attributes, producttypes, variants,…)
– True Child Products in the sense of OOP (unpublished parents can be used as linked product pattern)
– Mail template system
– New Currency Formatting possibilities
– More Modules and Plugins
– New Admin Menu Layout
– Meta Tags
– More Filters and Search Options
– Completely Anonymous Checkout
– Revenue Report
– New Templates

Además, están viendo cómo solucionar la compatibilidad con Joomla 1.6, y mejorando temas de rendimiento y seguridad en el código, además de algunas otras cosas.

Podéis leer más en la página oficial (ingles): http://virtuemart.net/news/list-all-news/403-virtuemart-2-release-candidate-ready-for-download.

Veremos si esta versión tiene un código mejor orientado a MVC.
;-P

Recoger el contenido de una URL en PHP

Hacer una petición a una url y recoger el contenido que devuelve ya sea html, xml, json o lo que sea, es una tarea muy recurrente en el desarrollo web.

En php esto lo podemos hacer al menos de 3 formas diferentes.
Dependiendo del servidor de hosting algunas alternativas funcionan y otras no.

Básicamente estas 3 formas de hacerlo son:

1. La función estándar de ‘filesystem’ “file_get_contents()”

$page = file_get_contents('http://www.url.com/pagina.ext');

2. Las extensiones cURL

$c = curl_init('http://www.url.com/pagina.ext');
curl_setopt($c, CURLOPT_RETURNTRANSFER, true);
$page = curl_exec($c);
curl_close($c);

3. La clase de PEAR “HTTP_Request”

require_once 'HTTP/Request.php';
$r = new HTTP_Request('http://www.url.com/pagina.ext');
$r->sendRequest();
$page = $r->getResponseBody();

Evidentemente el file_get_contents es lo más sencillo, pero en muchos casos nos encontramos que en el servidor está deshabilitado.

Tenéis información mucho más completa y extendida con más casos en la fuente: http://smultron.es/2011/02/descargar-paginas-web-usando-php-curl-file_get_contents/

microSaludos!!

Capturar todos los errores en una aplicación ASP .Net

La verdad es que algo muy sencillo de hacer y que deberíamos hacer como norma en todas nuestras aplicaciones.

Simplemente tenemos que implementar el método “Application_Error” del “Global.asax.cs” y podremos capturar cualquier error que se produzca en la aplicación aunque no hayamos controlado la Excepción con un Try-Catch.

Una vez capturado el error, podemos mostrarlo en nuestro Log (es aconsejable tener uno), o enviarnos un email con lo que ha pasado, e incluso limpiar el error y hacer como que no ha pasado nada…

Bueno, ahí va el código:

protected void Application_Error(Object sender, EventArgs ea)
{
    string uriFormat = "\r\n\r\nURI: {0}\r\n\r\n";
    string exceptionFormat = "{0}: \"{1}\"\r\n{2}\r\n\r\n";

    StringBuilder message = new StringBuilder();

    if (Request != null)
    {
        message.AppendFormat(uriFormat, Request.Path);
    }

    if (Server != null)
    {
        Exception e;
        for (e = Server.GetLastError(); e != null; e = e.InnerException)
        {
            message.AppendFormat(exceptionFormat, e.GetType().Name, e.Message, e.StackTrace);
        }
    }

    // En este caso, escribimos en nuestro log
    MyAppLogger.Log("** APP ERROR Sin controlar la excepción **\n" + message.ToString());

    //Server.ClearError(); // descomentar esto para cancelar el error
}