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

Problema tras recuperar una instancia de una clase mediante la sesión.

Estas en el tema de Problema tras recuperar una instancia de una clase mediante la sesión. en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Hola a todos, llevo un par de días peleandome en busca de solución y aún no he logrado solucionar mi problema. Así que me he ...
  #1 (permalink)  
Antiguo 27/12/2008, 14:29
 
Fecha de Ingreso: diciembre-2008
Mensajes: 3
Antigüedad: 15 años, 4 meses
Puntos: 0
Problema tras recuperar una instancia de una clase mediante la sesión.

Hola a todos,

llevo un par de días peleandome en busca de solución y aún no he logrado solucionar mi problema. Así que me he decidio a compartirlo con vosotros a ver si alguién por fín me saca de este quebradero.

Dispongo de una clase 'clase_usuario' en cuyo constructor se realiza la conexion a la base de datos mediante PostreSQL.

Este es el constructor:
Código PHP:
function clase_usuario()
    {
        global 
$host,$db,$user,$pass;

        
$this->conexion pg_connect("host=".$host." dbname=".$db." user=".$user." password=".$pass);

        if(!
$this->conexion)
        {
            die(
"Imposible establer conexión con la base de datos." pg_last_error($this->conexion));
        }
    } 
Durante el proceso de login del usuario, creo el objeto usuario y guardo la instancia en la sesion. El problema viene cuando, desde otro archivo, recupero el objeto de la clase a través de la sesión e intento llamar a un método que ejecuta consultas a través de la función pg_query($this->conexion, $query). Devolviéndome errores de este tipo:

Warning: pg_query(): supplied argument is not a valid PostgreSQL link resource ...

No es problema de la recuperación del objeto porque otros métodos que no ejecutan consultas me funcionan perfectamente.

Es como si perdiera el valor del link de la conexión guardado en $this->conexion.

¿Alguna ayuda?

Gracias de antemano,

un saludo.
  #2 (permalink)  
Antiguo 27/12/2008, 15:55
 
Fecha de Ingreso: enero-2006
Ubicación: Buenos Aires, Argentina
Mensajes: 299
Antigüedad: 18 años, 3 meses
Puntos: 5
Respuesta: Problema tras recuperar una instancia de una clase mediante la sesión.

Hola,

Efectivamente, todo lo que sean "recursos" (como conexiones a bases de datos) se pierden al guardar un objeto en la sesión. Sólo se mantienen los datos del objeto, que se serializan automáticamente al guardar el objeto. La definición de los métodos, por ejemplo, tampoco se guarda, por lo que al recuperar el objeto de la sesión, el archivo que define la clase tiene que estar incluido o también te va a dar un error. (Más detallado: http://ar.php.net/manual/es/language...ialization.php)

Para solucionar el problema, tal vez podrías poner un método conectar que puedas llamar al recuperar el objeto. Algo así:


Código PHP:
public function __construct() {
     
$this->connect();
}

public function 
connect() {
    
$this->conexion pg_connect(etc);
    return 
$this-conexion;

Y desde el código que recupera el objeto:

Código PHP:
$obj $_SESSION['obj'];
$obj->connect();
$obj->algunaConsulta(); 
Otra posibilidad para mantener la misma "interfaz" y no forzar a los "clientes" de la clase a conectarse explícitamente, podría ser que el método conectar sea privado y se llame desde los otros métodos si la conexión está cerrada. Algo así:


Código PHP:
public function algunaConsulta() {
     if( (!
$this->conexion && $this->connect()) || $this->conexion ) {
          
//  no había conexión y logró conectarse 
          // o ya había conexión
          // hacer la consulta
     
} else {
         
// error, no había conexión y falló al intentar conectarse
     
}

Saludos
Juan Pablo Califano
  #3 (permalink)  
Antiguo 29/12/2008, 01:18
 
Fecha de Ingreso: octubre-2004
Mensajes: 2.627
Antigüedad: 19 años, 6 meses
Puntos: 48
Respuesta: Problema tras recuperar una instancia de una clase mediante la sesión.

http://www.php.net/manual/en/language.oop5.magic.php __sleep y __wakeup
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 06:41.