Algunas aclaraciones:
El 15/12/10 14:37, Alberto García Gómez escribió:
No es problema de DB, es un error clasico de programacion. Lo que te
esta pasando ahi es que no estas preguntando correctamente, cuando dices:
$resultSet = $this->connection->Execute($query);
if (!$resultSet)
Realmente estas tratando a la variable como si fuera -boolean-, por
eso al preguntar !$resultSet lo que el sistema entiende es si la
variable es -false-, pero como en realidad no es -false- sino -null-
entonces obviamente te devolverá lo que contiene tu bloque -else- de
ese -if-, o sea: $resultSet.
Si lo que devuelve execute() es null, al preguntar if (!$resultSet)
devolverá TRUE, porque !null === true. En comparaciones los nulls se
convierten a su equivalente del otro lado, ya sea boolean, int, o lo que
sea. Si es int, null se convierte en 0, si es un arreglo, si string, en
la cadena vacía, etc. En este caso, lo que hizo Islanis:
if (!$resultSet)
{
return null;
}
else
{
return $resultSet;
}
Es preguntar "$resulSet es null? bueno, devuelvo null, sino devuelvo
$resultSet". Es una comparación porgustera, es mejor:
return $resultSet;
que al final es lo mismo y más corto.
OJO: eso es *suponiendo* que execute() devuelva null si no hay
resultados. A mí me parece que execute(), en la mayoría de las APIs lo
que hace es ejecutar un comando SQL y devolver el resultado *numérico*
de ese comando, o sea: la cantidad de filas afectadas. Por eso le sugerí
usar findAll(), que sí devuelve un array.
Si execute() devolviera un número (int), la comparación !$resultSet
devuelve true, porque !0 === true.
Si execute() devolviera un array vacío cuando la consulta no devuelve
elementos, la comparación !$resultSet también funcionaría correctamente
porque !array() === true también (el array vacío se convierte en false).
Esto sí es una verdadera molestia (al menos cuando lo descubrí me
molesto mucho!) porque si piensas que un array es casi-lo-mismo que un
objeto, aunque estuviera vacío debería convertirse a true (los objetos
siempre convierten a true) pero resulta que no: arreglos vacíos son
equivalentes a false.
Para ello puedes usar la variante que te dio Lian o usar la que tienes
con algunos cambios, aqui te doy dos variantes:
$resultSet = $this->connection->Execute($query);
if ($resultSet == NULL)
o más profesional que eso:
$resultSet = $this->connection->Execute($query);
if (is_null($resultSet))
Mi variante preferida es usando una condición ternaria:
$resultSet = $this->connection->Execute($query);
return ($resultSet == NULL)?NULL:$resultSet;
o más profesional que eso:
$resultSet = $this->connection->Execute($query);
return is_null($resultSet)?NULL:$resultSet;
Todas estas variantes son equivalentes a !$resultSet, por lo que
expliqué antes.
OJO: En PHP se usa -NULL- (en mayusculas) si te quieres referir a
valores nulos.
No es necesario que NULL se ponga así: el PHP ignora el case de los
identificadores (por ejemplo Execute === execute), incluso en modo
estricto. De hecho, siempre trabajo en modo estricto y nunca he tenido
problemas con eso. A mí me gusta usar identificadores en minúsculas, o
sea, usar "null" en vez de "NULL", para que el código se parezca un poco
a Java.
Espero te sirva de algo ;-)
Saludos Fraternales
_____________________________________
Alberto García Gómez .·.
Administrador de Redes / Webmaster
Dirección Provincial de Educacion de Matanzas
Politécnico de Informática de Matanzas
Saludos
Lian
______________________________________________________________________
Lista de correos del Grupo de Usuarios de Tecnologías Libres de Cuba.
Gutl-l@jovenclub.cu
https://listas.jovenclub.cu/cgi-bin/mailman/listinfo/gutl-l