Retroceder   Foros del Web > Programación para sitios web > PHP > PHP orientado a objetos

Respuesta
 
Herramientas Desplegado
Antiguo 21-abr-2007, 12:15   #1 (permalink)
zsamer tiene algunos puntos positivos de karma
 
Fecha de Ingreso: noviembre-2003
Mensajes: 786
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
zsamer está desconectado   Responder Citando
Antiguo 21-abr-2007, 14:42   #2 (permalink)
DarioDario está en el buen camino
 
Avatar de DarioDario
 
Fecha de Ingreso: junio-2005
Ubicación: Burzaco, Bs. As. Argentin
Mensajes: 981
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.
DarioDario está desconectado   Responder Citando
Antiguo 21-abr-2007, 16:56   #3 (permalink)
zsamer tiene algunos puntos positivos de karma
 
Fecha de Ingreso: noviembre-2003
Mensajes: 786
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
zsamer está desconectado   Responder Citando
Antiguo 21-abr-2007, 21:42   #4 (permalink)
DarioDario está en el buen camino
 
Avatar de DarioDario
 
Fecha de Ingreso: junio-2005
Ubicación: Burzaco, Bs. As. Argentin
Mensajes: 981
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.
DarioDario está desconectado   Responder Citando
Antiguo 22-abr-2007, 12:23   #5 (permalink)
zsamer tiene algunos puntos positivos de karma
 
Fecha de Ingreso: noviembre-2003
Mensajes: 786
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-abr-2007 a las 12:28.
zsamer está desconectado   Responder Citando
Antiguo 22-abr-2007, 13:14   #6 (permalink)
$this->role('moderador');
GatorV es realmente agradableGatorV es realmente agradableGatorV es realmente agradableGatorV es realmente agradableGatorV es realmente agradableGatorV es realmente agradable
 
Avatar de GatorV
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ags/
Mensajes: 13.961
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
      
}

__________________
Blog Web
GatorV está desconectado   Responder Citando
Antiguo 22-abr-2007, 14:37   #7 (permalink)
zsamer tiene algunos puntos positivos de karma
 
Fecha de Ingreso: noviembre-2003
Mensajes: 786
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
zsamer está desconectado   Responder Citando
Antiguo 23-abr-2007, 07:54   #8 (permalink)
$this->role('moderador');
GatorV es realmente agradableGatorV es realmente agradableGatorV es realmente agradableGatorV es realmente agradableGatorV es realmente agradableGatorV es realmente agradable
 
Avatar de GatorV
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ags/
Mensajes: 13.961
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

__________________
Blog Web
GatorV está desconectado   Responder Citando
Antiguo 23-abr-2007, 08:25   #9 (permalink)
zsamer tiene algunos puntos positivos de karma
 
Fecha de Ingreso: noviembre-2003
Mensajes: 786
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?
zsamer está desconectado   Responder Citando
Antiguo 23-abr-2007, 08:29   #10 (permalink)
$this->role('moderador');
GatorV es realmente agradableGatorV es realmente agradableGatorV es realmente agradableGatorV es realmente agradableGatorV es realmente agradableGatorV es realmente agradable
 
Avatar de GatorV
 
Fecha de Ingreso: mayo-2006
Ubicación: /home/ags/
Mensajes: 13.961
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.
__________________
Blog Web
GatorV está desconectado   Responder Citando
Antiguo 23-abr-2007, 08:48   #11 (permalink)
zsamer tiene algunos puntos positivos de karma
 
Fecha de Ingreso: noviembre-2003
Mensajes: 786
Re: Problema con class shopingCart y objeto Db

ok, mucho más claro.

muchas gracias maestro.

saludos.
zsamer está desconectado   Responder Citando
Respuesta

No hay votos aún.


Herramientas
Desplegado

Normas de Publicación
No puedes crear nuevos temas
No puedes responder temas
No puedes subir archivos adjuntos
No puedes editar tus mensajes

BB code is Activado
Caritas están Activado
[IMG] está Activado
Código HTML está Desactivado


La Zona horaria es GMT -6. Ahora son las 14:11.


Message Board Statistics

LinkBacks Enabled by vBSEO 3.1.0

1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93