ECSHOP购物车保存功能完美版

本文介绍如何修改电子商务网站的session管理代码,以实现购物车数据保存一个月的目标,并解决因浏览器模式变化导致的session失效问题。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

这个只需要修改 includes/cls_session.php 就好了
1,找到 function cls_session(...)
在函数结尾出setcookie(...)的地方把 0 改成 time()+86400*30 ,session_id的cookie保存一个月,购物车和session都是根据这个值来获取的,如果丢失会重新生成一个,购物车的东西自然就找不到了
2,找到 function gen_session_key($session_id)
最后一句改成 return sprintf('x', crc32(ROOT_PATH . $ip . $session_id));
2.7.3已经改过了,2.7.2的要改一下,我当初改这个是因为360chrome浏览器在两种模式切换的时候,HTTP_USER_AGENT会改变,没切换一次验证session_id就不能通过,要重新生成,登录,购物车什么的都失效了
另外,我把$ip也去掉了,因为动态ip的话,同一台电脑下次访问可能ip不一样了,验证也不能通过
3,找到 function destroy_session()
把下面这段代码去掉,这是退出登录的时候,删除cookie,删除购物车的
        setcookie($this->session_name, $this->session_id, 1, $this->session_cookie_path, $this->session_cookie_domain, $this->session_cookie_secure);

        
        if (!empty($GLOBALS['ecs']))
        {
            $this->db->query('DELETE FROM ' . $GLOBALS['ecs']->table('cart') . " WHERE session_id = '$this->session_id'");
        }
        

4,修改admin/privilege.php
不如如果你设置购物车保存一个月的话,每次登录后台还是会被清除掉
function clear_cart()
{
   
    $sql = "SELECT DISTINCT session_id " .
            "FROM " . $GLOBALS['ecs']->table('cart') . " AS c, " .
                $GLOBALS['ecs']->table('sessi**') . " AS s " .
            "WHERE c.session_id = s.sesskey ";
    $valid_sess = $GLOBALS['db']->getCol($sql);

    // 删除cart中无效的数据
    $time = gmtime();
    $sql = "DELETE FROM " . $GLOBALS['ecs']->table('cart') .
            " WHERE add_time < ".($time-86400*30)." AND session_id NOT " . db_create_in($valid_sess);
    $GLOBALS['db']->query($sql);
}

这样的话应该就可以了
另外我在用的时候,偶尔发现数据库日志错误,插入session错误,生成的session_id重复了
可以做一个改进
找到 function gen_session_id(),整个改成下面的代码:
    function gen_session_id()
    {
        do
        {
            $this->session_id = md5(uniqid(mt_rand(), true));
            $rs = $this->insert_session();
            if ($rs !== false)
            {
                return $rs;
            }
            $error_no = $this->db->errno();

            if ($error_no > 0 && $error_no != 1062)
            {
                die($this->db->ErrorMsg());
            }

        }
        while ($error_no == 1062);
    }

 

其它改选:card表添加add_time字段,lib_order.php采购商品,flow.php添加赠品 lib_transaction.php 添加订单商品到购物车 添加'add_time' => gmtime;

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值