14 de Septiembre, 2005

El bug de la semana

Ha sido muy difícil de encontrar el muy *#?$@. Es una de las pegas de trabajar con lenguajes interpretados, y PHP no es menos problemático que el resto en estos casos.

El aviso del cliente es poco más que extraño: cuando vamos a imprimir etiquetas recien generadas, la primera vez que se imprimen el PDF generado no es correcto (faltan etiquetas). Si a continuación volvemos a imprimir, entonces sí se genera bien :o.

Después de ojear las muestras de etiquetas generadas por el cliente veo que no hay un patrón: a veces falta una página completa, a veces una etiqueta, la mayoría de las veces no falla. Y lo peor de todo, no consigo reproducir el error en la instalación que tengo para desarrollo.

Bueno, les presento el error:

...
for($i; $i<$sql->num_rows($nota); $i++)
{
	$row=$sql->result_row($nota);
...

Cuando se recorrían las etiquetas pertenecientes a una nota de fabricación, se contaban elementos de menos porque había escrito mal la inicialización de la variable $i (falta el =0).

¿Qué causaba ese comportamiento tan extraño? Probablemente porque PHP no inicializa las variables a 0, o al menos no lo hace en la versión que está corriendo el cliente (diferente a la que tengo en desarrollo; lo sé... no es buena idea). Así que no siempre la memoria que se cogía para esa variable contenía un cero (casualmente), y por eso el número de etiquetas mostradas variaba, incluso hasta el punto de, a veces, funcionar correctamente el algortimo :).

PHP no nos advierte y no hay nada en los logs de Apache. Si miramos la documentación de for veremos que no tenía porqué: se espera una expresión y $i lo es. Así que a releer el código hasta dar con el problema.

Seguro que a más de uno le ha llevado de cabeza un fallo de este estilo.

Anotación por Juan J. Martínez, clasificada en: php.

Hay 2 comentarios

Gravatar

Joe, 2 caractes menos y te pueden volver loco.

Que trabajas programando ERPs en php? O es algun programa especifico para alguien? Te prgunto esto porque me parece raro utilizar php para un programa de este estilo (etiquetas, imprimir...)

por zarta, en 2005-09-15 00:21:55

Gravatar

Es un programa de gestión de envasado accesorio al programa de gestión que tienen contratado con otra empresa. Mi parte hace "lo que le falta" a la otra... gestión de bultos, entrada salida, packing list, etc. PHP tiene más ventajas que inconvenientes para programas de gestión, y en este caso está funcionando muy bien (incluye la programación de un lector de código de barras inalámbrico con 802.11g, también basada en web).

por Juanjo, en 2005-09-15 08:57:08

Los comentarios están cerrados: los comentarios se cierran automáticamente una vez pasados 30 días. Si quieres comentar algo acerca de la anotación, puedes hacerlo por e-mail.

Algunas anotaciones relacionadas: