使用者狀態管理(session support)是 PHP 4.0 一個讓大家期待已久的新功能。在 PHP 3.0 的時代,程式設計者必須使用其它人寫好的函式函式庫來實作狀態管理功能,或者就乾脆放棄這項功能不用算了。而狀態管理功能的缺乏事實上是 PHP 3.0 最讓人感到失望的地方之一。不過現在狀況已經改變,從 PHP 4.0 的早期測試版開始,使用者狀態管理就已經成為 PHP 內建的功能之一了。
你可以使用狀態管理功能來管理使用者從進入網站開始一直到離開網站為止這段期間內的所有相關變數(只要使用者沒有離開網站,那麼這些變數就都可以取用,不會因為使用者離開某個單一頁面而造成資料消失),而不需要儲存許多cookie 或使用隱藏窗體字段,甚至將這些變數儲存在資料庫裡面,造成資料庫伺服器的大量負載。
一旦你在網站中的某一頁啟動狀態管理,PHP 引擎便會開始紀錄使用者狀態(如果對這個使用者來說系統還沒開始紀錄該訪客的狀態的話),或者繼續紀錄某個先前已經啟動的使用者狀態。要啟動PHP 的狀態管理功能,你可以使用下面這個語法:
session_start();
一旦啟動狀態管理,PHP 會透過cookie 傳送一個獨特的狀態碼(這個程式碼看起來會像是:940f8b05a40d5119c030c9c7745aead9)給使用者,同時在伺服器這端,PHP 引擎會自動產生一個檔名與狀態代碼相對應的暫存文字檔案(如:sess_940f8b05a40d5119c030d5119c030fead,該程式儲存設計者。在這個使用者狀態紀錄中所註冊的所有變數。
談到使用者狀態管理,最常使用的例子便是一個頁面存取計數器(access counter)了:現在我就開始教大家撰寫 PHP 程式碼。
特別注意
在你嘗試啟動使用者狀態紀錄之前,千萬不能夠輸出任何內容(不能有空格,TAB 甚至換行等等空格符,也不能有任何HTML 卷標,任何內容都不行)給瀏覽器。這是因為狀態管理相關函數會送出 HTTP 表頭(header)資訊給瀏覽器,如果在送出 HTTP 表頭資訊給瀏覽器之前已經有其它內容被輸出的話,系統將會出現錯誤訊息。
如果該使用者的狀態管理尚未啟動的話,以下這行程式會啟動該使用者的狀態管理:
session_start();
接下來,註冊一個名為count的變數:
session_register('count');
一旦你註冊了一個變量,PHP 便會在從用戶進入網站一直到離開網站的整個瀏覽過程中自動替你維護這個變數的值,你可以隨時取用這些註冊過的變數。剛註冊好的變數並沒有指定任何值給它,不過一旦我們增加count 變數的值,它的值便會是1 了:
$count ;
把這些程式碼組合起來,我們的程式碼就會做下面這些事情了:啟動使用者狀態紀錄功能(如果對該使用者而言尚未啟動的話),指定一個獨一無二的狀態碼(session id)給該使用者,註冊一個名為count 的變量,並且在每次使用者瀏覽到該頁面的時候,將變數$count 的值加一,這個值就可以用來記錄該使用者瀏覽過該頁面的次數了。
如果要將使用者這次的瀏覽歷程中觀看了該頁面多少次,我們只需要將變數$count 的值打印出來就行了:
echo "<P>您已經瀏覽這個頁面$count 次了。 session_register('count');
$count ;
echo "<P>您已經瀏覽此頁$count 次了。</p>";
?>
如果你不斷重新載入這個頁面,你會發現畫面上顯示的瀏覽次數會不斷的增加。除了註冊單純的變數以外,我們也可以註冊一個陣列(array)到使用者狀態紀錄中。假設我們有下面這個名為$faves 的陣列:
$faves = array ('古典音樂','旅遊','唱歌','Linux');
註冊數組的做法和註冊其它單純變數是完全一樣的:
session_register('faves');
註冊完成陣列以後,往後的程式碼裡面要參考到該陣列的做法也沒有不同,只要單純地叫用$faves 這個變數就行了。假設你的用戶在網站中某個頁面窗體裡頭選擇了一些他所喜歡的東西,而且你將這些項目通過$faves 數組註冊到該用戶的狀態紀錄裡面,那麼在網站中其它頁面你可以很容易地把這些項目顯示在畫面上:
<?
session_start();
echo "我的訪客喜歡的東西是:<ul>";
while (list( $v) = each ($faves)) {
echo "<li>$v</li>"; }
echo "</ul>";
?>
就這麼輕輕鬆鬆的,你就可以把訪客喜歡的東西顯示在網頁上了。
使用者狀態紀錄所註冊的變數是無法用查詢字串(query string)來蓋過的,比方說,使用者無法直接在瀏覽器的地址列輸入下面的URL:
http:///www.yourdomain.com/yourscript.php?count=56 來企圖蓋過原本註冊在使用者狀態紀錄中的$count 變數的值。這是一個非常重要的安全觀念:只有你自己能夠在你的程式裡面註冊或刪除使用者狀態紀錄中的變量,其它使用者無法透過 URL 後面的查詢字串企圖混淆這些變數的值。
要刪除原本註冊過的使用者狀態變量,你可以使用下面的語法:
session_unregister('count');
要將整個使用者狀態記錄變數全部刪除並且停止紀錄,請使用下面的語法:
session_destroy();
結語:
適當地善用使用者狀態紀錄功能的好處多多:它可以讓我們不須將使用者狀態資料儲存在資料庫中,減少資料庫伺服器的負荷。它也可以讓我們不需要自己撰寫長長的程式碼來透過cookie 紀錄這些使用者狀態變數(而且,這樣一來我們也不用在網站的隱私權聲明裡頭花上很長的篇幅來解釋為什麼當使用當者登入網站的時候,我們要儲存五十個cookie 到他們的硬碟裡面去了)。這項功能讓我們只需要一個 cookie 來儲存一個變數(session id)就行了,其它所有的資訊都透過一個精巧無比的機制來幫我們紀錄,讓我們的工作變得再簡單不過了!