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

Problema con class shopingCart y objeto Db

Estas en el tema de Problema con class shopingCart y objeto Db en el foro de Frameworks y PHP orientado a objetos en Foros del Web. Hola, Estoy con un gran problema con la clase shopingCart , la cual tiene como propiedad o atributo el objeto de db . El punto ...
  #1 (permalink)  
Antiguo 21/04/2007, 12:15
 
Fecha de Ingreso: noviembre-2003
Mensajes: 798
Antigüedad: 20 años, 5 meses
Puntos: 8
Problema con class shopingCart y objeto Db

Hola,

Estoy con un gran problema con la clase shopingCart, la cual tiene como propiedad o atributo el objeto de db.

El punto es que para mantener el objeto shopingCart entre las páginas he tenido que usar sessiones (obligado). El gran problema es que objeto db que está dentro de la clase shopingCart(como atributo) pierde el link de la conección a la base de datos.
Como resultado muere la aplicación.

Código PHP:
if(isset($_SESSION["cart"]) && $_SESSION["cart"]!=''){ 
            
$cartunserialize($_SESSION["cart"]);
        } else { 
            
$cart= new shoppingCart($dbnull);  // $db objeto de abstracción base de dato
        

de esta forma se instancia la clase, luego de cada operacion:
Código PHP:
$cart->add_cart($quickievalues[0]['products_id'], 4'');
$_SESSION["cart"] = serialize($cart); 
alguna idea de porque muere el link de conección del objeto db?

cualquier ayuda muy agradecido.


saludos
  #2 (permalink)  
Antiguo 21/04/2007, 14:42
 
Fecha de Ingreso: junio-2005
Mensajes: 981
Antigüedad: 18 años, 10 meses
Puntos: 2
Re: Problema con class shopingCart y objeto Db

GatorV aquí explica algo sobre el tema. Aquí justo antes del ejemplo tienes un comentario que cito a continuación:
Cita:
Iniciado por PHP.net
El enlace al servidor sera cerrado tan pronto como la ejecución del script finalice, a menos que se cierre antes explícitamente llamando a mysql_close().
Puedes pensar en conexiones persistentes o en los métodos mágicos como lo recomienda GatorV.

Saludos.
  #3 (permalink)  
Antiguo 21/04/2007, 16:56
 
Fecha de Ingreso: noviembre-2003
Mensajes: 798
Antigüedad: 20 años, 5 meses
Puntos: 8
Re: Problema con class shopingCart y objeto Db

Dario, muchas gracias, es justo mi problema y lo que necesitaba saber. voy a investigar sobre el tema y les cuento como me fue.


salu2
  #4 (permalink)  
Antiguo 21/04/2007, 21:42
 
Fecha de Ingreso: junio-2005
Mensajes: 981
Antigüedad: 18 años, 10 meses
Puntos: 2
Re: Problema con class shopingCart y objeto Db

Cita:
Iniciado por zsamer Ver Mensaje
voy a investigar sobre el tema y les cuento como me fue.
Esa es la parte que mas me gusta

Saludos y suerte.
  #5 (permalink)  
Antiguo 22/04/2007, 12:23
 
Fecha de Ingreso: noviembre-2003
Mensajes: 798
Antigüedad: 20 años, 5 meses
Puntos: 8
Re: Problema con class shopingCart y objeto Db

no me fué muy bién, traté de implementarlo con los ejemplos de php.net pero no funcionó ,

alguien caritativo me podría mostrar un ejemplo de complementación de como usar __sleep y __wakeup para cerrar y abrir la conexion a la base de datos cuando se serialize y se reconstruya el objeto..

la clase carrito es de este estilo:

Código PHP:
class shoppingCart {
    private 
$db;
        private 
$basket_count;
        private 
$basket_item_id;
        private 
$basket_item_name;
        private 
$basket_item_quantity;
        private 
$basket_item_data;
        private 
$basket_item_price;
        private 
$basket_item_tax;
        private 
$basket_item_color;
        private 
$basket_item_size;

        public function 
__construct($db) {
        
$this->db $db;
                
$this->basket_count=0;
        }
        public function 
Add_Item($ID,$name,$quantity=1) {

                
$this->basket_item_id[$this->basket_count]=$ID;
                
$this->basket_item_name[$this->basket_count]=$name;
                
$this->basket_item_quantity[$this->basket_count]=$quantity;
                
$this->basket_count++;
                return (
$this->basket_count-1);
        }
        public function 
Del_Item($pos) {
                
$this->basket_item_id[$pos]='';
        }
        
        public function 
Get_Image(){
            
//query para obtener imagen del producto
        
}
        
        public function 
Get_Item_ID($pos) {
                return 
$this->basket_item_id[$pos];
        }


forma de uso :
Código PHP:
if(isset($_SESSION["cart"]) && $_SESSION["cart"]!=''){ 
            
$cartunserialize($_SESSION["cart"]);
        } else { 
            
$cart= new shoppingCart($db);  // $db objeto de abstracción base de dato
        

luego de cada operación agrego el objeto a la SESSION:
EJ:
Código PHP:
Código PHP:
$cart->add_cart($quickievalues[0]['products_id'], 4'');
$_SESSION["cart"] = serialize($cart); 

Última edición por zsamer; 22/04/2007 a las 12:28
  #6 (permalink)  
Antiguo 22/04/2007, 13: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 class shopingCart y objeto Db

Ok, si tienes tu objeto $db ya como miembro, dependiendo de los metodos que tenga puedes hacer algo asi:
Código PHP:
class ShoppingCart {
      public function 
__sleep() {
             
$db->disconnect(); // Cerramos la conexion
      
}

      public function 
__wakeup() {
             
$db->connect(); // Volvemos a conectar a la base de datos
      
}

  #7 (permalink)  
Antiguo 22/04/2007, 14:37
 
Fecha de Ingreso: noviembre-2003
Mensajes: 798
Antigüedad: 20 años, 5 meses
Puntos: 8
Re: Problema con class shopingCart y objeto Db

Gracias GatorV, pero no hubo caso, tengo esos métodos implementados en mi clase de base de datos connect() y disconnect(), pero al implementarlo de la forma de tu ejemplo mi objeto carro queda como null (se pierde todo).

como "momentaneo" opté por hacer lo siguiente:

Código PHP:
if(isset($_SESSION["cart"]) && $_SESSION["cart"]!=''){ 
            
$cartunserialize($_SESSION["cart"]);
           
$cart->addDbObject($db);
        } else { 
            
$cart= new shoppingCart($db);  // $db objeto de abstracción base de dato
        

funciona bien, pero me gustaría que quede hecho con los métodos mágicos:

Código PHP:
class ShoppingCart {
      public function 
__sleep() {
             
$db->disconnect(); // Cerramos la conexion
      
}

      public function 
__wakeup() {
             
$db->connect(); // Volvemos a conectar a la base de datos
      
}

Cualquier sugerencia estaría muy agradecido.
Mis metodos de connect() y disconnect() tiene la siguiente forma:

Código PHP:
// define MySQL class
class MySQL
{
/*--------------------------------*/
    // connect to database
    
public function connectDB()
    {
        if(!
$this->conId=mysql_connect($this->host,$this->user,$this->password))
        {
            throw new 
Exception('Error connecting to the server');
        }
        if(!
mysql_select_db($this->database,$this->conId))
        {
            throw new 
Exception('Error selecting database');
        }
    }

    function 
disconnect()
    {
        if(
$this->conId)
        {
            if(
$this->query_result)
            {
                @
mysql_free_result($this->query_result);
            } elseif (
$this->result){
                @
mysql_free_result($this->result);
            }
            
$result = @mysql_close($this->conId);
            return 
$result;
        }
        else
        {
            return 
false;
        }
    } 

Gracias y saludos

zsamer
  #8 (permalink)  
Antiguo 23/04/2007, 07:54
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 class shopingCart y objeto Db

Lo que te recomiendo es que en lugar de estar pasando el objeto por parametro, uses Singleton (asi inclusive usas solo 1 objeto) y no tienes el problema de estarlo pasando, creando, etc.

Asi solo usas tu objeto DB donde lo necesites en tu carrito de compra:

Código PHP:
public function addToCart$id ) {
      
$db DB::getInstance();
      
// Hacer algo con $db

  #9 (permalink)  
Antiguo 23/04/2007, 08:25
 
Fecha de Ingreso: noviembre-2003
Mensajes: 798
Antigüedad: 20 años, 5 meses
Puntos: 8
Re: Problema con class shopingCart y objeto Db

gracias, lo voy a implementar, y que opinas de usar el patron registry para almacenar el objeto db y luego recuperarlo?

cual es mejor?
  #10 (permalink)  
Antiguo 23/04/2007, 08:29
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 class shopingCart y objeto Db

Es buena idea, pero la ventaja de usar el Singleton en una clase como el acceso a la base de datos es mejor, ya que asi sabes que estas lidiando con una clase en todos tus metodos que la ocupen, aparte, no te tienes que preocupar de inicializarla y guardarla en el registro, te ahorras lineas de codigo si dejas que Singleton cheque si existe o no y la construya.
  #11 (permalink)  
Antiguo 23/04/2007, 08:48
 
Fecha de Ingreso: noviembre-2003
Mensajes: 798
Antigüedad: 20 años, 5 meses
Puntos: 8
Re: Problema con class shopingCart y objeto Db

ok, mucho más claro.

muchas gracias maestro.

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 10:07.