我也在开发电子商务系统,遇到了同样的问题。我不喜欢管理作为序列化数据存储在数据库中的所有数据,尤其是对于购物车/篮子而言,因为这使得查询数据库变得很困难,而且我只是觉得它有点乱。
我对 CI 和 stackoverflow 还很陌生,但我的想法是设置 ci_session 表,因为它写在 docs 中,从而保持 CI 会话的一致性和安全性。然后,我只为您要管理的每个会话数据添加一个参考 ID 到会话变量中。例如。购物车:
$unique_cart_id = random_string('unique');
$this->session->set_userdata('cart_id', $unique_cart_id);
现在我在包含所有数据的单独“篮子”表中引用了我的 cart_id。例如:
CREATE TABLE basket (
id int(11) NOT NULL auto_increment,
cart_id varchar(32) default NULL,
timestamp timestamp NULL default NULL,
price float(10,2) default NULL,
title varchar(100) default NULL,
serialized_data text,
product_id int(11) default NULL,
PRIMARY KEY (id)
)
现在每次有人想向购物篮添加东西时,我都会从会话变量中获取 cart_id:
$cart_id = $this->session->userdata('cart_id');
通过编写一个小插入脚本,将$cart_id 与任何其他购物车数据一起存储在我的“购物篮”表中。
$data = array(
'cart_id' => $cart_id,
'title' => $product_title,
'product_id' => $product_id,
'price' => $price,
'serialized_data' => serialize(array('what ever you need else'))
);
$this->db->insert('basket', $data);
现在如果有人想查看购物篮,我只需再次从会话变量中检索 $cart_id 并查询与 cart_id 匹配的数据库。
$this->db->query("SELECT * FROM basket WHERE cart_id = ?", array($cart_id));
您对其他会话数据、管理员和用户登录使用相同的原则。因此,我只为每个用户保留一个会话 cookie,但我可以在数据库中分别管理每种类型的会话数据。
这只是对这个想法的粗略分解。我希望它有所帮助。