Foros del Web » Programando para Internet » PHP » Frameworks y PHP orientado a objetos »

Devolver datos de una consulta

Estas en el tema de Devolver datos de una consulta en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Hola amigos ¿que tal? Estoy empezando a programar en POO con PHP5 y tengo una pequeña duda: Tengo un objeto a nivel de datos que ...
  #1 (permalink)  
Antiguo 01/04/2009, 04:02
 
Fecha de Ingreso: abril-2008
Ubicación: Aquí y Allá
Mensajes: 88
Antigüedad: 16 años, 9 meses
Puntos: 3
Devolver datos de una consulta

Hola amigos ¿que tal?

Estoy empezando a programar en POO con PHP5 y tengo una pequeña duda:

Tengo un objeto a nivel de datos que a través de distintos métodos realiza consultas a la base de datos, mi duda es la siguiente: ¿cuando devuelvo los datos de la consulta es mejor devolver el resource devuelto por mysql_query() y luego extraer los datos con las funciones correspondientes en el nivel de negocio; o devolver los datos en un array? ¿como lo hacen ustedes?

Muchas gracias por adelantado, Saludos.
__________________
Nadie es perfecto: los errores de los cocineros se tapan con mayonesa, los errores de los albañiles se tapan con cemento y los errores de los medicos se tapan con tierra.
  #2 (permalink)  
Antiguo 01/04/2009, 06:51
 
Fecha de Ingreso: agosto-2007
Mensajes: 345
Antigüedad: 17 años, 5 meses
Puntos: 21
Respuesta: Devolver datos de una consulta

Yo personalmente, las clases que utilizo para comunicarme con Mysql devuelven un array con los datos.

Pero raquelina no se si es lo mas correcto.

A ver si lee esto algun experto en POO y nos informa de que es lo mas correcto.
__________________
----
http://www.mascodigo.com
  #3 (permalink)  
Antiguo 01/04/2009, 07:06
Avatar de Baleog  
Fecha de Ingreso: abril-2009
Ubicación: Medellin
Mensajes: 34
Antigüedad: 15 años, 9 meses
Puntos: 4
Respuesta: Devolver datos de una consulta

Pues en lo personal yo prefiero el resource, de la siguiente manera

Código PHP:
$result mysql_query($query);

/*El mensaje lo pongo a mostrar durante el desarrollo, 
no me gusta luego mostrarle al usuario mensajes que 
puedan mostrar las tablas y campos q hay en la BD*/
if (!$result) {
    
$message  'Error en la consulta: ' mysql_error() . "\n";
    die(
$message);
}

