ecshop 保存用户购物车数据

ecshop的购物车记录储存在cart表中,用户向购物车中添加商品时会在其中产生一条记录

靠session_id与用户产生映射关系。当注册用户退出登录或者游客关闭浏览器时,session被销毁,同时删除掉cart表中与之对应的记录。所以ecshop的购物车功能,无法在用户下次登录时记录之前的购物车信息。这在某些场景,如用户误关掉浏览器时十分不方便。
为了解决这个问题,首先要在用户登录时,将他以户已游客身份,产生的购物车数据加上user_id。
然后要将该用户的历史购物车记录中的session_id改为本次的session_id。
最后要在用户退出登录时,保存住注册用户在cart表中的购物车记录。
 
具体实现方法:
一、在includes/lib_main.php
中定义如下方法并在update_user_info()方法中的末尾处执行
/**
* 用户登陆后,载入上一次退出时的购物车信息,并与此次登录前购物车信息合并
*
* @access  public
* @return  void
*/
function merge_cart_history()
{
if (!$_SESSION[“user_id”])
{
return false;
}
$sql = “update ” . $GLOBALS[“ecs”]->table(“cart”) . ” set user_id = ” . $_SESSION[“user_id”] . ” where session_id = “”.SESS_ID.”””;//为用户以游客身份时(登录之前),产生的购物车记录添加user_id
$GLOBALS[“db”]->query($sql);

 $sql1 = “update ” . $GLOBALS[“ecs”]->table(“cart”) . ” set session_id =”” . SESS_ID . “” where user_id = “” . $_SESSION[“user_id”] . “””;//将用户历史购物车记录的session_id,改为本次的session_id
$GLOBALS[“db”]->query($sql1);
$re = $GLOBALS[“db”]->getAll(“select goods_id, rec_id, sum(goods_number) as goods_number from ” . $GLOBALS[“ecs”]->table(“cart”) . ” where user_id = “{$_SESSION[“user_id”]}” and session_id = “”.SESS_ID.”” group by goods_id”);//汇总历史购物记录与本次购物记录中,每一种商品的数量
if($re){
foreach ($re as $k => $v)
{
$sql = “update ” . $GLOBALS[“ecs”]->table(“cart”) . ” set goods_number = ” . $v[“goods_number”] . ” where rec_id = ” . $v[“rec_id”];
$GLOBALS[“db”]->query($sql); //每种商品保留一条记录

$sql = “delete from ” . $GLOBALS[“ecs”]->table(“cart”) . ” where rec_id <> {$v[“rec_id”]} and user_id = “{$_SESSION[“user_id”]}” and session_id = “” . SESS_ID . “” and goods_id = ” . $v[“goods_id”];//删除多余的记录
$GLOBALS[“db”]->query($sql);
}
}
}

二、将includes/cls_session.php中的destroy_session()方法做如下修改:

将$this->db->query(“DELETE FROM ” . $GLOBALS[“ecs”]->table(“cart”) . ” WHERE session_id = “$this->session_id””);

改为$this->db->query(“DELETE FROM ” . $GLOBALS[“ecs”]->table(“cart”) . ” WHERE session_id = “$this->session_id” AND `user_id`=0″);

既销毁当销毁session时,只将cart表中user_id等于0(未登录用户)的购物车记录删除。

改完收工。