Foros del Web » Programando para Internet » PHP »

[SOLUCIONADO] Sesiones como invitado

Estas en el tema de Sesiones como invitado en el foro de PHP en Foros del Web. Buenas a todos. Estoy desarrollando un carro de compra y a la hora de añadir productos, etc en el carro como usuario registrado muy bién, ...
  #1 (permalink)  
Antiguo 08/07/2016, 03:13
Avatar de MaNuX0218  
Fecha de Ingreso: marzo-2014
Mensajes: 787
Antigüedad: 10 años, 1 mes
Puntos: 67
Sesiones como invitado

Buenas a todos.

Estoy desarrollando un carro de compra y a la hora de añadir productos, etc en el carro como usuario registrado muy bién, pero lo que quiero es que cuando no este registrado ni logeado se puede asignar una sesion o cookie como se requiera mejor como invitado/anónimo para que pueda añadir cosas al carro y realizar el pedido sin registrase ni logearse.

Espero se entienda lo que intento, me gustaría saber al menos como podría empezar para implementarlo.

Saludos.
  #2 (permalink)  
Antiguo 08/07/2016, 06:06
Avatar de gogupe  
Fecha de Ingreso: octubre-2006
Ubicación: Mallorca
Mensajes: 897
Antigüedad: 17 años, 6 meses
Puntos: 32
Respuesta: Sesiones como invitado

Podrias empezar haciendo una cookie o variable de sesión llamada "cesta", que servirá tanto si es cliente como si no.

Cuando llegue la hora de pagar, tan solo tiene que comprobar que haya una sesión iniciada, con otra cookie o variable de sesion, ejemplo "login".

Acto seguido, vincula la cesta con el login para crear la compra.

¿Lo entendiste?
__________________
Somos una serie de acontecimiento que puede venir al caso en un momento dado.
  #3 (permalink)  
Antiguo 09/07/2016, 01:40
Avatar de manuparquegiralda  
Fecha de Ingreso: junio-2012
Ubicación: Barcelona
Mensajes: 241
Antigüedad: 11 años, 9 meses
Puntos: 39
Respuesta: Sesiones como invitado

Yo lo que hago cuando diseño una tienda online para algún cliente es vincular la cesta a una cookie en el PC y a un usuario en el caso de que esté registrado. El procedimiento que sigo es el siguiente:

Al ingresar un usuario en la tienda online asigno una cookie llamada "cesta" y como valor le pongo un ID. Cuando el usuario agrega un producto lo guardo en la base de datos que tiene entre otros campos: id, (va vinvulada a la cookie del PC del usuario pero no es un campo único en la BD) y otro campo id_user que va vinculado al usuario, después los campos donde se guardan los productos, fecha, etc... para poder administrar bien la cesta.

De esta forma, cuando varios usuarios manejan el mismo PC y compran en la tienda cada uno tiene su cesta y si no están registrados se usa un global, no sé si me explico bien.

EL USUARIO INGRESA --> Se asigna una cookie con ID.
SE AÑADE UN PRODUCTO --> Guardo la cesta en la BD con el ID de la cookie
EL USUARIO SE REGISTRA --> Se le asigna el id de usuario a la cesta en la BD
ENTRAN DE NUEVO SIN LOGUEARSE Y AÑADEN PRODUCTO --> Creo cesta paralela con el ID de la cookie sin el id de usuario
SI SE CREA UN NUEVO REGISTRO --> Le asigno el ID a la nueva cesta
SI SE LOGUEA --> Miro si tiene una cesta guardada en cuyo caso la sustituyo y si no creo una nueva en la BD.
SI ENTRA DE NUEVO Y SE LOGUEA --> Compruebo que tenga cesta y uso esa.

Cuestra trabajo explicar, en fin, juego con todas las variables posibles para que varios usuarios desde el mismo PC tengan sus cestas independientes vinculadas a una sola cookie en el PC.

De todas formas no es necesario vincular la cesta de la compra a un usuario forzosamente, en principio van por separado y cuando el cliente hace el pedido como dice Gogupe, pues se utiliza su cesta y sus datos de usuario para procesar el pedido.

Lo que sí te aconsejo como buena práctica es guardar la cesta en una base de datos, de esta manera, tu como administrador de la tienda podrás tener acceso a la cesta del usuario en caso de que éste necesite de tu ayuda o surja alguna complicación. Sé que es algo obvio, pero he visto de todo, desde guardar los productos en una cookie serializados o en el localStorage hasta guardarlos en una variable de SESSION la cual se pierde al cerrar el navegador o según la configuración del servidor.
__________________
Diseño Web - Arisman Web
  #4 (permalink)  
Antiguo 09/07/2016, 02:17
Avatar de MaNuX0218  
Fecha de Ingreso: marzo-2014
Mensajes: 787
Antigüedad: 10 años, 1 mes
Puntos: 67
Respuesta: Sesiones como invitado

Gracias manuparquegiralda, queda claro lo que me explicas, sobre guardarlo en la DB lo ago en todo momento y lo de asignar una sesión, cookie o localStorage al invitado lo he echo y si se registra le sustituyo su id de invitado por su id de usuario, pero el problema viene que cuando realizo eso los productos se me clonan, vamos que no consigo tenerlo independientes hasta que se registra, por que una vez registrado no hay problema.

