Pablo Viquez Blog

Mi vida y cosas relacionadas

Skip to: Content | Sidebar | Footer

php set_include_path() function returns false

14 June, 2009 (19:22) | PHP, Web Development, debug, errors | By: Pablo Viquez

After a while struggling with the php function set_include_path() on windows, became to my attention that using the windows registry to set php configuration values they are set using the php_admin_value which forbids overriding it  on run time.

So for example, if you set the include_path on the windows registry and then you call the set_include_path function in your application, it will return false and won’t change the include_path.

The same applies if you use php_admin_value on your .htaccess file or virtual host file.


Después de un tiempo luchando con la la función de PHP set_include_path() en windows, que me retornaba false cuando la llamaba, noté que cuando se usa el registro de windows (windows registry) para modificar la configuracion de PHP (Ver: Registro de windows y la configuracion de PHP), es como utilizar php_admin_value la cual no deja que se modifiquen en tiempo de ejecución.

Por ejemplo, si se usa el registro de windows con la configuración de PHP "include_path” y luego se llama la función set_include_path en la aplicación, esta retorna false (false) y no cambiará la configuración.

Esto aplica también si utiliza php_admin_value en el archivo .htaccess o donde se defina un host virtual.

Zend Server, 500 Internal Error Server

14 June, 2009 (15:36) | General, PHP, debug, errors | By: Pablo Viquez

Instalé Zend Server en mi computadora ya que estoy probando y comparando XDebug y Zend Server. (Ver Instalación de XDebug)

La instalación realmente fue sencilla y me quedo funcionando de maravilla. Lo único que noté es que Zend Server no instala a PHP como un módulo sino como CGI.

Esto hace que si creo un archivo de configuracion .htaccess con valores de configuracion específicos de PHP en el archivo, me de un error “Internal Server Error”.

Mi archivo .htaccess para la aplicación específica, tenía una serie de configuraciones para PHP específicas que funcionaban bien cuando PHP corria como un módulo:

php_value display_errors "On"
php_value log_errors "On"
php_value session.auto_start 0
php_value error_log "D:/webserver/logs/php_app_error.log"

Solución

Revisando en al documentación de PHP, encontré que uno puede hacer configuraciones específicas por directorio en Windows, utilizando el registro de la máquina.

En vez de poner las configuraciones específicas de PHP en el archivo .htaccess, las puse en el registro de windows y funcionó muy bien.

Espero que le sirva aquellos que estan teniendo problemas con esto.

Asumiendo que el Webserver inicia en “D:\webserver\www” hice este archivo .reg, para crear las entradas necesarias en el registro de Windows:

Webserver.reg

Windows Registry Editor Version 5.00

[HKEY_LOCAL_MACHINE\SOFTWARE\PHP\Per Directory Values\D\webserver\www]
"display_errors"="On"
"log_errors"="On"
"session.auto_start"="0"
"error_log"="D:/webserver/logs/php_app_error.log"

Changing PHP configuration via the Windows registry

When running PHP on Windows, the configuration values can be modified on a per-directory basis using the Windows registry. The configuration values are stored in the registry key HKLM\SOFTWARE\PHP\Per Directory Values, in the sub-keys corresponding to the path names. For example, configuration values for the directory c:\inetpub\wwwroot would be stored in the key HKLM\SOFTWARE\PHP\Per Directory Values\c\inetpub\wwwroot. The settings for the directory would be active for any script running from this directory or any subdirectory of it. The values under the key should have the name of the PHP configuration directive and the string value. PHP constants in the values are not parsed. However, only configuration values changeable in PHP_INI_USER can be set this way, PHP_INI_PERDIR values can not.

Referencia:

Como instalar Eclipse PDT y XDebug en Windows

13 June, 2009 (02:09) | PHP, Web Development, debug, training | By: Pablo Viquez

Este tutorial enseña como ejecutar un script PHP paso a paso haciendo su depuración más sencilla y fácil. Tambien muestra paso a paso como instalar Eclipse PDT y configurarlo para usar XDebug.

Este mismo tutorial esta disponible para descargar, haga click aquí

Que necesita:

  1. Eclipse PDT
  2. Extensión de XDebug

Para este tutorial, se asume lo siguiente:

  1. Ya tiene instalado Apache y PHP.
  2. Se trabajará en modo local “localhost”

Como Instalar Eclipse PDT

1. Descargue eclipse.

eclipse_download

2. Una vez que se ha descargado por completo, descomprímalo en el disco duro (Para efectos de este tutorial usaremos “c:\”)

eclipse_uncompress