//Y luego lo recorro asi
//tambien es posible con estas opciones 
//mysql_result(), mysql_fetch_array(), mysql_fetch_row()
while ($row mysql_fetch_assoc($result)) {
    echo 
$row['campo1'];
    echo 
$row['campo2'];
    echo 
$row['campo3'];
    echo 
$row['campo4'];

O no se si es que entendi mal la pregunta.

si a lo que te referias era a hacer una funcion que hiciera la consulta y decidir que debe devolver esta funcion yo prefiero que devuelva ya un array con los objetos formados
  #4 (permalink)  
Antiguo 01/04/2009, 09:23
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 7 meses
Puntos: 2135
Respuesta: Devolver datos de una consulta

El problema se parte en 2, si devuelves un array con los resultados, significa que vas a hacer 2 bucles, uno en tu clase, y otro probablemente en donde lees los resultados y los imprimes en tu pagina web. Pero si regresas el resource, pierdes entonces lo que estabas haciendo en POO.

En lo personal te recomendaría tratar de migrar a una capa más POO friendly, como lo es PDO, así puedes tratar con el resource y de forma POO.

Si no te es posible migrar a PDO por ejemplo, entonces trata de encapsular el resultado, lo que yo hacia antes era tener una clase result que leia los datos, por ejemplo:
Código php:
Ver original
  1. public function query( $query ) {
  2.          $result = @mysql_query($query, $this->_link );
  3.          if(!$result) {
  4.                    throw new DBException( mysql_error(), mysql_errno() );
  5.          }
  6.  
  7.          if( is_resource( $result ) {
  8.                   return new DBResult( $result, $query );
  9.          } else {
  10.                   return $result;
  11.          }
  12. }

Luego la clase DBResult era mas o menos así:
Código php:
Ver original
  1. class DBResult {
  2.        private $_result;
  3.        private $_query;
  4.  
  5.        public function __construct( $result, $query ) {
  6.                 $this->_result = $result;
  7.                 $this->_query = $query;
  8.        }
  9.  
  10.        public function fetchRow() {
  11.                 return mysql_fetch_row( $this->_result );
  12.        }
  13. }

Así te evitas el doble loop y mantienes el encapsulamiento en tus clases, aunque realmente te recomendaría mudarte a PDO, o minimo a mysqli.

Saludos.
  #5 (permalink)  
Antiguo 02/04/2009, 02:15
 
Fecha de Ingreso: abril-2008
Ubicación: Aquí y Allá
Mensajes: 88
Antigüedad: 16 años, 9 meses
Puntos: 3
Respuesta: Devolver datos de una consulta

Gracias por responder!!!

Cita:
Pero si regresas el resource, pierdes entonces lo que estabas haciendo en POO.
GatorV, no entendí muy bien esto (sera porque soy muy novata en poo, XD) ¿que quieres decir exactamente?

Gracias, Salu2 a todos
__________________
Nadie es perfecto: los errores de los cocineros se tapan con mayonesa, los errores de los albañiles se tapan con cemento y los errores de los medicos se tapan con tierra.
  #6 (permalink)  
Antiguo 02/04/2009, 08:47
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 7 meses
Puntos: 2135
Respuesta: Devolver datos de una consulta

Lo que pasa es que el resource devuelto por mysql_query es una variable (ej: $result) la cual no es un objeto entonces si haces por ejemplo:
Código php:
Ver original
  1. $result = $db->query( $sQuery );
  2. while( $row = mysql_fetch_row($result) ) {
  3.        // stuff
  4. }

De poco sirve que estes usando POO, hay que recordar que POO no es solo una diferencia de sintaxis, es todo un nuevo paradigma de programación.

Muchos programadores simplemente programan objetos orientados a funciones lo cual en teoria es un error ya que no estan aprovechando ninguna de las ventajas que da la POO, simplemente ocupan su sintaxis.

Saludos.
  #7 (permalink)  
Antiguo 03/04/2009, 03:20
 
Fecha de Ingreso: abril-2008
Ubicación: Aquí y Allá
Mensajes: 88
Antigüedad: 16 años, 9 meses
Puntos: 3
Muchas gracias por tu respuesta GatorV,

Creo que poco a poco voy entendiendo esto de los objetos, al menos los de la capa de datos,

Me queda un pequeña duda:
Creo que entonces en la capa de datos solo deberian ir los metodos para hacer las consultas: select, insert, delete, etc, ... ¿Estoy en lo cierto?

Gracias de nuevo, Saludos

Hola, GatorV

Lo que no termino de entender es, en la clase DBResult ¿para que le pasas la query? esa variable lo que contiene es el string con la consulta ¿cierto? y luego no lo usas en ningún lado ¿que utilidad tiene exactamente pasar ese dato?

Gracias nuevamente,

Saludos
__________________
Nadie es perfecto: los errores de los cocineros se tapan con mayonesa, los errores de los albañiles se tapan con cemento y los errores de los medicos se tapan con tierra.

Última edición por GatorV; 03/04/2009 a las 09:16
  #8 (permalink)  
Antiguo 03/04/2009, 09:18
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años, 7 meses
Puntos: 2135
Respuesta: Devolver datos de una consulta

En efecto, cada objeto debe de trabajar para lo que es su proposito, si es una capa de acceso a datos, pues solo se dedica a eso.

Por otro lado, lo que te deje era un ejemplo, simplemente no es una clase completa ni nada, es de un ejemplo que yo usaba y para mi era beneficioso saber a que consulta se referia un result en especifico para propositos de Loging, la idea era que vieras como encapsular un resultset en un objeto.

Saludos.
Atención: Estás leyendo un tema que no tiene actividad desde hace más de 6 MESES, te recomendamos abrir un Nuevo tema en lugar de responder al actual.
Respuesta




La zona horaria es GMT -6. Ahora son las 02:55.