Me podrias mostrar algun ejemplo de codigo sencillo de como asignar por ejemplo de cookie al invitado y despues comparar si es invitado o intenta registrarse?

Saludos y gracias.
  #5 (permalink)  
Antiguo 09/07/2016, 04:03
Avatar de Synkronice  
Fecha de Ingreso: octubre-2007
Ubicación: Madrid
Mensajes: 831
Antigüedad: 16 años, 6 meses
Puntos: 48
Pregunta Respuesta: Sesiones como invitado

Cita:
Iniciado por MaNuX0218 Ver Mensaje
Buenas a todos.

Estoy desarrollando un carro de compra y a la hora de añadir productos, etc en el carro como usuario registrado muy bién, pero lo que quiero es que cuando no este registrado ni logeado se puede asignar una sesion o cookie como se requiera mejor como invitado/anónimo para que pueda añadir cosas al carro y realizar el pedido sin registrase ni logearse.

Espero se entienda lo que intento, me gustaría saber al menos como podría empezar para implementarlo.

Saludos.
Hola MaNuX0218,

para intentar ayudarte necesitaria saber como añades los productos al carro en el caso de los usuarios registrados, ya que según dices en este caso funciona a la perfeccion.

Saludos.
__________________
El problema de nuestra época consiste en que sus hombres no quieren ser útiles sino importantes.

Winston Churchill
  #6 (permalink)  
Antiguo 09/07/2016, 04:16
Avatar de MaNuX0218  
Fecha de Ingreso: marzo-2014
Mensajes: 787
Antigüedad: 10 años, 1 mes
Puntos: 67
Respuesta: Sesiones como invitado

Cita:
Iniciado por Synkronice Ver Mensaje
Hola MaNuX0218,

para intentar ayudarte necesitaria saber como añades los productos al carro en el caso de los usuarios registrados, ya que según dices en este caso funciona a la perfeccion.

Saludos.
De momento simplemente lo añado a la DB al hace clic al alguno, lo de mostrarlo en el carro es lo que quiero según si es invitado o si ha iniciado sesion, por lo que tengo es esto de momento:

Código PHP:
Ver original
  1. INSERT INTO cart (user_id, product_id, date) VALUES (?, ?, ?)

El campo user_id de momento lo inserto vacio ya que es lo que necesito hacer y una vez añadido comparar si el user_id es invitado o registrado y mostrarlo en carro.

Saludos.
  #7 (permalink)  
Antiguo 09/07/2016, 04:25
Avatar de Synkronice  
Fecha de Ingreso: octubre-2007
Ubicación: Madrid
Mensajes: 831
Antigüedad: 16 años, 6 meses
Puntos: 48
Información Respuesta: Sesiones como invitado

Hola MaNuX0218,

desde mi punto de vista ese es el problema. Creo que deberias plantearlo de otra forma. Mi propuesta es que uses solo variables de sesion para agregar los productos a la cesta y solo agregues los productos a la base de datos cuando se formalice un pedido.

Si lo haces de la forma que te propongo ya no tendras que preocuparte si el usuario esta registrado o no ya que para todos los usuarios esten o no logados en el sistema la forma de manipular los productos en la cesta sera exactamente igual.

Saludos y ya nos contaras que tal fue todo.
__________________
El problema de nuestra época consiste en que sus hombres no quieren ser útiles sino importantes.

Winston Churchill
  #8 (permalink)  
Antiguo 09/07/2016, 04:47
Avatar de MaNuX0218  
Fecha de Ingreso: marzo-2014
Mensajes: 787
Antigüedad: 10 años, 1 mes
Puntos: 67
Respuesta: Sesiones como invitado

Gracias Synkronice por tu respuesta.

De momento todo me va como quiero, alfinal lo que hice creo que es como me acabas de comentar.

He creado un array guardando el producto(id, nombre, precio... etc) cuando lo añaden al carro y con ese mismo array lo muestro sin estar logeado, pero si intenta logearse lo que ago es compruebo si ese array no esta vacio se lo asigno a ese usuario, de momento lo estoy haciendo así y de momento va bien la cosa.

Un saludo.
__________________
No te preocupes si tu código no funciona bien. Si todo lo hiciera, no tendrías trabajo.
  #9 (permalink)  
Antiguo 09/07/2016, 12:11
Avatar de manuparquegiralda  
Fecha de Ingreso: junio-2012
Ubicación: Barcelona
Mensajes: 241
Antigüedad: 11 años, 9 meses
Puntos: 39
Respuesta: Sesiones como invitado

A ver, si es muy simple en realidad, son necesarias tres tablas en la BD para manejar el carrito y los pedidos.

TABLA CESTA

Con cuatro campos como mínimo: "ID", "ID_USER", "OBJ_PEDIDO", "FECHA". Como esta tabla solo la relacionas con los campos ID e ID_USER, en el campo OBJ_PEDIDO lo que hago es guardar una clase PHP serializada con todos los datos del carrito y los productos.