3. Haga click derecho sobre “eclipse.exe” y seleccione “Send To / Enviar a” > “Desktop / Escritorio” para crear un acceso directo en el escritorio.

4. ¡Listo!

Como Instalar XDebug

1. Descargue XDebug. (Se asume que se quiere instalar para Apache 2)

xdebug_download

2. Guárdelo en el directorio donde esta PHP. (Para efectos de este tutorial usaremos c:\php).

xdebug_install

3. Abra y agregue estas líneas al final del archivo de configuración de PHP php.ini de la siguiente manera:

[XDebug]
zend_extension_ts="C:\php\php_xdebug-2.0.4-5.2.8.dll"
xdebug.remote_enable=1
xdebug.remote_host=127.0.0.1
xdebug.remote_port=9000

xdebug.remote_handler=dbgp
xdebug.profiler_enable=1
xdebug.profiler_output_dir="RUTA DE UN DIRECTORIO PARA ARCHIVOS TEMPORALES"

NOTA NOTA: Si tiene instalado Zend Server o alguna configuración para hacer debug con Zend Server, debe deshabilitarla, ya que Zend Server y XDebug no son compatibles:

[Zend]
;zend.install_dir="C:\Program Files\Zend\ZendServer"
;zend.conf_dir="C:\Program Files\Zend\ZendServer\etc\"
;zend.pid_dir="C:\Program Files\Zend\ZendServer\logs"
;zend.temp_dir="C:\Program Files\Zend\ZendServer\tmp"
;zend.log_dir="C:\Program Files\Zend\ZendServer\logs"
;zend.data_dir="C:\Program Files\Zend\ZendServer\data"
;zend.httpd_uid=HTTPD_UID
;zend.httpd_gid=HTTPD_GID
;zend.ini_scandir=cfg
;zend.serial_number=
;zend.user_name=

4. Reinicie Apache.

info

TIP: Si al reiniciar Apache no le funcionaba, asegurese que tenga la configuración correcta en el archivo php.ini, también asegurese que la directriz “xdebug.profiler_output_dir” tiene un directorio válido.

Comprobar que fue instalada correctamente

En la raíz del directorio del servidor web, haga una página nueva que se llame “phpinfo.php” y escriba este código:

<?php phpinfo();

Ejecútela en el navegador http://localhost/phpinfo.php y busque XDebug:

xdebug_install_a

xdebug_install_b

Como configurar Eclipse PDT para usar XDebug como depurador de PHP

1. Inicie Eclipse (puede usar el acceso directo que se hizo en los pasos anteriores)

2. En la barra de menú, haga click en: “Window –> Preferences”

xdebug_install_1

3. En el menú de la izquierda, seleccione PHP – Debug, y en las opciones de la derecha seleccione XDebug. Una vez seleccionado,  haga click en “Ok”.

xdebug_install_2

4. Cree un nuevo proyecto, para efectos de este tutorial crearemos un proyecto llamado “XDebug Test”

xdebug_install_3

5. Cree una nueva página con el nombre de “index.php”

xdebug_install_6

6. Escriba el siguiente código:

<?php
for ($i = 1; $i < 10; $i++) {
    echo "\$i contiene: {$i} <br />\n";
}

echo "Terminó!";

7. Seleccione “Run – Debug”

xdebug_install_8

8. Haga click en “ok” para confirmar que quiere cambiar la perspectiva a “Debug”. En esta perspectiva tiene varias opciones para depuración, algunas de ellas son:

  • Resume – F8. Completa la ejecución del script
  • Suspend. Suspende la ejecución.
  • Terminate. Termina la ejecución del script.
  • Step Into – F5. Entra en cualquier función y ejecuta el script paso a paso.
  • Step Over – F6. Ejecuta el script paso a paso, no entra en funciones.

xdebug_install_10

9. En esta perspectiva se pueden ver los siguientes paneles:

  • Debug, panel 1: Nos dice cual script está ejecutando asi como en qué línea del script se encuentra.
  • Variables, panel 2: Todas las variables y su contenido.
  • Panel 3: Línea de código que se está ejecutando.
  • Debug, panel 4: El resultado del script, lo que vería el navegador.

xdebug_install_11

10. Una vez que completa el proceso de depuración veremos esta ventana:

xdebug_install_12

11. Para volver a la perspectiva de desarrollo, haga click en la opción de PHP:

xdebug_install_13

¡Listo!

Espero que les ayude.

Comunidad de PHP Costa Rica

11 June, 2009 (18:05) | General, PHP, tech, training | By: Pablo Viquez

Invito a tod@s los que quieran participar de la próxima reunión de la comunidad de PHP en Costa Rica:

