在我的第一个视图中没有设置cookie。
它应该是这样的吗?还是我弄错了
请查看下面的代码以进一步说明:
if( !get_cookie('rate') ){
$cookie_rate = array(
'name' => 'rate',
'value' => '10',
'expire' => '100000'
);
set_cookie($cookie_rate);
}
var_dump( get_cookie('rate') ); //returns ( boolean false )
if( !isset($_COOKIE['foo']) ){
$_COOKIE['foo'] = 'bar';
}
var_dump( $_COOKIE['foo'] ); // This yields string 'bar' (length=3) on the first visit
对php cookie做同样的事情会得到一个包含cookie值的数组。
- 这个问题只在第一次访问页面时存在。
这不是CodeIgniter vs PHP的问题。你只是不明白cookie是怎么工作的。
cookie是由服务器发送的报头,浏览器在后续请求时必须将其发回。$this->input->set_cookie()
和set_cookie()
发送一个cookie头。
$_COOKIES
在PHP(因此$this->input->cookie()
和get_cookie()
助手)只包含cookie, 浏览器发送。
因此,当您使用set_cookie()
设置cookie时,您将无法使用get_cookie()
,直到浏览器的下一个请求
考虑到CI的set_cookie
可能使用与PHP的setcookie()
相同的机制,手册中的这一项可能适用:
常见的陷阱
cookie在下次加载应该显示cookie的页面时才会显示。要测试是否成功设置了cookie,请在cookie过期之前检查下一个加载页面上的cookie。过期时间通过Expire参数设置。调试cookie存在的一个好方法是简单地调用print_r($_COOKIE);
我在CI手册中没有看到任何关于这种行为的提及,但很可能是同一件事。
如果我理解这一点,你试图在重新加载页面之前看到cookie的数据,这将不起作用。尝试设置cookie,重新加载页面,然后检查cookie是否有数据。
有时你还需要指定域之类的,也许它现在不适用,但如果它们突然停止工作,以后知道可能会很好,从CI-documentation:
$cookie = array(
'name' => 'The Cookie Name',
'value' => 'The Value',
'expire' => '86500',
'domain' => '.some-domain.com',
'path' => '/',
'prefix' => 'myprefix_',
'secure' => TRUE
);
$this->input->set_cookie($cookie);
另外,如果您不需要任何特别来自cookie的内容,请考虑使用会话类而不是cookie,因为它们更安全。http://codeigniter.com/user_guide/libraries/sessions.html
这可能不是问题所在,事实上这就是cookie的工作原理,它的设置和在下一个页面加载时似乎从那时起就可以看到