jueves 10 de julio de 2008

PHP: Igual versus Idéntico


Según la documentación de PHP, el operador '==' devuelve verdadero (TRUE) sin sus operandos son iguales, mientras que '===' devuelve verdadero si los operandos son iguales y además del mismo tipo (idénticos).

Recién nos encontramos con que al hacer las comparaciones:


121574312008178411518235 == 121574312008178402299047
121574312008178411518235 === 121574312008178402299047

ambas devuelven verdadero, esto no resulta tan extraño si vemos que el valor "real" de ambos números, que es:

1.2157431200818E+23

Esto significa que estamos comparando:

1.2157431200818E+23 con: 1.2157431200818E+23

Como pueden ver, ambos son "idénticos".

Ahora bien, resulta ser que:

'121574312008178411518235' ==  '121574312008178402299047'

Ahora sí, esto si resulta extraño.

El problema "real" acá es que como PHP es un lenguaje no tipado (typeless), no hay una forma adecuada de decirle al lenguaje que se trata de un string. Intentamos haciendo typecasting, pero el comportamiento es el mismo.

Usando el operador '===', la siguiente comparación retorna falso:
'121574312008178411518235' ===  '121574312008178402299047'

Acá está el ejemplo completo:

<?php
echo "<pre>\n";
$a = 121574312008178411518235;
$b = 121574312008178402299047;

if ($a == $b){
printf("$a == $b\n");
} else {
printf("$a != $b\n");
}
if ($a === $b){
printf("$a === $b\n");
} else {
printf("$a !== $b\n");
}

$a = '121574312008178411518235';
$b = '121574312008178402299047';

echo "\n";
if ($a == $b){
printf("$a == $b\n");
} else {
printf("$a != $b\n");
}
if ($a === $b){
printf("$a === $b\n");
} else {
printf("$a !== $b\n");
}
echo "</pre>\n";
?>

Las pruebas fueron realizadas utilizando:

PHP 5.2.5, Apache 2.2.6/Mac OSX 10.5.3 (Leopard)
PHP 5.2.6 Apache 2.2.8/FreeBSD 7.0-STABLE

miércoles 9 de julio de 2008

Problema al subir archivos con Safari


Recientemente nos encontramos con un problema al intentar subir archivos (de texto) a un sitio web (parte de un proyecto) utilizando Safari.


El navegador intenta (aparentemente) subir el archivo, pero al final falla y en algunos casos despliega un mensaje indicando que el servidor no responde. El problema no se al utilizar navegadores basados en Gecko (como Firefox).

Como referencia, en este proyecto estamos utilizando Zend_Framework versión 1.5.2; sin embargo aclaramos que la pulga no tiene nada que ver con su uso, es por ello que en este artículo usted podrá descubrir la solución.

Si usted es muy impaciente, simplemente agregue header("Connection: close"); a la página donde se encuentra el formulario.

Ahora bien, supongamos que nuestro controller se llama: UploadController y que el el formulario se encuentra en index.phtml, que es controlado por el método indexAction(). A continuación un poco de código.

El formulario:
<form enctype="multipart/form-data" action="/upload/doit"
method="post">
Filename:<input type="file" name="archivo" id="archivo" />
<input type="submit" id="submit" />
</form>

El método:
public function  indexAction()
{
header("Connection: close");
}
Con la intención de comprobar el funcionamiento la carga de archivo, el método doitAction() está definido de la siguiente manera:
public function  doitAction() 
{
echo "<pre>";
print_r($_FILES);
echo "</pre>";
exit;
}

Si al intentar subir un archivo, doitAction() muestra los detalles del archivo, el problema ha sido resuelto.No existe evidencia lógica para pensar que este problema tenga alguna relación con el uso del framework, lo mismo podría suceder usando otros frameworks como CodeIgniter, Qcodo, etc. Si este es el caso, o bien no está utilizando ningún framework, intente adaptar y aplicar la solución para impacientes.