Donde? Universidad Latina de Costa Rica

Cuando? Jueves 25 de Junio, apartir de las 6pm

Sala de Video conferencias, 3 piso Edificio de ciencias médicas.

Mas info: http://www.costaricaphp.org/archives/50

El grupo es abierto, tod@s estan invitados, desde estudiantes del lenguaje hasta programadores avanzados.

¡Hola a tod@s!

Por fin tenemos fecha para la proxima reunión.

Fecha: Jueves 25 de Junio, apartir de las 6 pm.
Lugar: Universidad Latina de Costa Rica

Se estará dicutiendo la nueva versión de PHP 5.3, que hay de nuevo y ejemplos de código.

Los invito a tod@s a asistir, y también a invitar a todas aquellas personas que les interese PHP.

Feliz cumpleaños a PHP!

8 June, 2009 (11:10) | PHP | By: Pablo Viquez

Hoy se cumplen 14 años desde que Rasmus Lerdorf sacó la primera versión de PHP.

php-big

Illegal mix of collations…

14 May, 2009 (22:42) | General, debug, errors, mysql | By: Pablo Viquez

Estaba haciendo unos procedimientos almacenados en MySQL 5 y cuando estaba hanciedo pruebas, me comenzó a dar este error:

Script line: 73    Illegal mix of collations (latin1_general_ci,IMPLICIT) and (latin1_swedish_ci,IMPLICIT) for operation ‘=’

Buscando donde estaba el error, me di cuenta que el procedimiento almacenado que estaba probando utiliza un cursor comparando un String de parametro con una tabla definida explicitamente con una colación (COLLATION) latin1_general_ci.

Este es un ejemplo de como generar el error. Se crea una tabla “tabla_ejemplo” y un procedimiento almacenado “recorrer_ejemplo”. El procedimiento lo únicamente lo que hace es definir un cursor a la tabla “recorrer_ejemplo”, abrirlo y recorrerlo contando el numero de registros que contiene.  (No tiene mucho sentido pero es para ejemplo solamente)

Definición de la tabla:

create table tabla_ejemplo(
    id int unsigned not null auto_increment,
    temp_key varchar(32) not null,
    description varchar(250),
    primary key (id)
) engine = InnoDB
default charset latin1 collate latin1_general_ci;

Definición del procedimiento almacenado (Stored Procedure):

DELIMITER //

CREATE PROCEDURE recorrer_ejemplo(
    IN p_temp_key  VARCHAR(32),
    IN p_description  VARCHAR(250),
    OUT total_ejemplos INT UNSIGNED)
BEGIN
    -- Declaracion de variables
    DECLARE v_id VARCHAR(100);
    DECLARE v_temp_key VARCHAR(32);
    DECLARE v_description VARCHAR(100);
    DECLARE v_done INT DEFAULT 0;

    -- Declaracion del cursor
    DECLARE cur_ejemplo CURSOR FOR
    SELECT id,
               temp_key,
               description
       FROM tabla_ejemplo
     WHERE temp_key = p_temp_key;

    -- Handler para el cursor
    DECLARE CONTINUE HANDLER FOR NOT FOUND SET v_done = 1;

    -- ***************************
    -- **   AQUI ME DA ERROR   ***
    -- ****************************
    OPEN cur_ejemplo;

    SET total_ejemplos = 0;

    -- Inicio del repeat
    REPEAT
        -- Traiga los datos del cursor
        FETCH cur_ejemplo
          INTO v_id,
                  v_temp_key,
                  v_description;

        -- ... ++ OPERACIONES ++ ...

        SET total_ejemplos = total_ejemplos + 1;

        -- Fin del repeat
    UNTIL v_done END REPEAT;
END;

//
DELIMITER ;

Inserción de datos:

INSERT INTO tabla_ejemplo
       VALUES (NULL, MD5('pablo'), 'Desc 1 ...'),
              (NULL, MD5('pablo'), 'Desc 2 ...'),
              (NULL, MD5('pablo'), 'Desc 3 ...');

Llamado al procedimiento:

SET @p_temp_key = MD5('pablo');
SET @p_description = 'Desc 2 ...';
SET @total_ejemplos = NULL;

CALL recorrer_ejemplo(
       @p_temp_key,
       @p_description,
       @total_ejemplos);

SELECT @total_ejemplos;

Al ejecutar todas las instrucciones, me genera este error:

Script line: 74    Illegal mix of collations (latin1_general_ci,IMPLICIT) and (latin1_swedish_ci,IMPLICIT) for operation ‘=’

En resumen:

