0

我想跨多個頁面使用會話變量。但是,當我從設置的原始頁面轉到服務器上的另一個頁面時,變量消失。我已經確認變量最初是在第一頁上設置的,但是當我嘗試在後續頁面上訪問它們時,它們沒有任何價值。如果我訪問session_id()它不同於我在第一頁上設置的那個。IE不通過PHP會話變量

這裏是什麼,我試圖做一個簡化版本: (第一個網頁會話變量被設置)

<?php 
ini_set("display_errors", "1"); 
error_reporting(E_ALL); 
session_start(); 
$_SESSION['id'] = session_id(); 
header('Location: pagetwo.php'); 
die(); 
?> 

(第二頁,我嘗試訪問會話變量)

<?php 
ini_set("display_errors", "1"); 
error_reporting(E_ALL); 
session_start(); 
echo "SESSION[id] = ".$_SESSION['id']."<br>"; 
?> 

$_SESSION['id']回報空白,我有一個輸出錯誤,指出:

注意:未定義指數:ID在C:\ Program Files文件\ Apache軟件基金會\ APACHE2.2 \ htdocs中\ pagetwo.php第5行

現在這裏是事情變得有點怪異。這在所有瀏覽器中都不會發生(只有IE8和Firefox3)。我可以在Chrome 15和Firefox 7中訪問會話變量。另外,我有兩個運行Apache和PHP的不同服務器。我遇到這些問題的服務器運行PHP 5.2.17,但是,使用運行PHP 5.2.9的其他服務器,我可以在所有瀏覽器類型的所有頁面上訪問會話變量。

似乎兩個服務器之間的PHP.ini文件會有所不同,但是,它們之間的會話設置是相同的。

我不確定是否有其他人遇到類似的問題,IE8無法訪問PHP 5.2.17中的會話變量,但我搜索了過去兩天的表單,並且找不到其他任何內容。我希望我只是錯過了一些非常簡單的事情,有人可以指引我走向正確的方向。

+1

使用開發工具,你可能會看到會話cookie不會存儲在IE瀏覽器...會話數據不特定瀏覽器,因爲它是服務器端,但是會話的整個前提是基於cookie。你也應該使用isset()來避免異常。 – Fosco

回答

3

我懷疑這是因爲在將用戶重定向到pagetwo.php之前沒有關閉會話變量。我建議在代碼中設置ID值後,在session_write_close()中添加。它確保將更改添加到會話變量中,並可用於在稍後的頁面上進行檢索。

<?php 
session_start(); 
$_SESSION['id'] = session_id(); 
session_write_close(); 
header('Location: pagetwo.php'); 
?> 

你可以閱讀更多關於session_write_close()PHP.net,如果您向下滾動到用戶發表的評論,你會被一個對這個問題非常名爲JP人看到評論。

乾杯!

4

我在開發facebook應用程序時遇到了同樣的問題 - IE沒有發送會話cookie,因此每個頁面請求都開始了一個新的請求。如下頭解決了這個問題對我來說:

header('P3P: CP="IDC DSP COR CURa ADMa OUR IND PHY ONL COM STA"');