我正在尝试用CodeIgniter开发一个小型网店。为了储存物品,我使用购物车库。大多数时候,一切都很顺利。然而,有时购物车的内容会在重定向后丢失。
我在网上找到了一些修复程序,但在我的情况下都不起作用。这是我的设置:
- 我使用数据库存储会话
- 我不使用AJAX
- 会话cookie的名称中没有下划线
以下是一个刷新示例:
public function add_item() {
$item_id = $this->input->post('item');
// Query database
$item = $this->model->find_item($item_id);
// Rewrite model info
...
$data = array(
'id' => 'item-' . $item['id'] . '-size-' . $item['sizes'][$i]['id'],
'qty' => $qty,
'price' => $item['sizes'][$i]['price'],
'name' => $item['name'],
'options' => array('short_name' => $item['short_name'])
);
$this->cart->insert($data);
usleep(10000);
redirect('shop');
}
由于这个问题,我终于找到了问题的答案:刷新页面时CodeIgniter Cart和Session丢失
问题是存储在会话中的数据太大了。CodeIgniter将所有数据存储在cookie中,cookie限制为4kB。我的错误是认为,如果我使用DB来存储我的会话,我可以避免这个限制。显然,CodeIgniter"仅"出于安全原因将会话保存在数据库中。cookie中仍有大量数据。
现在,我使用一个名为Native session的库。我在这里找到它:https://github.com/EllisLab/CodeIgniter/wiki/Native-session
我只是把文件放在"application/libraries"中,把第一个函数重命名为"__construct()",把它添加到autoimport中,并用代码中的"native_session"替换了所有的"session"标记。我还不得不更改Cart类,因为它使用了CodeIgniter的原始会话。