El problema está en que MySQL no sabe como resolver la conversión de datos internamente (ver referencias). Es decir, no sabe cual colación debería seguir.

Este comportamiento se llama “coercibility” (coercitivas) y basicamente significa la capacidad de poder ser convertido. En este caso, la capacidad de poder convertir un dato con una collation latin1_swedish_ci a latin1_general_ci.

Los parametros del procedimiento almacenado, tienen una colación latin1_swedish_ci, y cuando lo compara con el campo temp_key con una colación latin1_general_ci general el error, ya que MySQL no sabe cual colación usar a la hora de compara los campos VARCHAR.

Solución:

Convertir el parametro usando la funcion CONVERT y dandole la colación adecuada, ya que la colación default de latin1 es latin1_swedish_ci.

-- Declaracion del cursor
DECLARE cur_ejemplo CURSOR FOR
    SELECT id,
               temp_key,
               description
       FROM tabla_ejemplo
     WHERE temp_key = CONVERT(p_temp_key USING latin1)
                                COLLATE latin1_general_ci;

Reglas de Coercibilidad (Coercibility).

En la gran mayoría de consultas, resulta obvio qué colación usa MySQL para resolver una operación de comparación. Por ejemplo, en los siguientes casos, debe quedar claro que la colación es “la colación de la columna x”:

SELECT x FROM T WHERE x = x;

Sin embargo, cuando están implicados varios operandos, puede haber ambigüedad. Por ejemplo:

SELECT x FROM T WHERE x = 'Y';

¿Esta consulta debe usar la colación de la columna x, o de la columna de caracteres literal ‘Y’?

SQL estándar resuelve tales cuestiones usando lo que se solía llamar reglas “coercitivas”. Es decir: Como x e ‘Y’ tienen colaciones, ¿cuál tiene precedencia? Puede ser difícil de resolver, pero las siguientes reglas resuelven la mayoría de situaciones:

  • Una cláusula COLLATE explícita tiene una coercibilidad de 0. (No es coercible en absoluto.)
  • La concatenación de dos cadenas de caracteres con diferentes colaciones tiene una coercibilidad de 1.
  • La colación de una columna tiene una coercibilidad de 2.
  • Una “constante de sistema” (la cadena de caracteres retornada por funciones como USER() o VERSION()) tiene una coercibilidad de 3.
  • Una colación de un literal tiene una coercibilidad de 4.
  • NULL o una expresión derivada de NULL tiene una coercibilidad de 5.

Estas reglas resuelven ambigüedades como:

  • Uso de la colación con el valor más bajo de coercibilidad.
  • Si ambos operadodres tienen la misma coercibilidad, entonces hay un error si las colaciones son distintas.

Ejemplos:

columna1 = ‘A’ Usa colación de columna1
columna1 = ‘A’ COLLATE x Usa colación de ‘A’
columna1 COLLATE x = ‘A’ COLLATE y Error

Referencias:

  • http://dev.mysql.com/doc/refman/5.0/es/charset-collate-tricky.html
  • http://dev.mysql.com/doc/refman/5.0/es/information-functions.html#function_coercibility

El hosting que uso

7 May, 2009 (15:44) | General | By: Pablo Viquez

He querido escribir sobre hostings desde hace rato.

Cuando iniciamos con la comunidad de PHP www.costaricaphp.org un amigo nos ofreció hospedar el sitio gratis en un server que el tenía y a administraba, pero fue un toque feo, ya que todo habia que pedirle a el cualqueir cosa y se duraba mucho haciendo un cambio, en fin, decidimos pagar por un servicio de hosting nosotros mismos.

Consideramos varias opciones, la verdad nunca me habia puesto a buscar un hosting provider enserio, siempre amigos/personas preguntaban y nunca tenia una respuesta clara.

Yo tenia una cuenta en GoDaddy, pero es horrible!, asi que GoDaddy estaba descartado, fue cuando nos encontramos Hostmonster que pareció una buena opción en el momento.

Al cabo de 1 año en Hostmonster, estaba sumamente desilucionado, todo era complicado, no permitian multiples dominios en una misma cuena, no tenian SVN el cual es sumamente importante para un desarrollador web, etc. De nuevo tuve que buscar otro hosting provider….

Pregunte a varios compañeros y me dijeron que ellos usaban Dreamhost.

Me meti al site de ellos y realmente me costo creer que ofrecieran espacio ilimitado en disco y ancho de banda ilimitado, parecia muy bueno para ser verdad.

Investigue un poco y BINGO, repositorios ilimitados de SUBVERSION!!! ahi dije “LO COMPRO!”.

Normalmente pago el servicio anual, asi no me preocupo en el año por el hosting y pruebo como es la cosa.

