3

我遇到了 cookie 的情况,我的 cookie 将存储颜色名称或根本不存储任何内容。所以让我们这样解释。我的 cookie 与我网站的外观有关,我的网站有 3 种外观:

  • 正常(根本没有 cookie)
  • 灰色(cookie 设置为“imgit_style”,值为“grey”)
  • 倒置(cookie 设置为“imgit_style”,值为“倒置”)

我有 3 个按钮可以触发样式切换。第一个按钮是Normal,它删除 cookie 并使外观正常。

第二个按钮用于Gray,它创建名称为 'imgit_style' 的 cookie 并为其添加一个值 - “grey”。

这两个彼此完全可以正常工作,但是在设置倒置cookie 时它就不起作用了!它只是在我单击第三个按钮时被删除,该按钮实际上应该用Inverted替换Gray(如果已设置),或者如果第一个按钮未设置,则创建 cookie。

希望我足够清楚。这是我的代码:

样式.php

<?php
$style = '';
if (!isset($_COOKIE['imgit_style']))
{
    if (isset($_POST['green']))
    {
        setcookie('imgit_style', '', time()-31556952);
        $style = '';
    }
    if (isset($_POST['grey']))
    {
        setcookie('imgit_style', 'grey', time()+31556952);
        header('Location: ' . $home_action);
    }
    if (isset($_POST['inverted']))
    {
        setcookie('imgit_style', 'inverted', time()+31556952);
        header('Location: ' . $home_action);
    }
}
else if (isset($_COOKIE['imgit_style']))
{   
    $style =  '_' . $_COOKIE['imgit_style'];
    if (isset($_POST['green']) && $_COOKIE['imgit_style'] == 'grey' || $_COOKIE['imgit_style'] == 'inverted')
    {
        setcookie('imgit_style', '', time()-31556952);
        $style = '';
        header('Location: ' . $home_action);
    }
    if (isset($_POST['grey']))
    {
        if ($_COOKIE['imgit_style'] == 'inverted')
        {
            setcookie('imgit_style', '', time()-31556952);
            if (!isset($_COOKIE['imgit_style']))
            {
                setcookie('imgit_style', 'grey', time()+31556952);
                header('Location: ' . $home_action);
            }
        }
    }
    if (isset($_POST['inverted']))
    {
        if ($_COOKIE['imgit_style'] == 'grey')
        {
            setcookie('imgit_style', '', time()-31556952);
            if (!isset($_COOKIE['imgit_style']))
            {
                setcookie('imgit_style', 'inverted', time()+31556952);
                header('Location: ' . $home_action);
            }
        }
    }
}
?>

头文件.php

<!DOCTYPE HTML>
<html>
<head>
<?php include('styles.php'); ?>
<title>IMGit.org - the image host</title>

<link rel="stylesheet" type="text/css" href="css/<?php echo 'style' . $style . '.css'; ?>" media="screen" />
<link rel="icon" href="css/images/<?php echo 'favicon' . $style . '.png'; ?>" type="image/x-icon" />
<link rel="shortcut icon" href="css/images/<?php echo 'favicon' . $style . '.png'; ?>" type="image/x-icon" />
</head>

<body>
<div class="style-switcher">
<form action="" method="post">
<table>
    <tr>
        <td>
            <span class="normal" style="vertical-align: text-top;">Switch style:</span>
            <input type="submit" name="green" class="style_green-button" value="green" />
            <input type="submit" name="grey" class="style_grey-button" value="grey" />
            <input type="submit" name="inverted" class="style_inverted-button" value="inverted" />
        </td>
    </tr>
</table>
</form>
</div>
4

2 回答 2

1

问题看起来是,尽管您调用setcookie()空白,cookie 值$_COOKIE仍然保留该请求的值。在重新加载页面之前,它的内容不会改变。因此,您继续检查!isset($_COOKIE['imgit_style']),但除非您明确取消设置,否则该值仍将设置。

if (isset($_POST['grey']))
{
    if ($_COOKIE['imgit_style'] == 'inverted')
    {
        // No need to unset the old one, just overwrite the new one
        // setcookie('imgit_style', '', time()-31556952);
        setcookie('imgit_style', 'grey', time()+31556952);
        header('Location: ' . $home_action);
    }
 }
 if (isset($_POST['inverted']))
 {
    if ($_COOKIE['imgit_style'] == 'grey')
    {
        // No need to unset the old one, just overwrite the new one
        // setcookie('imgit_style', '', time()-31556952);
        setcookie('imgit_style', 'inverted', time()+31556952);
        header('Location: ' . $home_action);
    }
 }

更新

这可能是问题所在......您没有括号组可以对该if()语句进行逻辑分组:

if (isset($_POST['green']) && $_COOKIE['imgit_style'] == 'grey' || $_COOKIE['imgit_style'] == 'inverted')

这里发生的是任何时候$_COOKIE['imgit_style'] == 'inverted',即使$_POST['green']未设置,后续代码也会运行并删除 cookie。看起来您希望将它们组合('grey' || 'inverted')在一起:

if (isset($_POST['green']) && ($_COOKIE['imgit_style'] == 'grey' || $_COOKIE['imgit_style'] == 'inverted'))
于 2012-07-29T13:41:42.703 回答
1

不需要您使用的长条件,因为它会产生不必要的过程并使代码无法测试。

考虑以下代码:

if (isset($_POST['green']))
{
    setcookie('imgit_style', '', time() + 3600);
    $style = 'green';
}
if (isset($_POST['grey']))
{
    setcookie('imgit_style', 'grey', time() + 3600);
    $style = 'grey';
}
if (isset($_POST['inverted']))
{
    setcookie('imgit_style', 'inverted', time() + 3600);
    $style = 'inverted';
}

根据设置按钮,它将相应地设置cookie。将 cookie 设置为''将在用户端将其删除,您可以使用 获取它print_r($_COOKIES);,但只能在页面重新加载之后。

当然,要检查green设置,您将需要使用isset($_COOKIES['imgit_style']),因为在这种情况下,cookie 将被取消设置。

通过使用上述方法,以下只是一个附录:

if (isset($_POST['green']) && $_COOKIE['imgit_style'] == 'grey' || $_COOKIE['imgit_style'] == 'inverted')

这有点狡猾,因为您使用的是OR ||AND &&没有分组括号,让自己受操作员偏好的支配。您应该根据要执行的操作对条件进行分组。

例如,如果您想让条件块green在设置为 POST 但 cookie 当前为grey或时运行inverted,则需要使用if ( (isset($_POST['green'])) && ($_COOKIE['imgit_style'] == 'grey' || $_COOKIE['imgit_style'] == 'inverted') ). 据我所知,这是每个布尔代数的默认行为:

  • 首先我们检查是否$_POST['green']设置。
    • 如果FALSE,则整个条件都不可能为真,因此这是一个退出点。
    • 如果TRUE,我们检查 cookie 是否为greyOR inverted
      • 如果其中任何一个是TRUE,则等式将是TRUE并且条件分支运行。
      • 如果两者都是FALSE,则等式将是FALSE,给我们一个退出点。
于 2012-07-29T14:24:31.537 回答