默认的购物车存在一个很大的弊端:
1、当我们不登录将商品加入购物车后,等登录后再看,发现购买车没有了先前加入的商品。
2、当我们在公司登录后将商品加入购物车,回到家后支付,购物车中的商品没有了。
为解决此问题,最终决定采用根据cookie来保存商品,而摒弃了根据IP来保存商品的方法。
原因是IP很多时候并不是固定的,当我们下班回到家,或者去咖啡厅等转换了上网地点时,这个时候IP也跟着变了,
如果是cookie,只要您的笔记本没变,信息就会依然保存着,显而易见,根据cookie保存商品信息远胜过根据IP。
功能概述:
1、未登录情况下,根据cookie唯一性,可以使购物车中的商品一直保存7天。
2、登录后,之前未登录时添加到购物车中的商品仍旧保存在购物车中,避免再次添加。
3、用户退出后,购物车依然保存7天。
4、用户再次登录时,购物车自动显示之前所添加的商品(包括未登录时添加到购物车的商品),并按日期排序。
5、购物车中的商品一般默认保存7天,这样避免了用户是大,购物车信息过量导致网站性能下降。
1,includes\cls_session.php
换IP时不影响购物车
将用户的IP存入Cookie,或者在生成SESSION时,不取IP。这步修改对动态IP用户无法使用购物车也同时解决。这里IP存入Cookie的有效期是10天,也就是10后购物车依然被清空了。如果想保留更久或更短,可以把864000改为其它数字。一般来说购物车数据留10天已足够了,10天了还未下单,基本上就不会下单了。而10后购物车清空,不会造成数据库压力。
找到
注释,换成下面代码
- //购物车 by neo
- if(isset($_COOKIE['real_ipd']) && !empty($_COOKIE['real_ipd']))
- {
- $this->_ip = $_COOKIE['real_ipd'];
- }
- else
- {
- $this->_ip = real_ip();
- setcookie("real_ipd", $this->_ip, time()+864000, $this->session_cookie_path);
- }
复制代码
继续找
- setcookie($this->session_name, $this->session_id . $this->gen_session_key($this->session_id)
复制代码 把 0 改成 time()+86400*10
- setcookie($this->session_name, $this->session_id . $this->gen_session_key($this->session_id), time()+86400*30, $this->session_cookie_path, $this->session_cookie_domain, $this->session_cookie_secure);//购物车 by neo
复制代码 设置session_id的cookie保存10天,购物车和session都是根据这个值来获取的,如果丢失会重新生成一个,购物车的东西自然就找不到了
继续找
- function destroy_session()
复制代码 把里面的
- 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'");
- }
复制代码 都注释掉。这是退出登录的时候,删除cookie,删除购物车的
2,admin/privilege.php
- " WHERE session_id NOT " . db_create_in($valid_sess);
复制代码 改成
- " WHERE add_time < ".($time-86400*30)." AND session_id NOT " . db_create_in($valid_sess);
复制代码 管理员登陆时不清空购物车。
3,includes\lib_main.php
找到
- function update_user_info()
复制代码 在函数最里面加入
- //购物车 by neo
- if(isset($_COOKIE['real_ipd']) && !empty($_COOKIE['real_ipd']))
- {
- $this->_ip = $_COOKIE['real_ipd'];
- }
- else
- {
- $this->_ip = real_ip();
- setcookie("real_ipd", $this->_ip, time()+864000, $this->session_cookie_path);
- }0
复制代码
会员到别处登录,获取之前的购物车商品出来。 |
|