Jump to content


Photo

carrito de compra


  • Please log in to reply
9 replies to this topic

#1 rockstar

rockstar

    Member

  • Miembros
  • PipPip
  • 10 posts

Posted 23 August 2013 - 10:45 AM

Buenos dias. Espero que me puedan ayudar, pues resulta que estoy haciendo un carrito de compras y tengo la siguiente tabla.


create table carrito(
id_carrito int auto_increment,
id_producto int,
id_cliente int,
cantidad int,
precio decimal(6,2),
fecha date,

primary key(id_carrito)

)


resulta que tengo un problema pues cuando un cliente realisa una compra almaceno los productos en una variable sesion que recorro para luego insertar en la tabla carrito, el problema es que cuando se insertan en la tabla carrito cada producto genera un id_carrito por lo que no puedo consultar el detalle de ese carrito porque cada producto genera un id. Es decir que si el carrito del cliente tien 3 productos en la tabla carrito se inserta asi:
id_carrito  id_producto  id_cliente  cantidad  Precio      fecha
1                    23                  4                3          5.25      2013-07-02
2                    5                    4                2          10.24    2013-07-02
3                    8                    4                1            9.99    2013-07-02

ahora bien se que alguien me podra decir que si se puede la hacer una consulta asi:
select id_producto from carrito where id_cliente = 4;


Pero si el mismo cliente realice otra compra la otra semana por ejemplo y compra 2 productos. Entonces el cliente tendria 2 carritos en su historial y  la tabla carrito queda asi:

id_carrito  id_producto  id_cliente  cantidad  Precio      fecha
1                    23                  4                3          5.25      2013-07-02
2                    5                    4                2          10.24    2013-07-02
3                    8                    4                1          9.99      2013-07-02
4                    2                    4                6          3.00      2013-08-26
5                    10                  4                5          4.00      2013-08-22

entonces tengo problemas al consultar el detalle de los carritos del cliente porque si realizo la consulta
select id_producto from carrito where id_cliente = 4

me va a mostrar todo los productos pero no puedo separar los carritos para que se muestre el detalle de cada carrito.

Alguien me pude decir como puedo hacer esto. Espero haberme dado a entender.

Saludos,


  • 0

#2 felper77

felper77

    Member

  • Miembros
  • PipPip
  • 27 posts

Posted 23 August 2013 - 11:10 AM

Hola.

El problema esta en la definicion de tu campo:

  id_carrito INT AUTO_INCREMENT,

ya que lo defines como autoincremental y al momento de agregar un nuevo artículo se va incrementando el valor de este campo.
Podrias editar tu tabla y definir el campo de tipo entero solamente, asi al insertar un articulo tambien defines el id del carrito al que corresponde. (y)

Saludos...
  • 0

#3 rockstar

rockstar

    Member

  • Miembros
  • PipPip
  • 10 posts

Posted 23 August 2013 - 11:23 AM

Te agradezco tu comentario. Me podrias dar un ejemplo de como deberia ser la insercion en la tabla carrito, de como defino el id del carrito te lo agradeceria muchisimo!!!
:wink:
Saludos.
  • 0

#4 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6295 posts
  • LocationArgentina

Posted 23 August 2013 - 11:51 AM

Hola,
Por lo que entiendo el problema que tienes se debe a la estructura de la tabla y el diseño que has dado a tu base de datos junto a la lógica que estás llevando.

Quisiera ofrecer las siguientes apreciaciones:
1) Si para tu análisis la entidad "carrito" debiera de ser única para cada cliente como pretendes sugerir entonces el diseño no debiera de ofrecer una cardinalidad (1:M) entre clientes y carritos.
Más bien en su lugar es una relación (1:1) y por tanto, bajo las reglas normales, la información debiera de estar en una única tabla.
2) Ahora bien, si en realidad el contexto que indicas es de compras, tal como mencionas casi al final entonces ya las cosas son diferentes. Es de apreciar que en realidad estamos hablando de una serie de compras, hechas en diferentes períodos de tiempo. Naturalmente, por cada compra tenemos la información detallada, de allí a que:

Clientes -1---M- Compras -1---M- DetalleCompras

Ahora bien esto en realidad no resuelve el problema puesto que en realidad hemos hecho un cambio de nombres... Lo que era carrito, lo llamamos Compras. Ahora bien, este cambio de nombre ilustra mejor lo que sucede: el cliente hará muchas compras. Que un cliente tenga varios carritos puede sonar un tanto descolocado. Aunque es un detalle menor.

