2013-06-03 76 views
0

在每個頁面上,我都設置了一個cookie來爲與該會話相對應的標題按鈕着色。 問題是,我第一次在不同的部分打開一個頁面,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> 

回答

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

hello there!and how I can do this in JavaScript?因爲即時通訊設置Cookie,第一次! –

1

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

你能帶我一個JavaScript的例子嗎? – Perocat

+0

是的,我確定我可以給一個例如。 –

2

閱讀the documentation

一旦餅乾已經確定,他們可以在接下來的頁面加載與$ _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設置的第一次。

+0

這是一個解決方案,但我不確定它是最好的...'header(「Location:」。$ _ SERVER [「PHP_SELF」])''。 我也應該只重定向一次,否則我創建一個循環。 – Perocat

+0

@Perocat正如我所說的:「當cookie第一次被設置時」,即「if(!isset($ _ COOKIE [」lng「]))...'。 –

+0

這不起作用。如果我爲「en」部分設置cookie,則切換到「de」部分。Cookie已設置,但不是正確的Cookie。所以頁面不會刷新,並且錯誤的按鈕會被着色! – Perocat

0

只需簡單地重新加載頁面,每次你設置你的cookies。

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