Cookie没有设置或第一次不工作

时间:2013-06-03 12:37:22

标签: php session cookies isset

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

答案 0 :(得分:2)

阅读the documentation

  

设置好Cookie后,可以使用$ _COOKIE或$ HTTP_COOKIE_VARS数组访问下一页加载。注意,$ _COOKIE等超级全局变量在PHP 4.1.0中可用。 Cookie值也存在于$ _REQUEST。

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

请改为:

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

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

答案 1 :(得分:0)

Cookie在客户端计算机中设置,因此您无法同时从服务器设置和检查,而是使用JavaScript。

你可以使用这个js函数Taken from this post

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

答案 2 :(得分:0)

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

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

答案 3 :(得分: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"]);