La arista del problema está justamente en una falla de la concepción de a lo que entendemos por clave artificial y clave natural, y clave candidata y el uso que le damos a éstas junto a la lógica que has concebido al momento de añadir detalles de cada compra.
Una clave artificial es como dice el nombre un campo que creamos y añadimos artificialmente al contexto a fin de darle el uso como clave única. El ejemplo típico es el famoso campo ID que tan acostumbrados estamos a usar. El punto está en que ésta no tiene valor por si para la entidad. Sólo cumple un rol de identificación.
Por otro lado la clave natural es una que se extrae del propio contexto o que la misma entidad aporta la información suficiente como para ofrecer un medio de garantizar unicidad. El ejemplo típico es el DNI de una persona.
NOTA: Existen casos en los que una clave natural también es artificial. El ejemplo del DNI es uno; técnicamente el DNI es una clave artificial inventada por el nombre pero que se hace natural debido a que ya forma parte de la propia entidad.
Clave candidata es todo campo o atributo, artificial o natural que posee la capacidad de convertirse en una clave.

¿Porqué menciono esto?
Por el campo ID_producto y el uso dado aquí. Inicialmente el diseño está bien; cada "carrito" debe poder identificarse, y que sea o no autoincremental está bien.

Volvamos a ver el diseño de tu tabla.
Repasando los puntos anteriores, ¿que rol cumple ese ID_producto? Fíjate en el "DER" que puse anteriormente.
Así como está tu tabla da a entender que tienes una confusión entre lo que es un producto de lo que un carrito. Al punto en que hasta se la está interpretando como algo (1:1).

Tu mismo indicas que al añadir un producto, se genera un carrito. O que para añadir un producto te ves obligado a crear un carrito nuevo. Aquí es donde hay un error de lógica. Abría que ver si lo haces por medio de un trigger, o si tu mismo estás disparando un INSERT y recuperando la información.
De todas formas demuestra que la operatoria no esta respetando los cánones normales de un buen diseño de la base de datos y se está forzando al diseño a ir contra natura de la teoría del álgebra relacional.

Te agradecería que nos comentes más al respecto de como estás procediendo para insertar los datos y que nos brindes un mejor panorama sobre las demás tablas y relaciones vinculadas a la tabla Carrito.

Saludos,
  • 0

#5 felper77

felper77

    Member

  • Miembros
  • PipPip
  • 27 posts

Posted 23 August 2013 - 11:55 AM

Podrias intentar lo siguiente:

Suponiendo que ya tienes en tus variables de sesion los articulos que vas a registrar. Lo primero que tienes que hacer es obtener con una cosulta el nuevo id del carrito:

  select coalesce(max(id_carrito),0) + 1 as nuevo_id_carrito
    from carrito;


Ahora ya tienes id del carrito, empiezas a insertar tus articulos en la tabla de la misma forma en que lo estabas haciendo solo que tambien insertaras en el campo id_carrito el valor que obtubiste en la consulta(nuevo_id_carrito).  ;)

Saludos...

  • 0

#6 rockstar

rockstar

    Member

  • Miembros
  • PipPip
  • 10 posts

Posted 23 August 2013 - 12:19 PM

Gracias por su ayuda!!!
las tablas son:

create table clientes(
id_cliente int primary key auto_increment,
nombre varchar(200),
apellido varchar(200),
email varchar(200),
telefono_contacto varchar(50),
direccion_facturacion varchar(200),
nit int,
password varchar(100)
)



create table producto(
id_producto int primary key auto_increment,
nombre varchar(200),
descripcion varchar(200),
imagen varchar(200),
precio decimal(6,2),
fecha_ingreso date
)




create table carrito(
id_carrito int auto_increment,
id_cliente int,
id_producto int,
cantidad int,
precio decimal(6,2),
total decimal(6,2),
fecha date,

primary key(id_carrito)
)


ahora la forma de como capturo los productos del cliente y lo inserto es:

funcion para insertar productos:


public function insert_carrito_client($idproducto, $cliente,$cantidad, $precio,$total)
{
$sql = "insert into carrito values(null,$cliente,$idproducto,$cantidad,$precio,$total,now());";

$res = mysql_query($sql, Conexion::connect());

} // fin de la funcion insert_carrito_client



<?php
$contador = 0;
foreach($_SESSION['carro'] as $key=>$cantidad){
$contador ++;

$fi=$config->getProductosPorId($key);

foreach($fi as $fila){


$id=$fila['id_producto'];
$producto=$fila['nombre'];
$precio=$fila['precio'];
                                                        $cliente=$fila['id_cliente'];


} // fin foreach interno

?>

<?php
$total = $cantidadr*$precio;
$config->insert_carrito_client($id,$cliente,$cantidad,$precio,$total);

} // fin foreach externo

?>
             


Gracias por su ayuda, se los agradezco mucho!!!
  • 0

#7 daxko

daxko

    Newbie

  • Miembros
  • Pip
  • 1 posts

Posted 04 September 2013 - 08:36 AM

yo tmb estoy haciendo un carrito de compra y la base de dato me funciona perfectamente tengo problema con el diseño y algunas funciones pero creo q voy bien si gustas puedes guiarte de mi db y si ven alguna mejora porfa avisarme

