【问题标题】:Multiple Sessions in Codeigniter/PHPCodeigniter/PHP 中的多个会话
【发布时间】:2012-08-22 18:56:11
【问题描述】:

我正在使用 codeigniter 开发一个电子商务网站,其中包含以下会话:

  1. 管理员登录
  2. 购物车
  3. 用户登录

现在我无法找出使用不同数据集管理这三个会话的机制。

我知道它可以通过核心 php 中的 session_name() 来实现。但是对于codeigniter,我有点困惑。 谷歌了很多,但找不到正确的答案。

我想清楚地了解 codeigniter 中的多个会话,以免将来造成任何混乱。任何指向教程的链接都会很棒。

【问题讨论】:

  • 我想使用原生 PHP 会话
  • 如果你用谷歌搜索的话,会有一个用于本地会话的代码点火器库。不确定它的效果如何。常规代码点火器会话使用大小限制在 4k 左右的 cookie 完成,当您超过大小限制时,它会破坏一切。您也可以通过更改消除大小限制的配置选项来使用 db_sessions。
  • 我真的很想使用原生 PHP 会话而不是 codeigniter 提供的库。我知道这是可以做到的,但不是细节。
  • 为什么要“多个”会话?只需一个会话即可包含所有数据??

标签: codeigniter


【解决方案1】:
$this->session->set_data('admin',$array_of_admin_data);
$this->session->set_data('user',$array_of_user_data);
$this->session->set_data('cart',$array_of_cart_data);

然后检索每个视觉数据?使用

$this->session->userdata('admin');

为什么这不起作用?

【讨论】:

  • 感谢您的回复。但我不想使用 codeigniter 会话,因为它们使用 cookie 存储数据,这迫使我考虑安全问题。
【解决方案2】:

Codeigniter 的 session 与 Native PHP Session 完全不同,它非常安全,尤其是在存储在数据库中时。您可以使用 codeigniter 的会话和 Native PHP Session,它们可以很好地协同工作,因为 PHP 会将它们视为不同的变量。 如果要检查是否存在 codeigniter 会话值,请使用

if(isset($this->session->userdata['course_id']))
{
    $this->data['course_id'] = $this->session->userdata('course_id');
} 

虽然原生 PHP 看起来像

if(isset($_SESSION['course_id']))
{
    $this->data['course_id'] = $_SESSION['course_id'];
} 

【讨论】:

    【解决方案3】:

    我也在开发电子商务系统,遇到了同样的问题。我不喜欢管理作为序列化数据存储在数据库中的所有数据,尤其是对于购物车/篮子而言,因为这使得查询数据库变得很困难,而且我只是觉得它有点乱。

    我对 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,但我可以在数据库中分别管理每种类型的会话数据。

    这只是对这个想法的粗略分解。我希望它有所帮助。

    【讨论】:

      【解决方案4】:

      使用userdata() 方法,您可以检索在创建会话期间保存的字段。

      例如,您传递了$array_of_admin_data array,其中包含一些信息,例如userType。如果你想检索这个值,你必须像这样调用userdata()

      $this->session->userdata('userType');
      

      希望这会有所帮助。

      【讨论】:

        猜你喜欢
        • 2011-01-01
        • 1970-01-01
        • 1970-01-01
        • 2014-02-21
        • 2010-10-25
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多