正确使用session_set_cookie_params

gya*_*guy 3 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 ?>
Run Code Online (Sandbox Code Playgroud)

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

谢谢

Noi*_*she 6

从来没有太老的答案权利?

所以,PHP是愚蠢的.如同,它没有做你认为有意义的事情.

session_set_cookie_param在您调用session_start的确切时刻之前不会执行任何操作.因此,如果您在调用会话开始后设置cookie参数,则为时已晚.如果您设置cookie参数但不调用session_start,则不会发生任何事情.

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

因此,如果客户端上已存在cookie,则忽略所有session_set_cookie_param调用会产生这种奇怪的效果.更好的是,如果你明确地调用setcookie(session_name(),blah blah blah),php将会STILL不发出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()]);
Run Code Online (Sandbox Code Playgroud)

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

  • 好了一年多了,您的代码段帮助了我!它确实满足了我的需要:延长每次页面加载时的cookie有效期。我在session_start();之前添加了它。谢谢...从未来! (2认同)