setcookie到空值不工作

时间:2012-01-08 05:19:52

标签: php cookies

我有这个代码我试图为一种缓存系统做,所以它记住用户选择的城市。如果用户选择了一个城市,则会将其存储在会话和Cookie中,并且如果他们之前已选择过,则会自动将其重定向到城市页面。

会话工作正常,但如果$ _GET [' city']变量为空,它似乎没有将Cookie设置为空值...

继承我的代码:

function gen_url ($city)
{
    $url = 'http://www.mysite.com';

    if (!empty($city)) $url .= "/c-$city";

    return $url;
}

function set_cache ($variable, $value)
{
    $_SESSION[$variable] = $value;
    setcookie($variable, $value, time() + 31536000);
}

$redirect = false;
$redirect_array['city'] = '';

if (!empty($_GET['city']))
{
    $sql = mysql_query("select * from `cities` where `slug`='".mysql_real_escape_string($_GET['city'])."'");

    if (mysql_num_rows($sql) != 0)
    {
        while ($row = mysql_fetch_assoc($sql))
        {
            foreach ($row as $k => $v)
                $city[$k] = $v;
        }

        $redirect_array['city'] = $city['slug'];
    }
    else
    {
        $redirect = true;
    }
}   

if ($redirect)
{
    header('Location: '.gen_url($redirect_array['city']);
    die();
}

set_cache('city', $redirect_array['city']);

5 个答案:

答案 0 :(得分:5)

您无法使用空字符串设置Cookie,因为它会删除Cookie。

来自docs

  

如果value参数是空字符串,或者为FALSE,则为所有其他字符串   参数匹配上一次调用setcookie,然后使用   指定的名称将从远程客户端删除。

答案 1 :(得分:2)

您无法将cookie设置为大多数假值,以指示trit cookie的错误。只有'0'才有效。使用它。

答案 2 :(得分:1)

PHP的setcookie()不允许您将Cookie设置为空值。但是您可以使用header()

替换:

setcookie($variable, $value, time() + 31536000);

具有:

header('set-cookie: '.rawurlencode($variable).'='.rawurlencode($value).'; max-age=31536000', false);

答案 3 :(得分:0)

确保将Cookie设置为负时间:

setcookie($variable, '', -1);

答案 4 :(得分:0)

您可以使用空指针作为Cookie的值来设置空值

像这样:

    setrawcookie('testEmptyCookie', "\x00", time() + 3600, '/');

(在5.6、7.2版上尝试)