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

Mi clase no reconoce el ultimo registro ingresado

Estas en el tema de Mi clase no reconoce el ultimo registro ingresado en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Antecedentes: Bueno, tengo una clase llamada reuniones. Esta clase me guarda unos arrays, que se van llenando a medida que el usuario va seleccionando una ...
  #1 (permalink)  
Antiguo 16/06/2008, 00:19
 
Fecha de Ingreso: mayo-2008
Mensajes: 40
Antigüedad: 16 años
Puntos: 3
Pregunta Mi clase no reconoce el ultimo registro ingresado

Antecedentes:

Bueno, tengo una clase llamada reuniones. Esta clase me guarda unos arrays, que se van llenando a medida que el usuario va seleccionando una serie de personas que estan en una tabla.

Al hacer click sobre una persona, se va a una función PHP, que llama a su vez a la clase.

La clase se encuentra en el fichero clase.php y la funcion esta en cuerpo.php

Además, agrego unos datos a modo de prueba al iniciar cuerpo.php

Estoy usando el framework XAJAX, por eso que puedo hacer una llamada a una funcion PHP desde HTML (no me muevan de este foro, pues la pregunta esta relacionada mas con POO a XAJAX)

Problema:

Bueno, al hacer click sobre una persona, envio los parametros necesarios, se hace la consulta sql (comprobado), agrego los resultados a los arrays de la clase. Despues desde esa misma función, leo los arrays con el metodo getEncargados(), pero solo me lee los datos de prueba que coloque, más el último registro que ingrese.

Es decir, si hay una lista de 5 personas, y el usuario hace click en los 5, solo muestra los datos de prueba más el último elemento donde se hizo click.

Se me imagina que el problema ocurre, dado que utilizo la clase dentro una función php, mientras que la clase esta definida en el "encabezado". Pero si declaro la clase dentro de la función, cada vez que se llame a la función estaré generando una nueva instancia de la clase... y por consiguiente, los datos no se guardaran en el array... creo xD

En fin, si pudieran echarme una manito en este tema, se los agradecré muchísimo.

Les dejo el código fuente.

Saludos!

Código PHP:
<?php
    
    
class reuniones{        
        var 
$codigos = array();
        var 
$telefonos = array();
        var 
$emails = array();
        var 
$nombres = array();
        var 
$a;

        function 
addEncargado($cod_encargado$telefono$email$nombre){
            
            
array_push($this->codigos$cod_encargado);
            
array_push($this->telefonos$telefono);
            
array_push($this->emails$email);
            
array_push($this->nombres$nombre);
            
/*
            $this->codigos[] = $cod_encargado;
            $this->telefonos[] = $telefono;
            $this->emails[] = $email;
            $this->nombres[] = $nombre;
            */
        
}

        function 
removeEncargado($cod_encargado){
            
$j=0;
            foreach(
$this->codigos as $cod){    
                if(
$cod == $cod_encargado){
                    
array_splice($this->codigos$j$j);
                    
array_splice($this->telefonos$j$j);
                    
array_splice($this->emails$j$j);
                    
array_splice($this->nombres$j$j);
                }
                
$j++;
            }
        }

        function 
getEncargados(){
            
$cod .= "<table border=3>";
            
$cod .= "<tr>";
            
$cod .= "<td>Nombre</td><td>Codigo Encargado</td><td>Teléfonos</td><td>Emails</td>";
            foreach(
$this->codigos as $valor){
                
$cod .= "<tr>";
                
$cod .= "<td>" current($this->nombres) . "</td>";
                
$cod .= "<td>" $valor "</td>";
                
$cod .= "<td>" current($this->telefonos) . "</td>";
                
$cod .= "<td>" current($this->emails) . "</td>";                
                
$cod .= "</tr>";
                
next($this->emails);
                
next($this->nombres);
                
next($this->telefonos);
            } 
            
$cod .= "</table>";
            return 
$cod;
        }
        

        
    } 
//Fin clase
Código PHP:
     require('clase.php');
    
//instanciamos la clase reuniones
    
$clase_reuniones = new reuniones();
    
$clase_reuniones->addEncargado("100","telefono1","email1","nombre1");
    
$clase_reuniones->addEncargado("101","telefono2","email2","nombre2");
    
$clase_reuniones->addEncargado("102","telefono3","email3","nombre3");
    
$clase_reuniones->addEncargado("103","telefono4","email4","nombre4"); 


Código PHP:
//Desde esta funcion llamo a la clase que ingresa los datos a la clase
// CUERPO.PHP

