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

Problema con serialize o unserialize instancia PDO

Estas en el tema de Problema con serialize o unserialize instancia PDO en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Hola, cuando trato de serializar una instancia PDO me arroja la siguiente Exception: Código: You cannot serialize or unserialize PDO instances ¿es posible serialize o ...
  #1 (permalink)  
Antiguo 13/07/2007, 17:17
 
Fecha de Ingreso: noviembre-2003
Mensajes: 798
Antigüedad: 20 años, 5 meses
Puntos: 8
Problema con serialize o unserialize instancia PDO

Hola,

cuando trato de serializar una instancia PDO me arroja la siguiente Exception:

Código:
You cannot serialize or unserialize PDO instances
¿es posible serialize o unserialize instancia PDO?
  #2 (permalink)  
Antiguo 13/07/2007, 20: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
Re: Problema con serialize o unserialize instancia PDO

Por el error que te da no creo que sea posible, el manual no indica nada al respecto, yo creo lo que podrias hacer es extender la clase e implementar Serializable en tu clase que heredes:
Código PHP:
class DB extends PDO implements Serializable {



Saludos.
  #3 (permalink)  
Antiguo 14/07/2007, 01:26
 
Fecha de Ingreso: noviembre-2003
Mensajes: 798
Antigüedad: 20 años, 5 meses
Puntos: 8
Re: Problema con serialize o unserialize instancia PDO

hola GatorV,

Estuve probando pero no funciona.

los métodos abstractos de la interface Serializable los declaré de la siguiente forma

Código PHP:
        public function serialize(){
            return 
serialize($this);
        }
        public function 
unserialize($serialized){
            return 
unserialize($serialized);
        } 
cualquier idea se agradece.

salu2.
  #4 (permalink)  
Antiguo 14/07/2007, 12:14
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
Re: Problema con serialize o unserialize instancia PDO

Si ya implementaste los metodos creo entonces si la clase PDO no es serializable, ahora mi pregunta es, para que la quieres serializar?

La conexion a la base de datos se perdera de todas formas y aun asi tendrias que volver a conectar a la base de datos..

Saludos.
  #5 (permalink)  
Antiguo 14/07/2007, 13:34
 
Fecha de Ingreso: noviembre-2003
Mensajes: 798
Antigüedad: 20 años, 5 meses
Puntos: 8
Re: Problema con serialize o unserialize instancia PDO

Solo estaba jugando un poco con guardar el objeto serializado en un txt.

Ahora probé guardando la instancia PDO en una Session y funciona sin problema, mi duda es que al guardarlo en una session esta automáticamente se serialize u unserialize, ¿entonces no debería tirar la misma excepción?

gracias GatorV.


salu2
  #6 (permalink)  
Antiguo 14/07/2007, 15:59
 
Fecha de Ingreso: junio-2005
Mensajes: 981
Antigüedad: 18 años, 10 meses
Puntos: 2
Re: Problema con serialize o unserialize instancia PDO

Cita:
Iniciado por zsamer Ver Mensaje
Solo estaba jugando un poco con guardar el objeto serializado en un txt.

Ahora probé guardando la instancia PDO en una Session y funciona sin problema, mi duda es que al guardarlo en una session esta automáticamente se serialize u unserialize, ¿entonces no debería tirar la misma excepción?

gracias GatorV.


salu2
En teoría debería ser lo mismo y tendría que dar el mismo error. Tal vez estás haciendo algo mal, postea el código de cuando anda y cuando no, tal vez encontremos algún error.

Saludos.
  #7 (permalink)  
Antiguo 14/07/2007, 17:48
 
Fecha de Ingreso: noviembre-2003
Mensajes: 798
Antigüedad: 20 años, 5 meses
Puntos: 8
Re: Problema con serialize o unserialize instancia PDO

Un ejemplo re-simple.

Con sessiones, funciona sin problemas, salvo que al final de la pagina me arroga un error extraño.
Pareciera ser que el Exception es lanzado por el destructor de PDO, ya que se ejecuta al final.

¿será un bug?
Cita:
Fatal error: Exception thrown without a stack frame in Unknown on line 0
Código PHP:
session_start();  
$db = new PDO('mysql:host=localhost;dbname=sample','root','');
   
   
$_SESSION['db'] = $db;
   
$dbh $_SESSION['db'];
   
$stmn $db->prepare('SELECT * FROM usuarios');
   
$stmn->execute();
   
$result=$stmn->fetch(PDO::FETCH_ASSOC);
   
print_r($result); 

Serializando, lanza la excepción que mata la aplicacion al principio:
Cita:
You cannot serialize or unserialize PDO instances
Código PHP:
   $db = new PDO('mysql:host=localhost;dbname=sample','root','');
   
   
$_tempdb serialize($db);
   
$dbh unserialize($_tempdb);
   
$stmn $dbh->prepare('SELECT * FROM usuarios');
   
$stmn->execute();
   
$result=$stmn->fetch(PDO::FETCH_ASSOC);
   
print_r($result); 

Última edición por zsamer; 14/07/2007 a las 19:26
  #8 (permalink)  
Antiguo 14/07/2007, 22:21
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
Re: Problema con serialize o unserialize instancia PDO

Creo si ves hasta abajo de la funcion serialize:

Cita:
Iniciado por Manual de PHP.net
Notes

Note: It is not possible to serialize PHP built-in objects.
Ahora tu ejemplo de session te sirve a traves de paginas? porque si es en la misma pagina tu ejemplo es correcto ya que nunca se va a serializar el objeto si no hasta que termine de procesarse la pagina y se serialize la session.

Saludos.
  #9 (permalink)  
Antiguo 15/07/2007, 01:47
 
Fecha de Ingreso: noviembre-2003
Mensajes: 798
Antigüedad: 20 años, 5 meses
Puntos: 8
Re: Problema con serialize o unserialize instancia PDO

Gracias GatorV, que buen ojo tienes, no lo había visto.

Entonces el ejemplo quedaría así para que la session sirva a través de paginas:

Y segun el ejemplo NO es posible guardar una instancia PDO en una session:

Código PHP:
    if(isset($_SESSION["db"])){
        
$dbh $_SESSION["db"];
                die;
    } else {
        
$dbh = new PDO('mysql:host=localhost;dbname=sample','root','');
    }
   
   

   
   
$stmn $dbh->prepare('SELECT * FROM usuarios');
   
$stmn->execute();
   
$result=$stmn->fetch(PDO::FETCH_ASSOC);
   
print_r($result);
   
