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

Responder a