Llevo un año con ellos y la verdad no puedo estar mas feliz, tengo el sitio de la comunidad de PHP ahi y mi sitio personal, además de varios otros subdominios para demos o instalar aplicaciones para probar.

Me encanta que me den espacio ilimitado en el disco, ancho de banda ilimitada y sobre todo subversion, además que tambien tengo acceso al shell usando SSH.

Para terminar, me di cuenta que cuando hacia “sign-up”, tenian un espacio de “cupones de descuento” y me di cuenta que solo tenia que buscar…. y encontré.

Para compartir con quien halla tenido las mismas experiencias y ande buscando un hosting… aqui están los cupones de descuento de dreamhost! ¡PROVECHO!

La dirección de Dreamhost es: http://www.dreamhost.com/

Cupón de descuento Descripción
60DESCUENTO1ANNO $50 de descuento el primer año.
Tarifa normal $119, con el cupon $69.4
33DESCUENTO2ANNO 33% de descuento por 2 años.
Tarifa normal $214.8, con el cupón $142.8
25DESCUENTO3ANNO 25% de descuento por 3 años.
Tarifa normal $286.2, con el cupón $214.2
2DOM20DESCUENTO 2 Dominios gratis para siempre + 20% descuento por un año
Tarifa normal $119, con el cupon $99.4 + 2 dominios gratis.
IP_UNICA_20DESC 1 IP única grátis de por vida + $23 de descuento
Tarifa normal $119, con el cupon $96.4 + 1 dirección IP única gratis para siempre.

APC en PHP

23 April, 2009 (15:08) | General | By: Pablo Viquez

APC Rocks! Implemente unas clases para internalización y localización usando Zend Framework y el core que basicamente cargaba y parseaba los diccionarios en XML le hice cache con APC para poder tener una unica instancia por servidor del mismo “objeto” y funciono muy bien.

Espero poner la arquitectura que se uso pronto por aqui.

Proximo curso de PHP

15 April, 2009 (19:02) | PHP, tech, training | By: Pablo Viquez

Según me informaron el próximo curso libre de PHP en la Universidad Latina iniciará el próximo Jueves 23 de Abril del 2009. El curso es Fundamentos de Programación con PHP y el plazo para inscripción se extendió una semana mas.

Hablando con Cristian Cambronero le explicaba la razón principal de los cursos y pense que sería bueno ponerla por aquí para referencia.

La idea de los cursos surgió después de unas reuniones de la comunidad de PHP, en donde varias personas preguntaron por cursos y honestamente no conocía de alguno que fuera libre. Conocía de algunos en donde se hablaba de PHP pero dentro de la carrera de Ing. en Sistemas.

En un principio el curso de la Universidad Latina era sencillo, PHP básico y conexión a MySQL, después de hacerle cabeza al curso, fue que nacio “<?PHP Developer Track”.

La idea principal no era hacer un solo curso libre, sino todo un "track" de entrenamiento, mas serio y continuo, teniendo como objetivo que las personas fueran capaces de enfrentar las demandas de la industria.

Espero que sea de ayuda, tanto a personas que deseen aprender PHP como a empresas que desen contratar personas con conocimientos de las últimas tendencias y mejores prácticas.

Por otro lado, en el próximo curso y los siguintes, estaré usando eFront para el manejo de las clases así como evaluación. Lo he estado probando y me gusta muchísimo, tiene todo lo que se necesita para eLearning (http://www.efront.gr/ ) Tiene una versión Open Source, está hecho en PHP 5 y MySQL 5.

Evaluando este software, me gusto mucho que usa un estadar de programación actualizado en su código, las funciones y clases estan comentadas usando PHPDocs, y es modular.

La interfaz es sumamente amigable, hace mucho uso de AJAX haciendo la experiencia muy amena. Si encontré un problema de seguridad en la entrada de datos, ya que no hace una buena limpieza de la entrada de datos, abriendo la posibilidad de un ataque usando XSS.

Catálogo de cursos

Certificación de MySQL

12 March, 2009 (09:58) | General | By: Pablo Viquez

mysql-167x86Estoy muy contento ya que ayer hice me examen de certificacion de MySQL Developer y pasé!

De primera entrada no habia estudiado mucho y probé hacer el examen la semana pasada y lo fallé por 3 puntos. Matricule de nuevo el examen para hacerlo una semana después y encontré que el segundo examen era increiblemente mas difícil.

En el primer examen, las preguntas eran cosas del libro “MySQL 5.0 Certification Guide” pero para el segundo examen la preguntas eran del libro mas la documentación online.