2012-08-01 58 views
13

PHP會話變量我有一個使用AJAX來加載新的PHP文件,並更新顯示一個頁面的網站。不保留與阿賈克斯

我開始在主頁上我的PHP會話,但是當我使用Ajax來更新內部HTML我需要新的PHP文件的會話變量被加載。

這篇文章是與此類似:PHP Session Variables Not Preserved。但我檢查,我的php.ini具有session.use_cookies = 1

主頁PHP:

<?php 
session_start(); 
if(isset($_SESSION['views'])) 
{$_SESSION['views']=$_SESSION['views']+1;} 
else 
{$_SESSION['views']=1;} 
?> 

用戶輸入後,我使用Ajax調用PHP文件並加載網頁的小節:

<?php  
if(isset($_SESSION['views'])) 
    { echo "Views: " . $_SESSION['views'];} 
    else 
    { echo "Views: NOT SET";} 
?> 

有人可以告訴我我錯過了什麼重要的步驟嗎?謝謝。

更新:在向主頁面和子頁面添加session_id()調用後,我看到兩個頁面都具有相同的Session_ID。然而,它仍然不能拉動會話變量,如果我給它賦值,兩個相同的名稱會話變量保持獨立於另一個。

回答此問題創建的問題:我發現我必須在我的php.ini文件中設置靜態session_save路徑。對於大多數付費虛擬主機服務,它們只有會話的默認容器,但受到負載平衡的影響。什麼是相關的。

+0

當我在新文件中使用session_start()創建一個新的會話。反正有鏈接這些會話嗎? – Quinma 2012-08-01 23:07:49

+0

會話的「鏈接」是會話cookie,它應該位於HTTP請求的Cookie標頭中... – Peter 2012-08-01 23:15:36

+0

您沒有使用負載平衡的網絡服務器,是嗎? (當爲PHP會話使用默認的基於文件的後備存儲時,主機自然無法共享會話信息) – Peter 2012-08-02 05:25:16

回答

24

我認爲你是Ajax調用的頁面上缺少session_start()

您需要:

<?php 
session_start(); 
if(isset($_SESSION['views'])) 
    { echo "Views: " . $_SESSION['views'];} 
    else 
    { echo "Views: NOT SET";} 
?> 
+0

這會創建一個新會話,$ _SESSION ['views']對於主頁面和子頁面而言是不同的數字。 – Quinma 2012-08-01 23:09:59

+0

這是否位於服務器上的其他子域或路徑上?如果cookie匹配,它應該使用相同的會話。 – drew010 2012-08-01 23:13:23

+0

我只是從兩個文件中運行session_id()並且它是相同的。但它仍然不會拉動變量。 – Quinma 2012-08-01 23:41:14

5

您需要在其他PHP文件啓動會話session_start()也,你是通過AJAX調用之一。

1

在使用付費的網絡託管服務的默認會話保存路徑自動設置像這樣的情況:

http://php.net/session.save-path 
session.save_path = "/tmp/" 

您需要在靜態路徑的地方,你的根文件夾中有。

1

我遇到了什麼,我想今天2012的IIS服務器上運行PHP 7時是同樣的問題。

我說:

if(!isset($_SESSION)) 
{ 
    session_start(); 
} 

每個AJAX文件的開始,但一直recieving以下PHP的通知:

PHP Notice: A session had already been started - ignoring session_start() 

搜索導致我這個線程其中指出我的位解決我遇到的問題的正確方向。希望以下信息可以幫助其他人遇到同樣的問題。

檢查session.save_path的值設置,在我的案例℃之後:\ WINDOWS \ TEMP,我想最好還是檢查權限匹配,我被運行IIS的用戶帳戶的文件夾中。

在我的情況下,事實證明,我爲會話存儲提名的目錄(在php.ini中)沒有分配給它的用戶(安全權限)與正在運行IIS站點的用戶(安全權限)相同。

有趣的是,在添加新用戶權限之前,如果不使用AJAX請求,會話工作正常。但是,在更正權限問題之前,AJAX沒有選擇會話。添加運行IIS的同一用戶帳戶立即解決了此問題。

0

在嘗試通過ajax調用登錄之前,需要初始化會話。

session_start(); 

在開始登錄ajax調用的頁面頂部初始化。

因此,SESSIONID將被創建並存儲瀏覽器cookie。並且在ajax調用期間與請求標頭一起發送,如果您對同一個域執行ajax請求

對於後續的ajax調用,瀏覽器將使用最初創建並存儲在瀏覽器cookie中的SESSIONID,除非我們清除瀏覽器cookie或者做註銷(或設置另一個cookie)

0

您正試圖在ajax調用中使用您的應用程序中的現有會話數據。要做到這一點,改變你如何調用在session_start像這樣:

// With ajax calls 
if (session_status()==1) { 
    session_start(); 
} 

使得當AJAX調用到PHP需要現有的會話數據的腳本,session_status後使用session_start。

http://php.net/session_status