2014-02-22 32 views
1

我有一點問題。我試圖設置一個簡單的網頁,只有三個.php頁面。我想在用戶登錄時設置會話變量$ _SESSION ['userID'],並且我希望索引頁面顯示額外信息,如果有人登錄。使用會話變量在不同頁面上使用信息

關於index.php我想展示一些信息,如果用戶登錄我想顯示一些額外的信息。 login.php - 簡單的登錄形式。 login_exe.php - 負責數據庫連接和驗證。

所以這是我的想法:

在index.php文件,檢查是否會話啓動時,如果沒有:開始。

<?php 

if (!isset($_SESSION)) { 
    session_start(); 
    echo "session started"; 
} 

以後,檢查是否$ _SESSION [ '用戶ID']包含一個值,如果是這樣:打印一個字符串

if($_SESSION['userID'] != null){ 
    echo "User logged in"; 
} 

在login_exe.php我幾乎相同的代碼:

<?php 

if (!isset($_SESSION)) { 
    session_start(); 
    echo "session started"; 
} 
在驗證功能

$_SESSION['userID'] = $data['userID']; 
header("Location: index.php"); 

問題是每個頁面上都會啓動一個新會話。我該如何解決這個問題,並且只啓動一次會話?在此先感謝

+2

首先,把'在session_start();'呼叫在上面。總是。 – 2014-02-22 11:11:13

+1

'session_start()'應該總是在文檔的頂部。而不是檢查'$ _SESSION ['key']'的整個'$ _SESSION'檢查。 –

+0

我應該刪除「if(!isset($ _ SESSION)){」子句並且只有session_start()?我是否需要在index和login_exe.php上都有session_start()? @vlzvl – Mangs

回答

1

您應該將session_start()放在使用會話的文檔之上。說,如果你有5個使用會話的.php文件,然後把5倍的session_start()放在它們之上。

這是因爲session_start()發送報頭和報頭必須在任何輸出之前被髮送(例如,任何回聲空白)。

然後,你應該使用類似isset($_SESSION["foo"])並不僅僅是整個$ _SESSION數組,其中foo是你之前設置的東西。

如果你根本不想要會話或需要重置整個陣列,只需撥打session_destroy()即可有效銷燬當前會話。當你想擺脫一把鑰匙時使用unset($_SESSION["foo"])

最後,你可能會得到奇怪的情況你不能讀你寫的會話密鑰。在這種情況下,檢查什麼是會話的路徑,如果他們寫的,或者改變自己的路徑:

$path = session_save_path();  // what is the path 

is_writable($path);     // can i write to it? 

session_save_path("my/new/path"); // change the darn path; 
            // put -even- before session_start()! 

:) 高興我幫助

0

我認爲PHP手冊是真的很好比較... ahm,所以只是閱讀有關session_start()。它說:

在session_start()創建一個會話或恢復當前的(...)

因此,所有你需要的是在session_start()在你的代碼非常早。這必須在每個請求上執行(可能包含)。

您的代碼檢查userId看起來很好,這裏有一個重要提示:您應該知道PHP中的isset(),empty()等的含義,因此始終有comparision of comparison

0

你不應該在評論中提出新的答案(編輯:問題)。像編碼一樣,在系統中一樣。

如何結束會話:

這使討論的餘地,因爲會話cookie,這是客戶端,和會話數據,這是服務器端。

我建議:

$_SESSION = null; 

理由:這將立即清除所有登錄信息和其他相關數據。它使cookie完好無損,因爲所有相關的數據都沒有了。

+0

謝謝你,雖然我在你回答之前刪除了評論。但是,謝謝! – Mangs

+0

你也不應該以用戶的身份發佈2個答案 – 2014-02-22 23:06:42

相關問題