function agregar_miembro($rut){
        
$sql "SELECT * from viewTrabajadores where rut='" $rut "'";
    
$consulta ejecutar_sql($sql);
    
$row mysql_fetch_array($consulta);
    
    static 
$clase_reuniones;
    
$clase_reuniones $GLOBALS["clase_reuniones"];
    
    
$clase_reuniones->addEncargado$row['rut'], $row['telefono'], $row['email'], $row['nombre'] );    
    
$tabla_seleccionados $clase_reuniones->getEncargados();

        echo 
$tabla_seleccionados;

?>
  #2 (permalink)  
Antiguo 16/06/2008, 08:39
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Mi clase no reconoce el ultimo registro ingresado

Hola Wuakap,

Recuerda varias cosas:
1.- PHP es un lenguaje "stateless" es decir no hay persistencia nativa de datos entre requests, a menos que uses sesiones, pero implícitamente debes de utilizarlas.
2.- Aunque uses o no uses AJAX, a la hora de hacer la petición asíncrona se crea un nuevo request, por lo que debes de iniciar la clase FORZOSAMENTE, y debes de implementar un medio persistente para almacenar los datos, ya sea una sesión, una base de datos, un archivo de texto plano, etc.

Saludos.
  #3 (permalink)  
Antiguo 16/06/2008, 11:35
 
Fecha de Ingreso: mayo-2008
Mensajes: 40
Antigüedad: 16 años
Puntos: 3
Respuesta: Mi clase no reconoce el ultimo registro ingresado

Primero que nada, muchas gracias por tu respuesta GatorV.

Bueno, la verdad es que no soy un experto en PHP y mucho menos en POO. La clase la cree exclusivamente para no usar arreglos globales, y llegue a un camino sin salida.

La verdad es que no quiero guardar directamente a la BD, dado que mi idea es que los arrays de la clase, cuando sean la decisión definitiva del usuario, ingresarla a la base de datos. Con respecto a las sesiones, pues pretendia usar la menor cantidad de datos globales. Eso solo me deja solo la opcion de texto plano. El problema es que no se como hacer eso.

Si alguien sabe como hacer eso, o si conoce algún "truco" para poder hacer funcionar mi clase, pues se lo agradeceré mucho.

Es que es muy extraño, dado que al usar la clase dentro de la función, me reconoce la instanciación (no se si existe esta palabra xD ). Esto se demuestra a que imprime los datos de prueba que ingreso.

En fin, espero algo de ayuda. Muchas gracias desde ya.

Atte Vladimir Venegas
  #4 (permalink)  
Antiguo 16/06/2008, 11:44
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Mi clase no reconoce el ultimo registro ingresado

Hola Wuakap,

Como te comento no hay ningún "truco" debes FORZOSAMENTE usar un medio persistente ya que es la naturaleza de PHP, te recomiendo usar sesiones ya que puedes guardar tu objeto en la sesión directamente, y así recuperarlo desde tu función en AJAX, recuerda solamente que antes de iniciar la sesión debes de incluir la definición de la clase.

Saludos.
  #5 (permalink)  
Antiguo 16/06/2008, 12:47
 
Fecha de Ingreso: mayo-2008
Mensajes: 40
Antigüedad: 16 años
Puntos: 3
Respuesta: Mi clase no reconoce el ultimo registro ingresado

Nuevamente muchas gracias por tu respuesta. Quisiera saber si el codigo que anexo a continuación, podría solucionar mi problema. No soy un gran entendido en PHP. Estoy trabajando en mi primer "gran proyecto", asi que mis disculpas si consideran que mi pregunta carece de fundamentos.

Bueno, muchas gracias por todo.

Atte Vladimir Venegas V.

Código PHP:

