为什么cookie不能在CodeIgniter中运行?

时间:2012-03-16 20:10:33

标签: php codeigniter cookies

我使用此功能添加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?

12 个答案:

答案 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]]]]]]])