我使用此功能添加cookie,它在浏览器选项中可以看到完美添加。
function login($username,$password){
$cookieUsername = array(
'name' => 'user',
'value' => md5($username),
'expire' => time()+1000,
'path' => '/',
'secure' => TRUE
);
$cookiePassword = array(
'name' => 'pass',
'value' => $password,
'expire' => time()+1000,
'path' => '/',
'secure' => TRUE
);
$this->input->set_cookie($cookieUsername);
$this->input->set_cookie($cookiePassword);
}
我无法从此功能中取回cookie:
echo $this->input->cookie('user');
请帮助 - 如何从CodeIgniter获取cookie?
答案 0 :(得分:9)
CI内置函数编写cookie的问题。我改变的是现在我正在设置cookie whith
setcookie($name,$value,$expire,$path);
功能并通过
重新获得它$this->input->cookie('user',TRUE);
这是件好事!
答案 1 :(得分:8)
您无法在同一个http请求中获取Cookie。设置cookie后,必须通过Set-Cookie
标头将其发送到浏览器。在http事务完成之前,您无法发送标头。之后浏览器将获取cookie,并在下一个请求时,浏览器将通过Cookie
标头将其发送到服务器。
来自PHP.NET
在下次加载可以看到Cookie的网页之前,Cookie才会显示。要测试cookie是否已成功设置,请在cookie过期前检查下一个加载页面上的cookie。过期时间通过expire参数设置。
因此cookie将在下一页加载时可用。
答案 2 :(得分:3)
我遇到了这个问题,发现Codeigniter需要一个到期值,而不仅仅是文档中所述的名称和值。即
$cookie = array(
'name' => 'logged',
'value' => 1,
'expire' => '86500',
);
set_cookie($cookie);
答案 3 :(得分:2)
切换到PHP的setcookie()
而不是CI的$this->input->set_cookie()
对我不起作用;在下一个请求之前,cookie仍然无法使用。这是有道理的,因为CI的方法实际上生成了setcookie()
,因此它们在功能上是等价的。但是,通过执行以下操作,我能够立即开始工作:
//this is the original code, which is made available next request:
$this->input->set_cookie('foo', 'bar', 86500);
//this is what I added, to make the cookie available immediately:
$_COOKIE['foo'] = 'bar';
希望能有所帮助。
答案 4 :(得分:1)
检查config.php cookie设置。如果设置错误,cookie将无法正常工作。默认设置适用于本地使用您的代码
$config['cookie_prefix'] = '';
$config['cookie_domain'] = '';
$config['cookie_path'] = '/';
另外,如果你要加密任何东西,你应该加密密码。你不应该使用md5。使用CI的内置加密($this->encrypt->encode();
),它使用更安全的算法[不要忘记在config.php中设置加密密钥]。
答案 5 :(得分:1)
这是由函数set_cookie()关于$ expire参数的初始化错误引起的,默认情况下设置为空字符串,但默认情况下必须设置为0,因为它不存在时间戳。 看那里的修正
系统/核心/ Input.php上的第342行
https://github.com/diegomariani/CodeIgniter/commit/64ac9e711100605f41a3b37bc897a12063fed70b
答案 6 :(得分:1)
检查config.php中的cookie_secure指令。对于非https域,它必须为FALSE。
如果domain不是https,并且在config.php中将cookie_secure设置为TRUE,则不会直接设置cookie。更改为FALSE,它将同时在http和https中设置。
答案 7 :(得分:0)
codeigniter中存在一个错误:它在读取cookie时没有使用你的cookie_prefix(当编写cookie时,它确实如此)在函数cookie中看到/system/core/Input.php
答案 8 :(得分:0)
首先确保您包含cookie帮助程序:
$this->load->helper('cookie');
并像这样设置cookie:
set_cookie($cookie_name, $value, $time);
答案 9 :(得分:0)
public function cookie()
{
$this->load->helper('cookie');
$name = 'user';
$value = 'pradip';
$expire = time()+1000;
$path = '/';
$secure = TRUE;
setcookie($name,$value,$expire,$path);
$this->load->view('welcome_message');
}
在echo $this->input->cookie('user');
output = pradip
答案 10 :(得分:0)
Codeigniter
在其代码中已添加time()
到期,因此您无需在Cookie配置中添加time()
。
更改:强>
'expire' => time()+1000
要强>
'expire' => 1000
还使用程序样式cookie辅助函数,例如(set_cookie, get_cookie, delete_cookie..
),因为它们会自动添加cookie前缀配置,而使用OOP格式($this->input->set_cookie etc.
),则必须手动输入每次都有cookie前缀配置。
答案 11 :(得分:0)
codeigniter中的Cookies没什么问题,它可以按预期正常运行,
问题出在您的语法上,您在expire
中设置的到期日期不正确。
因为codeigniter将您提供的值添加到当前时间,所以如果您要设置从现在起的30天有效期,则只需要在到期时提供类似86400 * 30的值即可
然后它将正常运行,例如:'expire'=> 86400 * 30
当您提供time()+ 1000之类的值时,它会在time()中增加那么多的值,因此它成为当前时间的两倍,并且浏览器将其视为不正确的值,
并且当您有一个错误的到期值时,它默认为0,它设置为会话的长度,
,因此当会话过期时,意味着浏览器关闭或窗口关闭,由于会话过期,cookie也会重置。
所以正确的示例如下:
$cookie = array(
'name' => 'user',
'value' => md5($username),
'expire' => 86400*30,
'secure' => TRUE
);
set_cookie($cookie);
或者另一种方式是:
set_cookie('user',md5($username),86400*30);
//syntax
//set_cookie($name[, $value = ''[, $expire = ''[, $domain = ''[, $path = '/'[, $prefix = ''[, $secure = NULL[, $httponly = NULL]]]]]]])