ecshop 的购物车机制,当用户打开网站时会在session表产生一条seesion,登陆时更新这条seession。此时如果用户将商品添加至购物车,就会在 cart表中添加以session_id为Id的商品数据。而用户退出登录时系统会调用destroy_session()函数,清购物车。
函数部分如下:(cls_session.php文件中)
function destroy_session()
{
//此处省略部分代码
$this->db->query('DELETE FROM ' . $GLOBALS['ecs']->table('cart') .
" WHERE session_id = '$this->session_id'“ );
//此处省略部分代码
}
所以此时退出购物车就被清空了
解决方法:
1.cls_session.php
function destroy_session()
{
//此处省略部分代码
$this->db->query('DELETE FROM ' . $GLOBALS['ecs']->table('cart') .
" WHERE session_id = '$this->session_id' AND user_id =''");
//此处省略部分代码
}
2.lib.main.php
function update_user_info()
{
//些处省略函数原来代码,直接跳到函数最后,加上如下代码:
$sql = "update ".$GLOBALS['ecs']->table('cart')." set user_id =".
$_SESSION['user_id']." where session_id = '".SESS_ID."'";
$GLOBALS['db'] -> query($sql);
$sql1 = "update ".$GLOBALS['ecs']->table('cart')." set session_id ='".
SESS_ID."' where user_id = '".$_SESSION['user_id']."'";
$GLOBALS['db'] -> query($sql1);
$sql2="select distinct(c.goods_id) from".$GLOBALS['ecs']->table('cart').
"as c left join".$GLOBALS['ecs']->table('goods').
"as g on c.goods_id=g.goods_id where g.is_on_sale =0 AND c.user_id = '".
$_SESSION['user_id']."'";
$data = $GLOBALS['db'] -> getAll($sql2);
if($data){
foreach ($data as $k=>$v){
$sql="delete from".$GLOBALS['ecs']->table('cart').
"where goods_id = '".$v['goods_id']."'";
$GLOBALS['db'] -> query($sql);
}
}
}
privilege.php中发现一个clear_cart()用于清理cart中无效的数据的
function clear_cart()
{
//省略部分代码
// 删除cart中无效的数据
//$sql = "DELETE FROM " . $GLOBALS['ecs']->table('cart') .
// " WHERE session_id NOT " . db_create_in($valid_sess);
// $GLOBALS['db']->query($sql);
$sql2="select distinct(c.goods_id) from".$GLOBALS['ecs']->table('cart').
"as c left join".$GLOBALS['ecs']->table('goods').
"as g on c.goods_id=g.goods_id where g.is_on_sale =0 AND c.extension_code='' ";
$data = $GLOBALS['db'] -> getAll($sql2);
if($data){
foreach ($data as $k=>$v){
$sql="delete from".$GLOBALS['ecs']->table('cart').
"where goods_id = '".$v['goods_id']."'";
$GLOBALS['db'] -> query($sql);
}
}
}