0

在每个页面上,我都设置了一个 cookie 来为与该会话对应的标题按钮着色。问题是我第一次在不同部分打开页面时,cookie 仍然是旧的,彩色按钮也是。然后,如果我再次单击相同的按钮,则正确设置了 cookie。为什么?

这是我的代码:

<?php
include $_SERVER['PERCORSO_GLOBALS'];

$pagelevel = '1';
require_once ROOT_DIR.'/administrator/flock/session_users.php';

setcookie('lng', 'it');
?>

<head>
    ...
</head>

<body>
<?php
$currentpage = basename(__FILE__);

function colorButtonHeader($section){
    if(isset($_COOKIE['lng'])){
        if($_COOKIE['lng'] == $section){
            echo "buttonon";
        }
    }else{
        echo 'Error';
        die($refresh);
    }
}
?>

<div id="button"> 
  <ul>
    <li><a href=<?=$index_admin?>><span class="<?php colorButtonHeader('home') ?>">HOME</span></a></li>
    <li><a href=<?=$italiano?>><span class="<?php colorButtonHeader('it') ?>">ITALIANO</span></a></li>
    <li><a href=<?=$tedesco?>><span class="<?php colorButtonHeader('de') ?>">DEUTSCH</span></a></li>
    <li><a href=<?=$francese?>><span class="<?php colorButtonHeader('fr') ?>">FRANÇAIS</span></a></li>
  </ul> 
</div> 


?>

<div id="content">

     ...

</div>
</body>
</html>
4

4 回答 4

3

阅读文档

一旦设置了 cookie,就可以在下一页加载时使用 $_COOKIE 或 $HTTP_COOKIE_VARS 数组访问它们。注意,像 $_COOKIE 这样的超全局变量在 PHP 4.1.0 中可用。Cookie 值也存在于 $_REQUEST 中。

当您使用 时setcookie(),您正在设置一个 cookie,但该$_COOKIE数组仅包含现有的 cookie(它是在页面加载时创建的)。

改为这样做:

setcookie('lng', 'it');
$_COOKIE["lng"] = "it";

header("Location: ".$_SERVER["PHP_SELF"]);或者在第一次设置 cookie 时直接重定向到页面本身 ( )。

于 2013-06-03T12:46:21.260 回答
0

只需在您每次设置 cookie 时重新加载页面即可。

 setcookie("Cookiename", $value, time()+1800, "/", $_SERVER['SERVER_NAME'], FALSE, TRUE);
 header('Location:'.$_SERVER['REQUEST_URI']);
于 2013-06-03T12:54:19.747 回答
0

我找到了这个解决方案,这似乎是改进最快的:

function colorButtonHeader($section){
    if(isset($_COOKIE['lng'])){
        if($_COOKIE['lng'] == $section){
            echo "buttonon";
            setcookie('lng', '', time()-3600);
        }
    }else{
        header("Location: ".$_SERVER["REQUEST_URI"]);
        // header("Location: ".$_SERVER["PHP_SELF"]);

    }
}

每次使用后销毁cookie。因此,在每个页面加载时,cookie 都没有准备好使用。这意味着页面重新加载,但只有一次,因为那时 cookie 可用。它将被使用并再次被销毁。

编辑

如果您通过 URL 传递参数,那么当您使用时:

header("Location: ".$_SERVER["PHP_SELF"]);

这些参数正在丢失。所以最好使用:

header("Location: ".$_SERVER["REQUEST_URI"]);
于 2013-06-03T15:26:39.020 回答
0

Cookie 是在客户端机器中设置的,因此您不能同时从服务器设置和检查,请改用 JavaScript。

你可以使用这个 js 函数取自这篇文章

function readCookie(name) {
  var nameEQ = name + "=";
  var ca = document.cookie.split(';');
  for(var i=0;i < ca.length;i++) {
      var c = ca[i];
      while (c.charAt(0)==' ') c = c.substring(1,c.length);
       if (c.indexOf(nameEQ) == 0) return c.substring(nameEQ.length,c.length);
    }
  return null;
}

function colorButtonHeader(selected){
   if(readCookie('lng') == selected ){
         alert('cookie is set ');
     }else{
           alert('Wrong language');
        }
}
于 2013-06-03T12:45:05.797 回答