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