【问题标题】:Using sessions to store a shopping cart using CodeIgniter使用 CodeIgniter 使用会话存储购物车
【发布时间】:2013-01-20 07:37:56
【问题描述】:

我想做一个电子商务网站,不想强迫用户有一个帐户来购买商品,他们可以随心所欲地做。

我可以使用 CodeIgniter 中的会话类来执行此操作,并且能够将用户会话(即他们的购物车项目)保持较长时间(可能是 6 个月或一年)吗?我阅读了关于会话的 CI 用户指南,它说它为您提供了通过在配置文件中将 session_expire_on_close 变量声明为 false 来设置会话不过期的选项,我猜即使在用户关闭后会话也会继续运行浏览器。

每当用户访问该网站,或在他们的购物篮中添加一些东西时,我都可以开始会话。然后当他们离开并决定回来时,我可以从我的数据库中的会话表中验证他们的购物车信息并将其返回给他们。

我还想知道是否应该将购物车项目存储在 ci_sessions 表中,作为用户指南中 user_data 列中的示例给出?这样就够了吗?

只是想知道我是否朝着正确的方向前进。谢谢

【问题讨论】:

  • 如果你问这样的问题,那么使用 CodeIgniter 购物车库可能更明智,而不是说你跛脚什么的,但它会更容易维护。我发现它制作精良,并且允许存在许多自定义字段!
  • @Vlakarados 购物车类只处理添加/更新/删除购物车中的商品,而不是保存它们以供以后访问,对吧?
  • @AZ1 在 Anooj 发布的链接中很明显,本指南或手册应该是您的圣经或口头禅或其他任何东西,CodeIgniter 以其出色的文档而闻名,您应该牢记!
  • @Anooj 感谢您的链接,我以前看过它,但是根据这里人们的见解,我已经理解了那里的内容:P

标签: mysql codeigniter session


【解决方案1】:

CodeIgniter 使用自己的会话 (see this),不会干扰 PHP sessions

因此您可以使用常规的 PHP 会话

session_start();

创建或重新打开现有会话,其 ID 存储在 cookie 中(通常为PHPSESSID)。然后使用该会话而不是 CodeIgniter 的会话

$_SESSION['MyData'] = 12345;

也许您可以在您的 CodeIgniter 配置中检查 cookie 名称在 config.php 中没有冲突,sess_cookie_name

【讨论】:

  • 抱歉,我没有完全理解您发布的内容。您是说使用 PHP 会话并使用 PHPSESSID 检查该会话是否存在?
  • 比这更简单。使用不干扰 CodeIgniter 的 PHP 会话。 PHPSESSID 只是存储在浏览器中的 cookie 名称。您不必担心,但如果 CI 的 cookie 名称相同,则存在冲突。所以我建议你检查 CI 配置以确保 sess_cookie_name 不是 'PHPSESSID'
【解决方案2】:

简短回答:是的,您走在正确的道路上。

我会怎么做(其中一些可能很明显):

  1. session 库添加到config/autoload.php,使其自动启动。

  2. 根据需要在config/config.php 中设置“会话变量”部分 - sess_expiration = some long timesess_expire_on_close = falseuse_database = true 等。

  3. 为简单起见,仅在会话中存储产品 ID。下面以一个基本的add_to_cart函数为例:

    public function add_to_cart($product_id) {
    
    // Whenever a user adds an item to their cart, pull out any they already have in there
    
    $cart_products = $this->session->userdata('cart_products');
    
    // Add the new item
    
    $cart_products[] = $product_id;
    
    // And put it back into the session
    
    $this->session->set_userdata('cart_products', $cart_products);
    
    }
    
  4. 使用会话中的 product_ids 从您的数据库中提取更多详细信息(例如产品名称)并将其显示在屏幕上。

由于 CI 保留自己的 session_id,这种方法应该会在用户每次重新访问您的站点时自动重新填充会话,因此您永远不需要手动查询 ci_sessions 表或使用标准 PHP 会话。

以上内容未经测试,但希望对您有所帮助,如果有任何需要澄清的地方,请大声疾呼。

【讨论】:

  • 嗨,亚当,感谢您的帮助。从人们在上面的“通用 cmets”部分发布的内容来看,使用 Cart 类似乎是最合适的,因为它使用会话来跟踪购物篮中的项目。查看 Cart 类的文档,我相信我还需要一个表(ci_sessions)。你怎么看?我会很感激你的意见:)
  • 确实,Cart 类看起来非常适合您,我完全忘记了它的存在!是的,您仍然需要一个 ci_sessions 表,尽管您不需要直接查询它;当您将购物车转换为订单时,请确保您使用$this->cart->contents();,然后从那里随意处理它:-)
  • 我很难理解您如何不需要查询会话表,在这种情况下有什么意义?例如,当用户将某些东西添加到他们的购物车时,他们将自动启动一个会话(对吗?)并且该会话将持续到它到期或一旦他们销毁购物车。对会话表的需求是只保存有效会话,这样一旦用户准备好购买订单,我就可以验证它以确保它在表中?抱歉,我不明白该表的具体用途
  • 抱歉,我刚刚读了这篇文章,我想我试图澄清一些你已经理解的东西,使你感到困惑!我上面的评论应该只是说“是的 Cart 类正是您所描述的,是的,您将需要使用 ci_sessions 表”。不知道我是如何完全误解你的问题的,我很抱歉!
猜你喜欢
  • 1970-01-01
  • 2012-07-29
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2016-11-23
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多