2012-05-23 64 views
5

我跟着从这里的答案,但它并没有为我工作:
Is possible to keep session even after the browser is closed?如何让浏览器在PHP中关闭后保持会话打开?

这里是我试过的代码:

$session_life = 2592000; // 30 days 
session_set_cookie_params($session_life); 
session_name('my_cart'); 
session_start(); 
// update the session_life 
setcookie(session_name(),session_id(),time()+$session_life); 

这样做的问题是,每次浏览器关闭我仍然得到一个新的session_id,而不是旧的。

我正在使用数据库将项目存储在'my_cart'中,而session_id仅用于识别用户向他们显示自己的购物车。

对于我来说,保持用户购物车运行30天的最佳方式是什么?


这是我结束了代码:

$cart_name = "my_cart"; 
$cart_life = 2592000; // 30 days 
session_start(); 
if (isset($_COOKIE[$cart_name])) { 
    session_id($_COOKIE[$cart_name]); 
} 
setcookie($cart_name, session_id(), time()+$cart_life); 
+1

也许这是为标准值(20:00)工作的饼干,而不是会议。 – mawburn

+0

您的会话也可以在服务器上过期。 php参数[session.gc_maxlifetime](http://php.net/manual/en/session.configuration.php#ini.session.gc-maxlifetime)定义了会话信息在被垃圾回收前保留的最大时间集。 –

回答

3

我不得不做一个网站,我写了一个类似的事情(允许有30分钟的时间内为客户输入验证码)

与其使用cookie(因为您不能保证客户将在同一浏览器中返回该网站),我将代码的到期时间与用户的记录存储在一起。这样,无论他们从哪个浏览器访问该页面(例如,从移动设备开始,在桌面上完成),他们总是会同时过期。

当顾客返回到现场,我当前的时间比较到期时间和采取相应的行动

正如你已经存储了客户的篮子,我想补充的到期时间对的记录,然后运行当顾客退货时进行比较。这是很容易做到:

update basket set expiryDateTime=date_add(now(),interval 7 day) where basketID=[xyz] 

如果你愿意,你甚至可以设定一天的时间在MySQL的使用多一点弄虚作假

+0

谢谢,但只有当客户登录后才能使用。我还希望允许客户在无需注册的情况下将物品添加到购物篮中。除此之外,我已经将数据库中的last_update字段保留在购物车记录中。 (我的意思是,我已经为注册客户做这件事)。 – user1275136

+0

在这种情况下,请将购物篮存储在具有到期日期值的Cookie(作为JSON字符串)中。当他们返回时,检查cookie并过期所有需要的项目。只要确保没有个人信息存储在cookie中。如果他们需要注册才能真正到达结账/付款部门,那么一旦他们成功注册并且仅从该处使用DB(即,用于未注册的cookie,注册的DB),将信息传输到DB, 。这样也可以查找订单历史记录。 – DaveyBoy

+0

对不起,我不认为你了解我。我已经将购物车存储在数据库中,并且对于注册客户,我会从数据库中找到他们拥有的购物车。我试图在这里做的是,当浏览器关闭时,坚持以前的session_id,以便未注册的客户可以从之前看到他们的购物车。所以我在会话名称下创建了一个会话,并将其设置为在30天内过期,但在浏览器关闭时似乎仍然过期。我该怎么做才能解决这个问题?我只需要从之前的会话ID来识别已存储在数据库中的购物车。谢谢 – user1275136

相关问题