tabla usuario
CREATE TABLE `usuario` (
  `id` int(250) NOT NULL AUTO_INCREMENT,
  `nombre` varchar(250) NOT NULL,
  `apellido` varchar(250) NOT NULL,
  `direccion` tinytext NOT NULL,
  `usuario` varchar(50) NOT NULL,
  `clave` varchar(250) NOT NULL,
  `activo` int(1) NOT NULL,
  `correo` varchar(250) NOT NULL,
  UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=latin1


tabla pedidos (en esta tabla esta las compras de los usuarios el estatus muestra el estatus de tu compra "pendiente pagado entregado" el campo transaccion se colocara el numero de deposito que en mi caso solo aceptara transacciones bancarias)


Create Table

CREATE TABLE `pedido` (
  `id` int(250) NOT NULL AUTO_INCREMENT,
  `fecha_pedido` date DEFAULT NULL,
  `id_usuario` int(250) DEFAULT NULL,
  `monto` float(10,2) DEFAULT NULL,
  `estatus` varchar(20) DEFAULT 'Pendiente',
  `fecha_deposito` date DEFAULT NULL,
  `transaccion` varchar(90) DEFAULT NULL,
  `banco` int(9) DEFAULT NULL,
  `fecha_envio` date DEFAULT NULL,
  `cierre` int(1) DEFAULT '1',
  UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1


tabla carro (tiene el desgloce de los pedidos todos los productos que se pidieron se muestran en esta tabla

CREATE TABLE `carro` (
  `id` int(250) NOT NULL AUTO_INCREMENT,
  `id_pedido` int(250) DEFAULT NULL,
  `id_items` int(250) DEFAULT NULL,
  `cantidad` int(9) DEFAULT NULL,
  `monto` float(10,2) DEFAULT NULL,
  `id_usuario` int(250) DEFAULT NULL,
  UNIQUE KEY `id` (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1


si te sirve bien  :)
  • 0

#8 rockstar

rockstar

    Member

  • Miembros
  • PipPip
  • 10 posts

Posted 05 September 2013 - 10:04 AM

Talvez nos podemos ayudar :smiley:

Yo tengo que implementar 3 tipos de pagos:
Tarjeta de credito
Paypal
y Transferencia bancaria

Saludos,
  • 0

#9 Delphius

Delphius

    Advanced Member

  • Administrador
  • 6295 posts
  • LocationArgentina

Posted 05 September 2013 - 10:30 AM

Hola,
A ver... ¡paren sus carritos!

Si están haciendo tantos insert como productos quieren poner en UN carrito dentro de una hipotética tabla carrito es que están haciendo las cosas mal.
Veo que no se dieron por entendidos a mis palabras.

Lo que se consigue con esos inserts es justamente crear muchos carritos. Lo que necesitas es justamente una tabla de detalle de lo que contiene el carrito. Es decir:

Tabla: Carrito
IDCarrito (PK)
ClienteID (FK>>Clientes.IDCliente)

Tabla: DetalleCarrito
IDDetCarrito (OK)
CarritoID (FK>>Carrito.IDCarrito)

Esto forma una relación
Clientes -1---M-Carritos-1---M-DetalleCarrito

Entonces para UN carrito habrá MUCHOS DetalleCarrito (aunque quizá el nombre más apropiado sería otro). ¿Cuántos? Tantos como productos tengan o esté por comprar.

Es en esta tabla DetalleCarrito en donde se debe de proceder a realizar el alta de lo que se está planeando comprar. Es fundamental que entre los campos de esta tabla que se pase como clave foránea justamente el ID del carrito que hace a la compra de dicha sesión.

Que dichos IDs sean o no autoincrementales es sólo un detalle técnico. Lo importante es que de algún modo tengas temporalmente dicha referencia. El álgebra relacional funciona de maravillas y expresa muy bien: para insertar en una tabla esclava se necesita primero contar con el registro maestro previamente insertado y conocer el valor que actúa como nexo o referencia, o para ser más dicho: el valor de la clave primaria.

¿Me explico ahora?
Por otro lado en DelphiAccess la ayuda se da de forma abierta y colaborativa y hacemos incapié en que se fortaleza esta forma de comunicación. Si ustedes dos desean colaborarse mutuamente pueden hacerlo, aunque nos encantaría que nutrieran al foro con sus avances y dudas.
Proceso a borrar el e-mail por dos motivos: 1) evitar que te llegue spamm y 2) En nuestra reglas y sanas sugerencias tenemos expreso que las dudas se hagan públicas, o en todo caso allí está la opción de enviarse un mensaje privado si es algo puntual que no cae en algo respecto a dudas.

Saludos,
  • 0

#10 rockstar

rockstar

    Member

  • Miembros
  • PipPip
  • 10 posts

Posted 05 September 2013 - 11:42 AM

Gracias agradezco la correcion y la ayuda

Saludos
:wink:
  • 0




IP.Board spam blocked by CleanTalk.