我正在尝试使用“记住我”功能实现登录系统。这是我的登录页面: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的到期时间。我完全错了吗?还有另一种方法可以实现同样的目标吗?
感谢
答案 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。
这可以通过调用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