为什么不';t在CodeIgniter中cookie工作


Why doesn't cookie work in CodeIgniter?

我使用这个函数来添加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?

写入cookie的函数中内置CI的问题。我改变的是现在我正在设置带有的cookie

setcookie($name,$value,$expire,$path); 

功能并通过将其取回

$this->input->cookie('user',TRUE); 

这工作真不错!

您不能在同一个http请求上获取cookie。设置cookie后,必须通过Set-Cookie标头将其发送到浏览器。在http事务完成之前,您不能发送标头。之后,浏览器将获得cookie,并在下一个请求中通过Cookie标头将其发送到服务器。

来自PHP.NET

直到下一次加载cookie应该可见的页面时,cookie才会变为可见。若要测试是否成功设置了cookie,请在cookie过期之前在下一个加载页面上检查cookie。Expire时间是通过Expire参数设置的。

因此,cookie将在下一页加载时可用。

切换到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';

希望这能帮助到别人。

我遇到了这个问题,发现Codeigniter需要一个到期值,而不仅仅是文档中所述的名称和值。即

$cookie = array(
'name'  => 'logged',
'value'  => 1,
'expire' => '86500',
);
set_cookie($cookie);

检查config.php cookie设置。如果设置错误,cookie将不起作用。默认值适用于我本地使用您的代码

$config['cookie_prefix']    = '';
$config['cookie_domain']    = '';
$config['cookie_path']      = '/';

此外,如果要加密任何内容,则应该加密密码。而且你不应该使用md5。使用CI的内置加密($this->encrypt->encode();),它使用更安全的算法[别忘了在config.php中设置加密密钥]。

检查config.php中的cookie_secure指令。对于非https域,它必须为FALSE。

如果域不是https,并且在config.php中将cookie_secure设置为TRUE,则不会设置cookie。更改为FALSE,它将在http和https中设置。

这是由于函数set_cookie()关于$expire参数的初始化错误引起的,默认情况下设置为空字符串,但由于它重新发送时间戳,因此必须默认设置为0。看看那里的修正

系统/core/Input.php 上的第342行

https://github.com/diegomariani/CodeIgniter/commit/64ac9e711100605f41a3b37bc897a12063fed70b

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');

输出=pradip

Codeigniter在其代码中已经添加了过期的time(),因此您不需要在cookie配置中添加time()

更改:

 'expire' => time()+1000

收件人:

'expire' => 1000

还可以使用过程风格的cookie助手函数,如(set_cookie, get_cookie, delete_cookie..),因为它们会自动添加cookie前缀配置,而对于OOP函数($this->input->set_cookie etc.),您每次也必须手动键入cookie前缀配置。

codeigniter中有一个错误:它在读取cookie时不使用cookie_prefix(在编写cookie时使用)请参阅函数cookie 中的/system/core/Input.php

首先确保包含cookie助手:

$this->load->helper('cookie');

设置cookie如下:

set_cookie($cookie_name, $value, $time);

代码点火器中的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]]]]]]])