正确使用session_set_cookie_params

时间:2010-12-31 13:13:25

标签: php

我正在尝试使用“记住我”功能实现登录系统。这是我的登录页面:http://pastebin.com/q6iK0Mgy。在此我尝试使用session_set_cookie_params()扩展会话cookie(PHPSESSIONID)到期。但它不起作用。

代码中的相关部分:在此处执行内部if()循环,但session_set_cookie_params('3600')无效。我正在调用session_name(),因为它应该是session_set_cookie_params()的一个要求(根据php手册上的一条评论)

if ( isset($_POST["submit"]) ) 
 {
     session_name() ;
     echo "calling before checked " ;
     if ( $_POST["remember"] == "on") 
    {
       // extend expiration date of cookie
       session_set_cookie_params('3600');
       echo "<br/>calling after sessions_set_cookie_params" ;
    }
 } 
 require_once("includes/session.php"); //session start ?>

我希望我能够解释我想做什么。基本上我试图做的是延长session_cookie的到期时间。我完全错了吗?还有另一种方法可以实现同样的目标吗?

感谢

2 个答案:

答案 0 :(得分:5)

对于答案来说,永远不会太老了吗?

所以,PHP dumb 。如同,它不会做你认为有意义的事情。

在您调用session_start的确切时刻之前,

session_set_cookie_param将不会执行任何操作。因此,如果您在调用会话开始后设置cookie参数,则为时已晚。如果你设置了cookie参数,但是没有调用session_start,则没有任何反应。

session_start也是一个有趣的野兽。它只会在第一次调用cookie时读取cookie数据,除非....你强制它写入,或者没有cookie开始。因此,如果没有cookie,它会写入cookie数据,客户端会保存您的会话。好极了!但是当cookie已经存在时,我们如何强制它写入,从而更新我们新的到期日期?

因此,如果客户端上已存在cookie,我们会忽略所有session_set_cookie_param调用。更好的是,如果你明确地调用setcookie(session_name(), blah blah blah ),php将仍然不会发出cookie。

所以,让我们强制php发出一个cookie。

选项1

这可以通过调用session_id来实现唯一不会破坏现有会话的值。 http://php.net/session_id处的文档指出

  

注意:使用会话cookie时,指定session_id()的id将始终在调用session_start()时发送新cookie,无论当前会话ID是否与正在设置的会话ID相同。

session_id($_COOKIE[session_name()]);

所以无论如何早上6点,我还没有睡觉,如果不是几年前你可能想出这几个月,但是到底怎么样,也许我会在我生命的2或3个小时里救别人永远不会回来。哈哈。

答案 1 :(得分:2)

来自文档:

  

你需要打电话   session_set_cookie_params()为每一个   请求和之前 session_start()是   调用。

同时检查http://www.php.net/manual/en/session.configuration.php#ini.session.cookie-lifetime