Archivo de la categoría: PHP

Desactivar warning validación XSD en PHP

Si estás tratando de validar documentos XML en PHP muy probablemente estés usando la clase DOMDocument. Esta clase que nos permite crear una estructura de árbol de nodos de un documento XML, permite realizar una validación con un archivo XSD usando el método schemaValidate. Este método, además de retornar un valor booleano con el resultado de la validación, puede arrojar warnings no capturables por nuestro bloque try/catch.

Una solución sería establacer tu propio manejador de warnings y errores en el proyecto, cosa de la que no voy a hablar en esta entrada pero que puedes ver como realizar en los comentarios de usuarios en php.net sobre la funcion set_error_handler. En su lugar, lo que quiero enseñar es como desactivar estos warnings y errores que arroja el uso de DOMDocument:

Internamente PHP usa la libreria libxml para la manipulación de documentos XML. En el caso de detección de errores, por ejemplo, si trabajamos con un xml mal formado o si la validación XSD detecta nodos incorrectos, además de arrojar warnings la librería guarda una cola de errores detectados. Lo que vamos a hacer es decirle a libxml que no arroje warnings y que vamos a ser nosotros los que gestionemos esos errores a través de la cola que libxml crea. En este ejemplo, voy a desactivar el lanzamiento de errores y voy a lanzar una excepción con el primero de la cola de libxml (si existiese alguno trás trabajar con DOMDocument):

$previousState = libxml_use_internal_errors(true);
$dom = new DOMDocument();
$dom->loadXML($message, LIBXML_NOBLANKS);
$dom->schemaValidate('validator.xsd');
$arrayErrors = libxml_get_errors();
libxml_clear_errors();


if (!empty($arrayErrors)) {
throw new Exception($arrayErrors[0]->message , 404);
}
libxml_use_internal_errors($previousState);

En este caso, $previousState va a aguardar el estado en el que se encontraba la activación de errores antes de mi uso, ya que esta cola puede ser compartida. Una vez finalizado nuestro tratamiento volvemos a poner el estado previo. La función libxml_use_internal_errors nos permite desactivar o activar el lanzamiento de errores (true o false) y tras instanciar la creación del documento DOM y su validación XSD, consultamos la cola de errores generados con la función libxml_get_errors, almacenando su contenido en el array $arrayErrors y vaciando la cola original de libxml con la función libxml_clear_errors (es conveniente realizar siempre este borrado para evitar problemas de memoria). Finalmente comprobamos que nuestro array no está vacío y en ese caso arrojamos la excepción.

Y eso es todo. Tan sólo añadir que disponemos también de la función libxml_get_last_error, que nos devolvería directamente el último error detectado de la cola de errores.

 

PhpMailer – Language string failed to load

PhpMailer es una clase PHP para facilitar el envíos de correos. Este es un error que me ha costado unas cuantas horas solucionar. Se debe indicar al objeto creado el path de los archivos de lenguaje así como el idioma deseado en cada archivo php donde usemos la clase, de la siguiente forma:


$mailer = new PHPMailer();

$mailer->SetLanguage("en", 'path_phpmailer/language/');

Comparativa de IDE para PHP

Gracias a Javier Gutierrez por darme a conocer este buen enlace (en inglés). Una comparativa de IDE para PHP donde además nos hablan de las funcionalidades que nos proporciona el uso de estos entornos de desarrollo y las ventajas que ello conlleva.

The Big PHP IDE Test

30 clases útiles para PHP

Me gustaría currarme algún tutorial o hacer algo más personal, pero llevo una semana en la que estoy hasta el cuello de trabajo. Espero que podáis conformaros con este link que vi en PHP::Impact. Una gran recopilación de clases para PHP agrupadas según funcionalidad.

30 Useful PHP Classes and Components

Entorno de desarrollo WAMP AppServ

Entendemos WAMP como un entorno de desarrollo web compuesto de:

  • Sistema operativo: Windows.
  • Servidor web: Apache.
  • Servidor de base de datos: MySQL.
  • Lenguaje programación: PHP

LAMP es lo mismo que WAMP, pero en vez de usar Windows como sistema operativo, usamos Linux.

Está claro que un profesional del desarrollo web debería ser capaz de instalar y configurar correctamente su propio entorno de desarrollo. No obstante hay veces en las que tenemos que preparar un entorno temporal  o de pruebas. En estos casos, contamos con algunos instaladores para Windows. De los que yo he probado, prefiero el instalador integrado AppServ porque es muy fácil de instalar,  su configuración estándar es más que suficiente y en caso de necesitar algún cambio no es nada complicado hacerlo.

Puedes acceder a su web oficial y obtener más información y la descarga en el siguiente enlace:

AppServ Open Project.

PHP 5.2.7 retirado

PHP ha retirado su versión 5.2.7 de producción por un grave problema de seguridad detectado si magic_quotes_gcp se encuentra activado.

Versión PHP 5.2.7 retirada de producción.

Versión PHP 5.2.8 lista en versión release.

Pasar array PHP a JavaScript (JSON)

JSON (JavaScript Object Notation) es un formato de datos con notación JavaScript que últimamente está de moda gracias al auge de las tecnologías AJAX. Digamos que es una alternativa al uso de XML, que libera de peso la respuesta AJAX en algunos casos (no requiere el cierre de etiqueta), hace una mejor representación de estructura de datos y requiere menor coste de procesamiento.

Un caso típico en el que deberíamos usar JSON es la petición de un listado de datos mediante AJAX. Imaginemos que la petición se hace a un archivo PHP (a partir de la versión 5.2  tenemos funcionalidades relacionadas con JSON disponible y activadas por defecto) que genera una estructura datos del listado en la variable $l_a_data con el siguiente formato:

[
Array
(
    [0] => Array
           (
             [nombre] => "Francisco"
             [apellidos] => "Torres"
           )

    [1] => Array
           (
             [nombre] => "Juanma"
             [apellidos] => "Torres"

           )
)

Podríamos fácilmente entonces convertir esta estructura array a una cadena con el formato JSON con la sentencia:


$l_str_json = json_encode($l_a_data);

y enviar esta cadena JSON como response del proceso AJAX. En este caso lo que enviamos es:

[
   {
      "nombre":"Francisco","apellidos":"Torres",
      "nombre":"Juanma","apellidos":"Torres"
   }
]

Para analizar  esta cadena recibida en el código JavaScript simplemente haremos:

var l_a_json = eval('(' + responseJSON + ')');

Con lo que ya tenemos un array en JavaScript con los datos provenientes del response del AJAX invocado que generó los datos de nuestro listado.

Un inconveniente de este método es el uso de eval() en una estructura de datos. Esto nos puede presentar problemas de seguridad, así que sólo deberíamos usarlo en entornos de confianza. Como alternativa y con el objetivo de evitar problemas de seguridad, debemos utilizar algún parseador de JSON de JavaScript, se pueden encontrar en json.org (parte inferior de la página, apartado JavaScript)