2013-02-07 34 views
2

我開始編寫一個Web應用程序,該應用程序在$_SESSION變量中存儲某些用戶信息。通常的東西 - user_id,用戶名等

然後我開始使用變量來存儲某些導航信息。例如,$_SESSION['organisation_id']這樣,無論用戶在哪個應用程序中,我都可以輕鬆地將'organisation_id'添加到任何表中,而無需在每個頁面請求中解析'organisation_id'(例如index.php?organisation_id = 456 & var2 = 6或anotherpage.php?organisation_id = 456 &等)

所有虎背熊腰,腳蹬dory的,直到用戶打開一個新的標籤,並開始導航到其他組織,從而因此創建一個新的$_SESSION['organisation_id']價值和創造的原標籤上史詩般的失敗。

我能想到的唯一解決方案是回到將organisation_id放入應用程序中的每個窗體和導航元素中,但是我認爲必須有更優雅的解決方案。

通常情況下,我在StackOverflow上找到了所需的所有東西,但對這個問題的回答仍然無法解決!

+0

如果你移動到另一個頁面是否發生頁面加載或一切發生在Jquery/JS? –

回答

0

「我能想到的唯一解決方案是回到將Organisation_id放入應用程序中的每個表單和導航元素中,但是我認爲必須有更優雅的解決方案。」

不,沒有。

0

也許你可以檢查$ _SESSION ['organisation_id']是否存在,如果是的話,你可以用不同的名稱在會話中編寫新的變量,等等。

0

目前無法解決問題。但爲了避免將來發生類似的任務,我建議將所有文件分成不同的包含文件。 所以,即使你必須添加一些變量到整個網站,你可以修改1個文件並完成它,而不是再次完成整個事情。

+0

這幾乎是我們所擁有的,所以它不是一個大問題。但該應用程序使用了很多ajax,因此調用會話變量時無需添加到每個GET都非常簡潔。整潔 - 但有瑕疵: -/ – Andre

+0

我明白錯過了一個會話變量,不得不一次又一次地做同樣的事情。 我不完全得到傳遞會話變量通過GET查詢雖然..的引用.. –

0

我認爲這是一個邏輯問題。該會話代表用戶的狀態。這是因爲HTTP本質上是一個無狀態協議(它不知道誰是誰,僅僅是請求和響應)。因此,organization_id狀態。如果用戶只能登錄到一個組織,那麼您只需將它存儲在會話變量中並像使用它一樣。如果用戶註銷並重新登錄另一個organization_id,則只有最後一個保持可用纔有意義。

如果您的應用程序必須支持多個organization_id's,您應該在會話處理中反映該邏輯,爲實例保存一組組織ID(而不是一個)。但是,您必須更改您的應用程序以允許用戶從組織導航到組織等。如果屏幕只顯示其中一個,則讓用戶一次能夠進入兩個組織是沒有意義的。

0

您可以在該用戶名等的onblur值到會話存儲和您可以在點擊一個標籤之前得到它

(IE)使用jQuery/JavaScript的u能得到用戶名的那個值等而onblur並將其存儲在會話中。

0

您可以通過簡單的移動,你目前投入$_SESSION陣列分爲子陣列內$_SESSION的數據,這樣就可以在會話一次存儲多組數據的解決這個問題。

這將最終看起來有點像這樣:

$_SESSION[organisations] = array(
    '456' => array('organisationID'=>456, 'otherdata'=>'blah'), 
    '678' => array('organisationID'=>678, 'otherdata'=>'blah'), 
    ...etc... 
); 

這將讓你保持在一次會話數據的多個機構單位的數據,所以你不必裝載全部的數據每次。

但是,是的,你需要發送與每個請求相關organisationID,以便您的代碼知道哪些會話數據的工作。你無法真正解決這個問題。每個請求都需要告訴PHP哪些orgID可以使用。

這裏的缺點是,通過在會話中存儲所有數據,會話數據使用了更多內存,因此如果用戶在會話期間可能瀏覽很多組織,我建議通過刪除一段時間未使用的數據來限制$_SESSION的大小。

另一個缺點是,如果這是一個多用戶系統,將數據存儲在會話中意味着它不會意識到其他用戶做出的任何更新。如果您要在每個請求中加載數據庫中的新數據,那麼會爲數據庫創建更多的工作,但它可以確保爲用戶提供的數據始終是最新的。