會話用法
PHP 4.0有一個一直為人所期待的特性,這就是PHP的會話(session)支援。相比之下,PHP 3.0的使用者則不得不使用第三方的程式庫或完全不能具備這項功能。缺乏會話支援能力是PHP最大的缺陷之一,也是它最受人指摘的地方。不過,隨著會話支援從早期測試版本的PHP 4.0開始就成為後者的一部分,這個障礙也蕩然無存了。
有了會話支援,你就可以在使用者訪問網路站台期間維持使用者特定的變數而無須象現在這樣:設定多個cookie、使用隱蔽表單域或在你可能經常要連結的一個資料庫記憶體儲資訊等。
在一個頁面上啟動會話就是告訴PHP引擎:你或是要開始一個會話(如果先前沒有)或是繼續目前的會話:
session_start();
啟動一個會話將通過cookie向使用者發送一個標識字串(比如940f8b05a40d5119c030c9c7745aead9);在伺服器端則會建立一個與此相匹配的臨時檔案,在以上例子中,其名稱則是這個樣子:sess_940f8b05a40d5119c030c9c7745aead9。該檔案包含了註冊的會話變數及其賦值。
使用者訪問計數器可謂使用會話的最常見執行個體:
啟動你的PHP模組,保證PHP代碼是檔案的第一行:沒有空白、沒有HTML輸出等等。這是因為,當會話函數發出一個檔案頭的時候,如果你在session_start()函數之前發送了空白或者HTML代碼,系統即會報錯。
<?
// if a session does not yet exist for this user, start one
session_start();
接下來,註冊一個名為count的變數。
session_register('count');
註冊變數就等於告訴了PHP:只要會話存在,一個名叫count的變數也就同時存在。目前這個變數還沒有賦值。不過,如果你對它進行加1運算的話,該值即可被賦值為1:
$count++;
把以上各行代碼一起考慮,實際上你已經啟動了一個會話(如果先前沒有)、為某個使用者指派了會話id、註冊了名為count的變數並把$count加1以表示使用者首次訪問頁面:
要顯示使用者在當前會話下訪問頁面的次數,你只要列印出$count的值即可:
echo "<P>You've been here $count times.</p>";
整個訪問計數器代碼如下所示:
<?
session_start();
session_register('count');
$count++;
echo "<P>You've been here $count times.</p>";
?>
如果你重載以上指令碼,你可以觀察到計數值增加了。有意思吧?
你還可以在會話中註冊數組。假設你有一個名為$faves的數組:
$faves = array ('chocolate','coffee','beer','linux');
你可以象其他單個變數一樣註冊該數組:
session_register('faves');
索引數組和索引其他單變數沒有什麼差別,比如$faves這樣。如果你的使用者想在Web網站的一個頁面上展示自己的愛好,那麼你完全可以把他喜歡的東西註冊為一個名為$faves會話變數,然後你可以在其他頁面上把這些值列印出來:
<?
session_start();
echo "My user likes:
<ul>";
while (list(,$v) = each ($faves)) {
echo "<li>$v"; }
echo "</ul>";
?>
這就是你要得到的:使用者愛好的漂亮列表。
會話變數不能被查詢字串所覆蓋,這就是說,你不能鍵入http:///www.yourdomain.com/yourscript.php?count=56 這樣的指令為註冊會話變數$count分配新值。這一點對安全而言是非常重要的:你只能在伺服器端指令碼上修改或者刪除(未註冊的)會話變數。
如果你想完全刪除某個會話變數,你可以從系統中取消註冊該變數:
session_unregister('count');
徹底刪除某個會話,比如按下Logout按鈕就是這樣的例子,那麼你可以寫下如下的代碼:
session_destroy();
使用會話來儲存變數值可以讓我們免於編寫資料庫處理代碼的痛苦,這樣也就不會過度增加對系統的負載,同時也減少了對專有資料庫文法的使用範圍,再說,你也不再非得向訪問網站的使用者發送一大堆cookie了。而現在呢——只需要一個cookie、一個變數就全部搞定了,真是一滴水就映出了全部光輝!實在是不能比這更簡單的了。