Club Delphi  
    FTP   CCD     Buscar   Trucos   Trabajo   Foros

Retroceder   Foros Club Delphi > Bases de datos > MySQL
Registrarse FAQ Miembros Calendario Guía de estilo Temas de Hoy

Respuesta
 
Herramientas Buscar en Tema Desplegado
  #1  
Antiguo 04-04-2006
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Y ¿entonces por qué no seguir con esa idea?

Si observas el método load() verás que tiene dos partes: una que hace la consulta sql y otra que transfiere los datos de los resultados a la clase. Esta última parte la puedes separar en otro método:

Código PHP:
class Persona 

  var 
idnombretelefono

  function 
populate($result)
  {
    
$this->nombre $result['nombre']; 
    
$this->telefono $result['telefono']; 
  }

  function 
load(id
  { 
    
$statement "select * from personas where id =$id"
    
$results mysql_query($statement); 
    
$result mysql_fetch_assoc($results); 

    
$this->id $result['id'];
    
$this->populate($results);
  } 

Para listas de objetos puedes hacerte de otra clase:

Código PHP:
class ListaPersonas
{
  var 
$items;

  function 
ListaPersonas()
  {
    
$items = array();
  }

  function 
loadAll()
  {
    
$statement "select * from personas";
    
$results mysql_query($statement); 

    while (
$result mysql_fetch_assoc($results))
    {
      
$persona = new Persona();
      
$persona->id $result['id'];
      
$persona->populate($result);

      
$this->items[] = $persona;
    }
  }

Así, en $personas->items tendrás todas las personas con una sóla consulta sql. Al separar la consulta sql de la transferencia de datos, logras reutilizar esta última para llenar tu lista de persona obtenida de una sóla consulta.

Sin embargo esto en mi opinión aún no es óptimo. Normalmente requerirás recorrer este arreglo para procesarlo, por ejemplo para mostrarlo en la página:

Código PHP:
// Obtienes todas las personas
$personas = new ListaPersonas();
$personas->loadAll();

// Imprimes encabezado de la tabla
print "<table>";
print 
"<tr>";
print 
"<th>nombre</th>";
print 
"<th>telefono</th>";
print 
"</tr>";

foreach (
$personas->items as $persona)
{
  print 
"<tr>";
  print 
"<td>persona->nombre</td>";
  print 
"<td>persona->telefono</td>";
  print 
"</tr>";
}

print 
"</table>"
Pero entonces ya recorriste dos veces la lista de personas, una para formar el arreglo y otra para procesar éste. Además mantienes innecesariamente en memoria toda la lista de personas lo que puede no ser muy bueno para muchos registros.

Entonces, puedes optar por dejar que sea la misma clase ListaPersonas quien haga la iteración:

Código PHP:
class ListaPersonas
{
  var 
$results// resultados sql
  
var $persona// persona actual en la iteración 

  
function ListaPersonas()
  {
    
$this->persona = new Persona();
  }

  function 
loadAll()
  {
    
$statement "select * from personas";

    
// guardas los resultados para su posterior iteración
    
$this->results mysql_query($statement); 
  }

  
// Iterador
  // Devuelve la siguiente persona o false si no hay más personas
  
function next()
  {
    
$result mysql_fetch_assoc($this->results);
    if (
$result)
    {
      
$persona->id $result['id'];
      
$persona->populate($result);

      return 
$persona;
    }

    return 
false;
  }

Así, la construcción de la tabla te queda así:

Código PHP:
$personas = new ListaPersonas();
$personas->loadAll();

// Imprimes encabezado de la tabla
print "<table>";
print 
"<tr>";
print 
"<th>nombre</th>";
print 
"<th>telefono</th>";
print 
"</tr>";

while (
$persona $personas->next())
{
  print 
"<tr>";
  print 
"<td>persona->nombre</td>";
  print 
"<td>persona->telefono</td>";
  print 
"</tr>";
}

print 
"</table>"
El punto aquí, es que ahora sólo tienes un objeto Persona a la vez. Normalmente esto es suficiente: en un recorrido haces todo lo que haya que hacer con la persona en turno y te olvidas de la lista. Como te mencioné en algún otro hilo, al no estar trabajando con aplicaciones de escritorio, no tiene mucho objeto preservar la lista para otras cosas ya que al término del script ésta de cualquier manera dejará de existir.

Dime qué piensas y quizá podamos continuar las ideas.

// Saludos
Responder Con Cita
  #2  
Antiguo 04-04-2006
Avatar de dec
dec dec is offline
Moderador
 
Registrado: dic 2004
Ubicación: Alcobendas, Madrid, España
Posts: 13.114
Poder: 34
dec Tiene un aura espectaculardec Tiene un aura espectacular
Hola,

Bueno, Román, pues muchas gracias de nuevo. Efectivamente, yo había pensado ya en algo así como lo que has propuesto tú, lo que ocurre es que lo había hecho muy por encima, y, desde luego, no hubiera terminado haciéndolo como tú, sino de otra forma... quizá parecida, pero,... me permito dudarlo.

El caso es que he implementado el asunto tal y como has propuesto. Seguramente ese "iterador" de la clase "ListaPersonas" no hubiera llegado a existir, de haberlo dejado de mi cuenta... como poco habría hecho lo que tú has comentado: dos iteraciones. Me juego el cuello.

Gracias otra vez Román, de veras.
__________________
David Esperalta
www.decsoftutils.com
Responder Con Cita
  #3  
Antiguo 04-04-2006
Avatar de roman
roman roman is offline
Moderador
 
Registrado: may 2003
Ubicación: Ciudad de México
Posts: 20.269
Poder: 10
roman Es un diamante en brutoroman Es un diamante en brutoroman Es un diamante en bruto
Ahora lo que falta es hacer las clases Persona y ListaPersonas reusables. Lo único realmente específo de éstas es el nombre de la tabla y el mapeo para llenar las propiedades. Y así como tienes el método loadAll(), clases descendientes puedes declarar sus propios métodos para incluir criterios de búsqueda específicos, por ejemplo

Código PHP:
$personas->loadByNombre('%perez%');
$facturas->loadByCliente($clienteId); 
Si te interesa este tema puedes encontrar información buscando cosas como Data Access Objects, Value Objects, Business Objects, etc. en PHP.

// Saludos
Responder Con Cita
  #4  
Antiguo 04-04-2006
Avatar de Casimiro Notevi
Casimiro Notevi Casimiro Notevi is offline
Moderador
 
Registrado: sep 2004
Ubicación: En algún lugar.
Posts: 32.107
Poder: 10
Casimiro Notevi Tiene un aura espectacularCasimiro Notevi Tiene un aura espectacular
todos los días se aprende algo, hoy dormiré bien
Responder Con Cita
Respuesta



Normas de Publicación
no Puedes crear nuevos temas
no Puedes responder a temas
no Puedes adjuntar archivos
no Puedes editar tus mensajes

El código vB está habilitado
Las caritas están habilitado
Código [IMG] está habilitado
Código HTML está deshabilitado
Saltar a Foro

Temas Similares
Tema Autor Foro Respuestas Último mensaje
podrian explicarme que significa este error Nelly Varios 1 26-01-2006 17:46:18
Me podrian decir cual es el Error!! juliopag1 Firebird e Interbase 2 28-09-2005 13:57:07
mi podrian ayudar a instalar firebird 1.5 edy_aca Firebird e Interbase 6 25-09-2004 13:51:08
Me podrian explicar como se utlizan los indices Markoz Firebird e Interbase 2 23-07-2003 03:46:01
consultas SQL entre delphi y MySQL docarrillo SQL 1 03-07-2003 02:31:22


La franja horaria es GMT +2. Ahora son las 20:39:35.


Powered by vBulletin® Version 3.6.8
Copyright ©2000 - 2024, Jelsoft Enterprises Ltd.
Traducción al castellano por el equipo de moderadores del Club Delphi
Copyright 1996-2007 Club Delphi