4

我确信这是 100% 错误的,所以如果有人能纠正我,将不胜感激。但是在“索引”页面上,该变量$venuedeets当前返回一个随机大写字母 C。

关于事件函数 - 我是否需要设置域,如果需要,如何将其设置为 base_url,是否可以添加自定义值并将它们附加到变量,例如venuename => $venue.

$cookie = array(
'name' => 'venue_details',
'value' => 'Hello',
'expire' => time()+86500,
'path'   => '/',
);
$this->input->set_cookie($cookie);

指数

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

$this->input->cookie('venue_details', TRUE);
$cookie2 = get_cookie('venue_details');
$data['venuedeets'] = $cookie2['value'];

谢谢。

4

2 回答 2

9

问题是您误解了 CI 的 get/set cookie 的工作原理 (*):

当您设置一个 cookie(使用$this->input->set_cookie()或等效的辅助函数)时,您将一个数组传递给它,但在内部,该数组用于分配创建 cookie 的属性。您不仅仅是将一个数组序列化为一个文件,而是创建一个带有名称的 cookie、设置过期时间并提供一些内容。

在您检索 cookie 的那一刻,通过传递其名称,您只能返回其内容,因为那是 cookie 的实际内容。同样,它不是序列化数组。

所以,来到你的代码:

$this->load->helper('cookie');
$this->input->cookie('venue_details', TRUE);
// this line is useless: the method returns a cookie, filtered for XSS, but you're 
// assigning it to nothing
$cookie2 = get_cookie('venue_details');
// this your "real" cookie access method
$data['venuedeets'] = $cookie2['value'];

这是您的错误:$cookie2is NOT an array, but a STRING: cookie 的内容。如果你var_dump($cookie2),事实上,你得到:

string(5) "Hello" 

您遇到的“随机值”问题很可能是由于在尝试访问“值”索引时,php 将索引(字符串)类型转换为整数 (0),并获取字符串的 0 索引. 在“你好”的情况下,你会得到“H”——如果你有适当的错误杠杆来显示它,再加上一个很好的警告。自己看吧。


(*)如果你很好奇,下面是访问 cookie 的方式(在 system/core/Input.php 中):

/**
* Fetch an item from the COOKIE array
*
* @access   public
* @param    string
* @param    bool
* @return   string
*/
function cookie($index = '', $xss_clean = FALSE)
{
    return $this->_fetch_from_array($_COOKIE, $index, $xss_clean);
}

以下是检索方式:

/**
 * Fetch from array
 *
 * This is a helper function to retrieve values from global arrays
 *
 * @access  private
 * @param   array
 * @param   string
 * @param   bool
 * @return  string
 */
function _fetch_from_array(&$array, $index = '', $xss_clean = FALSE)
{
    if ( ! isset($array[$index]))
    {
        return FALSE;
    }

    if ($xss_clean === TRUE)
    {
        return $this->security->xss_clean($array[$index]);
    }

    return $array[$index];
}

以及如何创建:

function set_cookie($name = '', $value = '', $expire = '', $domain = '', $path = '/', $prefix = '', $secure = FALSE)
{
    if (is_array($name))
    {
        // always leave 'name' in last place, as the loop will break otherwise, due to $$item
        foreach (array('value', 'expire', 'domain', 'path', 'prefix', 'secure', 'name') as $item)
        {
            if (isset($name[$item]))
            {
                $$item = $name[$item];
            }
        }
    }

    if ($prefix == '' AND config_item('cookie_prefix') != '')
    {
        $prefix = config_item('cookie_prefix');
    }
    if ($domain == '' AND config_item('cookie_domain') != '')
    {
        $domain = config_item('cookie_domain');
    }
    if ($path == '/' AND config_item('cookie_path') != '/')
    {
        $path = config_item('cookie_path');
    }
    if ($secure == FALSE AND config_item('cookie_secure') != FALSE)
    {
        $secure = config_item('cookie_secure');
    }

    if ( ! is_numeric($expire))
    {
        $expire = time() - 86500;
    }
    else
    {
        $expire = ($expire > 0) ? time() + $expire : 0;
    }

    setcookie($prefix.$name, $value, $expire, $path, $domain, $secure);
}
于 2013-06-13T17:51:15.133 回答
-2
$this->load->helper('cookie');
$this->input->cookie('venue_details', TRUE);
// this line is useless: the method returns a cookie, filtered for XSS, but you're 
// assigning it to nothing
$cookie2 = get_cookie('venue_details');
// this your "real" cookie access method
$data['venuedeets'] = $cookie2['value'];
于 2016-12-30T20:15:03.217 回答