function datos_por_session($rut){
     
//consultas sql

     //Agrego el objeto al array de objetos en la session
     
$_SESSION['objetos'][] = new objObjeto("data1""data2""dataN");

  #6 (permalink)  
Antiguo 16/06/2008, 14:23
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Mi clase no reconoce el ultimo registro ingresado

Hola Wuakap,

Si te podría ayudar, pero yo creo debes de definir correctamente que es lo que vas a hacer y como lo vas a guardar antes de ponerte a "parchar" las cosas.

Saludos.
  #7 (permalink)  
Antiguo 16/06/2008, 14:56
 
Fecha de Ingreso: mayo-2008
Mensajes: 40
Antigüedad: 16 años
Puntos: 3
Respuesta: Mi clase no reconoce el ultimo registro ingresado

Tengo claro lo que quiero hacer. En mi clase guardaré los datos de la persona, como nombre, rut, etc; los cuales los saco de una base de dato. Estos datos me generan un objeto. Ahora, como pueden ser varias personas, necesito varios objetos. En la funcion datos_por_sesion($rut), creo una nueva instanciación de la clase, y esa instanciación la quiero guardar en un array de objetos en una sesion, para que pueda ser vista desde cualquier parte que haya iniciado sesion.

Por lo que estuve viendo, necesio serializar el objeto, y luego guardarlo en $_SESSION['obj']. Pero por mas que trato, no logro solucionar este tema.

Y tamposo se si se pueda hacer eso, de guardar un vector de objetos en una variable de sesion.

La verdad es que necesito algún ejemplo sencillo para este caso.

Código PHP:

    
class personas{        
        var 
$rut;
        var 
$nombre;
        var 
$apellido;
        var 
$telefono;
        var 
$email;
        
        function 
__construct($rut$nombre$apellido$telefono$email){
            
$this->rut $rut;
            
$this->nombre $nombre;
            
$this->apellido $apellido;
            
$this->telefono $telefono;
            
$this->email $email;
        }
        
        
        function 
getEncargados(){
            
$cod .= "<tr>";
            
$cod .= "<td>" $this->rut "</td>";
            
$cod .= "<td>" $this->nombre "</td>";
            
$cod .= "<td>" $this->telefono "</td>";
            
$cod .= "<td>" $this->email "</td>";                
            
$cod .= "</tr>";                
            return 
$cod;
        }        
                
    } 
//Fin clase 
Código PHP:

require('clase.php');
$_SESSION['obj'] = array();

function 
datos_por_sesion($rut){
     
//consultas SQL y obtengo datos de la persona

     
$asd = new reuniones($rut$nombre$apellido$telefono$email);
     
$_SESSION['obj'] = $asd;
    

  #8 (permalink)  
Antiguo 16/06/2008, 15:19
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Mi clase no reconoce el ultimo registro ingresado

Hola Wuakap,

No es necesario serializar los objetos en la sesión, perfectamente los puedes agregar directamente, siempre y cuando antes de iniciar sesión definas la clase.

En tu ejemplo solo estas guardando una instancia, ya que debes de agregarla:
Código PHP:
require('clase.php');
if( !isset( 
$_SESSION['obj'] ) ) {
       
$_SESSION['obj'] = array();
}

function 
datos_por_sesion($rut){
     
//consultas SQL y obtengo datos de la persona

     
$asd = new reuniones($rut$nombre$apellido$telefono$email);
     
$_SESSION['obj'][] = $asd;
    

Saludos.
  #9 (permalink)  
Antiguo 17/06/2008, 13:19
 
Fecha de Ingreso: mayo-2008
Mensajes: 40
Antigüedad: 16 años
Puntos: 3
Respuesta: Mi clase no reconoce el ultimo registro ingresado

No se por que, pero esto no me resulta en una función XAJAX. Ante esta situación, se me ocurrió crear otra pagina llamada test.php bien sencilla. Inicio sesion, y hago el ciclo foreach, y si me funciona. Veo todos los valores ingresados en la otra página.

Es decir, el array de objetos por $_SESSION['obj'] funciona.
En la función xajax ingreso los datos y si funciona
Desde una página diferente, reviso el array de objetos que estan en sesion a modo de prueba y si funcionan
Desde la funcion xajax NO puedo acceder a los métodos del objeto

Pero lo más extraño de todo, es que en el la funcion xajax coloco este codigo, si funciona:
Código PHP:
$persona = new personas($rut,$nombre,$apellido,$telefono,$email);
$_SESSION['obj'] = $persona;
$i=0;
foreach (
$_SESSION['obj'] as $objeto){    
        
$cod .= $i "-";
                
$i++;
                }
//Estas dos lineas es el equivalente a decir echo $cod;
$respuesta->addAssign("capa","innerHTML",$cod);
return 
$respuesta
Este codigo en la funcion xajax no funciona
Código PHP:
$persona = new personas($rut,$nombre,$apellido,$telefono,$email);
$_SESSION['obj'] = $persona;

foreach (
$_SESSION['obj'] as $objeto){    
        
$tabla_seleccionados $objeto->getEncargados();
                } 
Esta funcion en test.php si funciona
Código PHP:
session_start();
foreach (
$_SESSION['obj'] as $objeto){    
        
$tabla_seleccionados $objeto->getEncargados();
                } 
Alguna idea??
  #10 (permalink)  
Antiguo 17/06/2008, 15:46
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Mi clase no reconoce el ultimo registro ingresado

Mmm no veo que llames a session_start() en tu función xajax.

Saludos.
  #11 (permalink)  
Antiguo 17/06/2008, 16:08
 
Fecha de Ingreso: mayo-2008
Mensajes: 40
Antigüedad: 16 años
Puntos: 3
Respuesta: Mi clase no reconoce el ultimo registro ingresado

Haber, lo que pasa es que tengo cerca de 1.000 lineas en el cuerpo.php. Asi que me veo en la obligacion de filtrar el codigo. Si, esta el session_start().

La verdad es que ahora creo que es un problema de xajax, dado que despues de mucho y mucho probar, ni siquiera puedo guardar un array en una variable de sesion. Me refiero a un array básico, que guarda valores enteros. Y aun así, solo almacena el ultimo valor.

No soy un gran entendido de PHP, pero creo que un motivo para esta falla, es que la página nunca se refresca de forma completa. Tengo la pagina dividida en dos div. Uno para el menu, y otro para el cuerpo.

Quizás ese es el motivo por el cual no me funciona guardar los datos de esta manera... dado que como dije, el codigo anterior si me funciono en una pagina distinta.

Bueno, creo que el tema trataré de resolverlo utilizando ficheros con fopen(), implode() y explode(). Para trabajar este tema de esta manera, se necesita alguna configuración especial en el php.ini?

Bueno, muchas gracias por la ayuda recibida ^^.

Saludos!
  #12 (permalink)  
Antiguo 17/06/2008, 17:06
Avatar de GatorV
$this->role('moderador');
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ams/
Mensajes: 38.567
Antigüedad: 18 años
Puntos: 2135
Respuesta: Mi clase no reconoce el ultimo registro ingresado

Código PHP:
$_SESSION['obj'] = $persona
Ese código siempre te va a almacenar el ultimo, como te comente debes de usar:
Código PHP:
$_SESSION['obj'][] = $persona// Obviamente $_SESSION['obj'] debe de ser un array 
Saludos.
  #13 (permalink)  
Antiguo 17/06/2008, 18:04
Avatar de enriqueplace  
Fecha de Ingreso: mayo-2005
Ubicación: Uruguay / Argentina
Mensajes: 1.102
Antigüedad: 19 años
Puntos: 32
Respuesta: Mi clase no reconoce el ultimo registro ingresado

Estimado, un comentario:

¿No será justamente esta parte del código la raiz del problema?

"No soy un gran entendido de PHP"

No digo con esto que hay que ser experto, pero considero que muchas de las fallas que estás teniendo son conceptuales, y tratar de volar un avión sin un curso antes o haber leído siquiera el manual de vuelo... justamente, es parte del problema.

Imagínate todos los errores que vas a cometer por no tener los conceptos claros.

PD: es una crítica constructiva.
__________________
Blog phpsenior.com Cursos a Distancia surforce.com
  #14 (permalink)  
Antiguo 17/06/2008, 20:29
 
Fecha de Ingreso: mayo-2008
Mensajes: 40
Antigüedad: 16 años
Puntos: 3
Respuesta: Mi clase no reconoce el ultimo registro ingresado

Estimado enriqueplace. La verdad es que tienes toda la razon. Estoy seguro que otra persona haria funcionar este tema. La verdad es que este es mi primer proyecto "comerciable", y mi primer proyecto en php... asi que efectivamente muchos de los errores que me han carcomido, han sido 100% evitables.

De todas formas, el error que me citaron, fue error tipográfico.

Código PHP:
$_SESSION['rut'][] = $persona
Y traté de hacer un array simple basado en sesiones, y tampoco me resulto. Se me imagina que para que eso funcione, se debe recargar la pagina PHP, para que se actualizen los valores en el servidor. Pero mi página no se recarga nunca... y se esta llamando desde una funcion XAJAX, que en si es un método de la clase XAJAX... pienso que eso puede influir en el correcto funcionamiento.

De todas formas, ya solucioné el problema, usando un fichero .txt, y con implode() y explode().

Solo me resta agradecer su apoyo, dado que estoy consiente que son personas con deberes igual que todos nosotros, y se dan el tiempo de ayudar, dentro de sus posibilidades, a quienes lo necesitan.

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 20:16.