Cookie未设置或第一次不工作


Cookie not setted or not working the first time

在每个页面上,我设置了一个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>

阅读文档:

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

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

这样做:

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

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

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

 setcookie("Cookiename", $value, time()+1800, "/", $_SERVER['SERVER_NAME'], FALSE, TRUE);
 header('Location:'.$_SERVER['REQUEST_URI']);

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');
        }
}

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

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"]);