要实现一个购物车功能,为了保证用户在不同的地方登录后购物车的数据不丢失,所以需要把购物车存在数据库里,实现这个功能的时候,自己感觉逻辑有点乱。主要有以下问题:
(1)购物车表的设计,如果有一个购物车表,是不是需要为每个用户维护一条记录,如果新用户没有购物车就为该用户创建一条记录,之后就去更新这条记录。
(2)用户购买了购物车里的某个商品或所有商品之后,购物车的数据如何更新?
要实现一个购物车功能,为了保证用户在不同的地方登录后购物车的数据不丢失,所以需要把购物车存在数据库里,实现这个功能的时候,自己感觉逻辑有点乱。主要有以下问题:
(1)购物车表的设计,如果有一个购物车表,是不是需要为每个用户维护一条记录,如果新用户没有购物车就为该用户创建一条记录,之后就去更新这条记录。
(2)用户购买了购物车里的某个商品或所有商品之后,购物车的数据如何更新?
1.未登录用户购物车存session
2.登录后如果session中有订单提示否保存到账户中
3.购买后清空购物车(如果结账可以选择购物车里仅结账几个,那就删除这几个)
4.购买指的是创建订单成功后而不是付款后,创建订单成功就删除购物车指定内容或清空购物车
1、在不同的设备上达到购物车产品同步的话,建议用户添加购物车商品、保存快照(可以是分布式文件系统、也可以是缓存系统),不建议放数据库;用户登录不同设备,加载购物车快照;
2、当用户真正结算下单,系统才会真正生成订单,可以即时删除快照,也可以等快照自己失效过期
商品添加至购物车是不需要登录的。这时候购物车信息存在cookie内(而不是session)
选择购物车内的商品购买,这时候需要用户登录了。
用户登录后获取用户cookie内购物车信息,以及登录信息,更新数据库购物车表(购物车表,一个sku对应购物车一条记录)。
用户勾选购物车内商品,生成预览订单(重新获取商品的最新情况比如 库存,商品价格等)
提交并生成订单,然后删除购物车已购买的商品,预减库存。
购物车存在数据库,用户体验非常好,刚做了一个项目就是将购物车里的产品及规格存到了数据表中的一个字段中。
第一个问题很赞成,我们也是这么做的,第二个问题,订单提交后删除了该商品在购物车表中的数据。希望对你有帮助。
/* 加入购物车 */
$cart = array(
'user_id' => $user_id,
'session_id' => SESS_ID,
'goods_id' => $auction['goods_id'],
'goods_sn' => addslashes($goods['goods_sn']),
'goods_name' => addslashes($goods['goods_name']),
'market_price' => $goods['market_price'],
'goods_price' => $auction['last_bid']['bid_price'],
'goods_number' => 1,
'goods_attr' => $goods_attr,
'goods_attr_id' => $goods_attr_id,
'is_real' => $goods['is_real'],
'extension_code' => addslashes($goods['extension_code']),
'parent_id' => 0,
'rec_type' => CART_AUCTION_GOODS,
'is_gift' => 0
);
$db->autoExecute($ecs->table('cart'), $cart, 'INSERT');
/**
* 取得购物车商品
* @param int $type 类型:默认普通商品
* @return array 购物车商品数组
*/
function cart_goods($type = CART_GENERAL_GOODS)
{
$sql = "SELECT rec_id, user_id, goods_id, goods_name, goods_sn, goods_number, " .
"market_price, goods_price, goods_attr, is_real, extension_code, parent_id, is_gift, is_shipping, " .
"goods_price * goods_number AS subtotal " .
"FROM " . $GLOBALS['ecs']->table('cart') .
" WHERE session_id = '" . SESS_ID . "' " .
"AND rec_type = '$type'";
$arr = $GLOBALS['db']->getAll($sql);
/* 格式化价格及礼包商品 */
foreach ($arr as $key => $value)
{
$arr[$key]['formated_market_price'] = price_format($value['market_price'], false);
$arr[$key]['formated_goods_price'] = price_format($value['goods_price'], false);
$arr[$key]['formated_subtotal'] = price_format($value['subtotal'], false);
if ($value['extension_code'] == 'package_buy')
{
$arr[$key]['package_goods_list'] = get_package_goods($value['goods_id']);
}
}
return $arr;
}
购物车表里加一个所归属用户的字段,每个用户加一个购物车商品都是一条独立的记录,只不过记录的归属用户字段不同,提去的时候按这个字段select就好了