    if(!isset(
$_SESSION["db"])){
        
$_SESSION["db"] = $dbh;
    } 
Algo sucede que no se crea la session.

El tema es que tengo una clase cart, la cual es necesario que se guarde en una session para tenerla a trabes de las páginas.

Pero se me complica ya que dentro de esta clase tengo una instancia PDO, entonces al guardar el objeto carro en la session se serializa automáticamente y a su vez a la instancia PDO dentro de esta, esto me arroja la excepción y no se crea la session del carro.

Última edición por zsamer; 15/07/2007 a las 02:23
  #10 (permalink)  
Antiguo 15/07/2007, 12:05
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
Re: Problema con serialize o unserialize instancia PDO

Porque no separas de la clase Cart el acceso a la base de datos? o en su caso agrega metodos para cerrar la conexion y volver a crearla, algo asi:
Código PHP:
class Cart {
      public function 
__sleep() {
             
$this->dbh->close();
             
$this->dbh null;
      }

      public function 
__wakeup() {
             
$this->dbh = new PDO();
      }

Saludos.
  #11 (permalink)  
Antiguo 15/07/2007, 13:34
 
Fecha de Ingreso: noviembre-2003
Mensajes: 798
Antigüedad: 20 años, 5 meses
Puntos: 8
Re: Problema con serialize o unserialize instancia PDO

gracias GatorV, separas de la clase Cart el acceso a la base de datos no es posible ya que tengo métodos que hacen consultas.

Lo del sleep y wakeup muy buena y elegante solución, también se me había ocurrido lo siguiente:

Código PHP:
class Cart{
        public function 
addDbObject(PDO $db){
            
$this->db $db;
        }
        
        public function 
__destruct() {
            
$this->db null;
            if (isset(
$_SESSION["cart"])) { 
                unset(
$_SESSION["cart"]);
            }
            
$_SESSION["cart"] = $this;
        }
}

    if(isset(
$_SESSION["cart"]) && $_SESSION["cart"]!=''){ 
        
$cart $_SESSION["cart"];
        
$cart->addDbObject($db);
    } else { 
        
$cart = new Basket($db); 
    } 
Gracias y saludos.

Última edición por zsamer; 15/07/2007 a las 13:55
  #12 (permalink)  
Antiguo 15/07/2007, 14:10
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
Re: Problema con serialize o unserialize instancia PDO

Tambien es una buena opcion aunque te recomendaria optar __wakeup y __sleep porque asi no estas atado a que el objeto siempre se llame igual en la session si no que le das independencia al objeto.

Saludos.
  #13 (permalink)  
Antiguo 15/07/2007, 14:47
 
Fecha de Ingreso: noviembre-2003
Mensajes: 798
Antigüedad: 20 años, 5 meses
Puntos: 8
Re: Problema con serialize o unserialize instancia PDO

Gracias GatorV, optaré por
Código PHP:
__wakeup y __sleep 
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 11:04.