php 设置cookie为空值不工作

m4pnthwp  于 2023-04-10  发布在  PHP
关注(0)|答案(5)|浏览(193)

我有这个代码我试图做一个类型的缓存系统,所以它记得城市的用户已经选择.如果用户已经选择了一个城市,它存储在会话和cookie,并会自动重定向到城市页面,如果他们已经选择了它之前.
sessions工作正常,但如果$_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']);
3hvapo4f

3hvapo4f1#

您不能使用空字符串设置cookie,因为它会删除该cookie。
关于docs
如果value参数为空字符串或FALSE,并且所有其他参数都与先前对setcookie的调用匹配,则将从远程客户端删除具有指定名称的cookie。

jgwigjjp

jgwigjjp2#

你不能将一个cookie设置为大多数falsy值来表示一个trit cookie的错误。只有'0'才能工作。使用它。

epfja78i

epfja78i3#

PHP的setcookie()不允许设置空值的cookie,但可以使用header()来设置
替换:

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

其中:

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

vwkv1x7d4#

您可以通过使用null字节作为值来将cookie设置为空值,如下所示:

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

(在php 5.6和7.2上试过)。

rslzwgfq

rslzwgfq5#

请确保将您的cookie设置为负时间:

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

相关问题