TABLA PEDIDOS

En la tabla pedido guardo todos los datos del pedido: "REF", "ID_USER", "ESTADO", "PORTES_CLIENTE", "PORTES_EMPRESA", "EMPRESA_TRANSPORTE", "COD_SEGUIMIENTO", "MODO_PAGO", "COMISION_BANCO", "DESC_CUPON", "DESC_PUNTOS", "DESC_SORTEO", "DESC_MANUAL", "FECHA", "NOMBRE", "FECHA_NAC", "DNI", "EMAIL", "TELEFONO", "DIRECCION", "LOCALIDAD"... en fin, todos los datos que necesites para tratar los pedidos y sacar estadísticas de la base de datos

TABLA VENDIDOS

En esta tabla guardas uno a uno todos los productos vendidos, relacionados con los pedidos y los usuarios: "ID", "REF_PRODUCTO", "REF_PEDIDO", "ID_USER", "COSTE", "IVA", "PVP", "CANTIDAD", "TALLA", "COLOR", "SABOR", "FECHA", "HORA".

------------------------------------------------------------------------------------------

Creas dos clases PHP, una llamada Cesta y otra llamada Producto_cesta . En la clase cesta al menos una propiedad que sea una array donde se irán guardando en cada valor un producto determinado en la clase Producto_cesta, de esta manera en la cesta guardas todos los datos de cada producto y la cantidad que compra, el color, la talla... todos los datos que necesites del producto.

Código PHP:
Ver original
  1. class Producto_cesta {
  2.     public $ref;
  3.     public $nombre;
  4.     public $color;
  5.     public $talla;
  6.     public $sabor;
  7.     public $cantidad;
  8.     public $coste;
  9.     public $iva;
  10.     public $pvp;
  11.     public $img_thumb;
  12.     /* .......... TODOS LOS DATOS QUE NECESITES ......... */
  13. }
  14.  
  15. class Cesta extends Producto_cesta{
  16.     public $productos = array();
  17.     public $id;
  18.     public $id_user;
  19.     public $puntos_fidelidad;
  20.     public $descuento_puntos;
  21.     public $invitado;
  22.     /* .......... TODOS LOS DATOS QUE NECESITES ........ */
  23.  
  24.  
  25.    public function add_producto($ref_producto){
  26.        /*
  27.        OPERACIONES NECESARIAS PARA AGREGAR UN PRODUCTO A LA CESTA
  28.  
  29.        Cada producto tendrá todos los datos en la clase Producto_cesta que se guaradará en un valor del array $productos
  30.        */
  31.    }
  32.  
  33.    public function rem_producto($ref_producto){
  34.        /* OPERACIONES NECESARIAS PARA QUITAR UN PRODUCTO A LA CESTA */
  35.    }
  36.  
  37.    public function total_productos(){
  38.        /* OPERACIONES NECESARIAS PARA CALCULAR TODOS LOS PRODUCTOS QUE HAY EN LA CESTA */
  39.    }
  40.  
  41.    public function calc_total(){
  42.        /* OPERACIONES NECESARIAS PARA CALCULAR EL TOTAL DE LA CESTA */
  43.    }
  44.  
  45.    public function comprobar_stock(){
  46.        /* OPERACIONES NECESARIAS PARA SABER SI ALGUNO DE LOS PRODUCTOS DE LA CESTA SE HA QUEDADO SIN STOCK Y EN CASO AFIRMATIVO BORRARLO DE LA CESTA*/
  47.    }
  48.  
  49.    /* ...... CREA TODOS LOS MÉTODOS QUE NECESITES PARA TRATAR TU CESTA ..... */
  50. }

Esta clase la serializas y la guardas en el campo OBJ_PEDIDO de la tabla CESTA en la BD y la extraes cuando lo necesites deserializándola y tratando los datos. No es una buena práctica guardar datos serializados en las bases de datos si los datos que guardas los quieres relacionar con otras tablas, este no es mi caso y así me va bien, si lo prefieres, puedes crear otra tabla llamada "PRODUCTOS_CESTA" y en lugar de guardar los productos en la clase Producto_cesta, los guardas en la tabla de la BD relacionados por el ID y el ID_USER de la tabla CESTA.

Cuando un usuario añade productos haces todas las operaciones necesarias y la guardas en la base de datos. Cuando un usuario hace un pedido, sacas los datos de la cesta, guardas los datos del pedido en la tabla de "pedidos", guardas los productos vendidos en el pedido en la tabla de "vendidos" y si el pedido se realizó correctamente borras la cesta del usuario de la tabla "cesta".

¿Por qué decidí ir guardando las cestas en la Base de Datos? Porque me encontré con clientes que no sabían comprar o tenían alguna duda o problema con el pago. Así que de esta manera, me hice un panel de control donde tengo accesos a todas las cestas de la compra y cuando el cliente llamaba con algún problema miraba su cesta y solucionaba sus dudas. Si solo la guardas en una variable de $_SESSION, a la cesta del cliente solo tendrá acceso el cliente y ante cualquier duda no podrás ayudarle correctamente.
__________________
Diseño Web - Arisman Web

Etiquetas: sesiones
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:35.