Codeigniter / PHP中的多个会话

时间:2012-08-22 18:56:11

标签: codeigniter

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

  1. admin login
  2. 购物车
  3. 用户登录
  4. 现在我无法找出使用不同数据集管理这三个会话的机制。

    我知道可以使用核心php中的session_name()来实现。但是对于codeigniter,我有点困惑。 用Google搜索了很多,但找不到合适的答案。

    我希望清楚地了解codeigniter中的多个会话,以便将来不会产生任何混淆。任何指向教程的链接都会很棒。

4 个答案:

答案 0 :(得分:2)

$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');

为什么这会起作用?

答案 1 :(得分:1)

Codeigniter的会话与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');
} 

虽然Native PHP看起来像

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

答案 2 :(得分:1)

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

我对CI和stackoverflow很新,但我的想法是设置ci_session表,因为它是在docs中编写的,从而保持了CI会话的一致性和安全性。然后,我只为您要管理的每个会话数据向会话变量添加一个引用ID。例如。购物车:

$unique_cart_id = random_string('unique');
$this->session->set_userdata('cart_id', $unique_cart_id);

现在我在一个单独的“篮子”表中引用我的cart_id并包含所有数据。 E.g:

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

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

答案 3 :(得分:-1)

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

例如,您传递$array_of_admin_data array,其中包含userType等信息。如果要检索此值,则必须像这样调用userdata()

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

希望,这会有所帮助。