用户
 找回密码
 入住 CI 中国社区
搜索
查看: 1648|回复: 5
收起左侧

[讨论/交流] 自带的设置cookie方法如果不加时间就不能正确设置

[复制链接]
发表于 2017-2-20 15:46:12 | 显示全部楼层 |阅读模式
本帖最后由 djtai 于 2017-2-20 16:37 编辑

在system/core/Input.php文件中,我们可以看到
  if ( ! is_numeric($expire))
        {
                 $expire = time() - 86500;
        }
        else
        {
                $expire = ($expire > 0) ? time() + $expire : 0;
        }

所以当我们没有给$this->input->set_cookie($name, $value = '', $expire = '', $domain = '', $path = '/', $prefix = '', $secure = FALSE, $httponly = FALSE)传递$expire参数的时候是不能正常设置参数的,因为这个方法调用的是php自带的setcookie()方法,在这个方法中,$expire可以传一个time()+的时间表示多久销毁,如果不传或者设置为0的话则表示当前会话,随浏览器关闭而销毁。但是不能传一个time()-的时间,不然是不能正确设置的。

所以ci3.1.3或其他一些版本要设置cookie的需要注意了,一定要加$expire参数,不然是设置不成功的。
发表于 2017-2-20 16:59:03 | 显示全部楼层
过期时间为什么不能设置成 time() - xxx 呢?
 楼主| 发表于 2017-2-21 13:53:36 | 显示全部楼层
Hex 发表于 2017-2-20 16:59
过期时间为什么不能设置成 time() - xxx 呢?

因为这个是调用php的方法,php里面不支持
发表于 2017-2-21 14:17:52 | 显示全部楼层
djtai 发表于 2017-2-21 13:53
因为这个是调用php的方法,php里面不支持

我实际测试了一下,如果过期时间早于当前时间,也就是 time() - xxx,那这个 cookie 会立即过期。另外,PHP手册上没有说不允许把过期时间设置成早于当前时间,参考 http://php.net/manual/zh/function.setcookie.php
 楼主| 发表于 2017-2-21 17:24:58 | 显示全部楼层
Hex 发表于 2017-2-21 14:17
我实际测试了一下,如果过期时间早于当前时间,也就是 time() - xxx,那这个 cookie 会立即过期。另外,P ...

手册上是说最好用time()加上希望保留的时间,如果是加上一个负数意义是什么。上个回答的确有歧义,想说的是没有什么意义,浏览器也不会保存这个cookie
发表于 2017-2-21 17:47:56 | 显示全部楼层
djtai 发表于 2017-2-21 17:24
手册上是说最好用time()加上希望保留的时间,如果是加上一个负数意义是什么。上个回答的确有歧义,想说的 ...

看了一下最新的代码,这块已经改了 https://github.com/bcit-ci/CodeI ... core/Input.php#L348 不过看起来只是改成了 1,这里的意思应该是如果你给了一个不合法的 expire 就让这个 cookie 立即过期,具体为什么要这么做,可能作者有自己的考虑。
不过,我感觉这样应该能避免一些调用 PHP 函数 setcookie 的警告或错误,毕竟 CI 做了这个判断会阻止你传给 setcookie 一个奇怪的 expire。



本版积分规则