標題:
第6章 資料儲存與檔案處理(6-1 Session記錄物件)
[打印本頁]
作者:
小誌
時間:
2011-4-19 17:50
標題:
第6章 資料儲存與檔案處理(6-1 Session記錄物件)
6-1 Session記錄物件
Session 物件為紀錄使用者的相關資訊,提供使用者再次對此網頁伺服器要求時作確認,例如使用者帳號與密碼的確認,有 Session 物件的建立,來保留身分認證的結果,則使用者不用於每一頁網頁登錄時都需輸入密碼作確認。
Session 物件是用來記錄『變數』值的, Session 物件是一對一的,對於所有的連線瀏覽者而言,都個別擁有一個『私用』的 Session 物件。
Session為一個陣列形式的記錄物件,在使用Session之前必須先初始它,也就是告知PHP我們要使用Session了:
Sessiont_start 初始函數
bool session_start ( void)
複製代碼
接著,加入Session變數到陣列中成為陣列元素的註標,此字串陣列註標就是Session變數名:
Sessiont_register 註冊函數
bool session_register (mixed name [, mixed ...])
複製代碼
完成Session的變數註冊後才能存取Session變數資料值,例如:
<?
session_register("myname"); //註冊Session變數
$_SESSION["mynam"]="Charles"; //設定Session變數值
echo $_SESSION["mynam"]; //輸出Session變數值
?>
複製代碼
在上例中,筆者並沒有使用「session_start()」函數告知PHP我們要使用Session陣列,為何能直接使用Session呢?原因在於PHP為我們預設了一個名為「PHPSESSID」的Session陣列了!不過千萬要小心!這麼做的話,在後續的程式敘述中將不能改變Session變數的值,除非您在變動Session變數值之前先行呼叫「session_start()」函數!
在實際應用時並不需要先使用「session_register()」函數先行Session變數註冊,在指定Session變數資料值時也就同時進行了Session變數註冊。
作者:
小誌
時間:
2011-4-19 17:55
實做學習:
利用Session製作「個人」計數器:
ex6_2.php
<?
session_start();
if (! session_is_registered("mynum"))
{
session_register("mynum");
$_SESSION["mynum"]=1;
}
else
{
echo "之前人數: " . $_SESSION["mynum"] . "<br>";
$_SESSION["mynum"]++;
}
$num=$_SESSION["mynum"];
echo "現在人數:$num";
?>
複製代碼
當第一次進入網頁時,網頁畫面如下圖:
[attach]5546[/attach]
圖6-1 第一次進入網頁。
當第一次進入網頁時:程式中的變數num變數值是由Session物件變數「mynum」提取而來,而Session物件變數「mynum」由於是剛建立的,所以我們將其變數值設為1,因此,變數num內的資料值是1。
當第二次進入網頁時:Session物件變數「mynum」已存在,所以可以先將其資料值印出來(之前人數),接著將mynum這個Session變數值加1再回存回去,並將其資料值指定給變數num變數且列印出來,因此網頁畫面如下圖:
[attach]5545[/attach]
圖6-2 第二次進入網頁。
作者:
小誌
時間:
2011-4-19 17:56
雖然在表面上看來,這個計數器是OK的,但是,Session 物件現在紀錄的變數資料只與目前瀏覽連線者有關,與其他的瀏覽連線者一點關係都沒有,也就是說目前所讀取的 Session 物件內容是讀取目前瀏覽連線者『私用』的 Session 物件,比較下圖兩瀏覽器畫面,不同瀏覽器執行ex6_2.php,上網者只要按下瀏覽器上的『重新整理』按鈕後,您會發現計數器將會再次的自動加一,但兩個瀏覽器的結果是不相干的,由此可證明:Session 物件紀錄的變數資料只與目前瀏覽連線者有關,與其他的瀏覽連線者一點關係都沒有。
[attach]5547[/attach]
圖6-3 不同瀏覽器獲得不同結果。
在範例ex6_2.php中使用了一個「session_is_registered()」函數,用來判斷Session變數是否已經註冊:
Sessiont_is_registered函數
bool session_is_registered (string name)
複製代碼
如果Session變數已經在Session陣列中註冊過了,則session_is_registered( )函數傳回True值,否則回傳False值。
作者:
小誌
時間:
2011-4-19 17:58
實做學習
:
利用Session製作「登入驗證」:
[attach]5548[/attach]
圖6-4 登入頁面。
login.php
<HTML><HEAD>
<TITLE>登入驗證</TITLE>
</HEAD><BODY>
<Center><H2>管理員登入</H2><HR>
<form action="login_chk.php" method="Post">
帳號:<input type="Text" name="userid"><BR>
密碼:<input type="Password" name="pas"><BR>
<input type="Submit">
</form>
</BODY>
</HTML>
複製代碼
驗證方式很簡單,在login.php中輸入帳號與密碼,輸入的資料送交login_chk.php驗證,只要帳號密碼正確就可通過驗證,就出現「驗證通過,請繼續動作」訊息文字,否則就出現警告訊息,若已經驗證過,而再次連結login_chk.php,則出現「已驗證通過,不用驗證了,請繼續動作」訊息文字。
[attach]5549[/attach]
圖6-5 登入驗證。
login_chk.php
<?
session_start();
if (!session_is_registered("chk") || $_SESSION["chk"] != "yes")
{
$msg="";
if ($_REQUEST["userid"] != "charles")
{
$msg="登入帳號錯誤";
}
else if ($_REQUEST["pas"] != "12345")
{
$msg="密碼輸入錯誤";
}
else if ($_REQUEST["pas"] != "12345" || $_REQUEST["userid"] != "charles")
{
$msg="密碼輸入錯誤";
}
else
{
$msg="驗證通過,請繼續動作";
$_SESSION["chk"]="yes";
}
}
else
{
$msg="已驗證通過,不用驗證了,請繼續動作";
}
?>
<HTML><HEAD>
<TITLE>管理員專區</TITLE>
</HEAD><BODY>
<Center><H2><?=$msg?></H2><HR>
</BODY>
</HTML>
複製代碼
作者:
小誌
時間:
2011-4-19 17:59
還有一件事要提醒您:「session_start()」函數的呼叫如同header()函數一般,只可用在尚未有任何資料輸出至瀏覽器之前才可呼叫,否則會出現如下圖的錯誤:
[attach]5550[/attach]
圖6-5_1
作者:
pix756
時間:
2012-7-26 15:52
本帖最後由 pix756 於 2012-7-26 17:15 編輯
小誌大大你好,我是使用本機的localhost會出現像下圖錯誤訊息。
[attach]11844[/attach]
請問小誌大大,我有哪裡設定錯誤嗎?
謝謝~
另外有個地方不懂就是
if($_REQUEST['userid']
<>
"charlies"){
中的
<>
是小於大於嗎?
我一直不懂,
請小誌大大為我解惑。
萬分感謝您。
作者:
小誌
時間:
2012-7-27 01:31
附圖的錯誤: 請打開資料夾的寫入權限,一般是將 everyone 設為可讀寫
以你的附圖錯誤資訊而言,是將 C:\Windows\Temp 這個資料夾設為everyone皆可讀寫
抱歉: <> 是不等於,但不是PHP語言的不等於
PHP的不等於是
!=
這篇教學誤植的部分我已更正
作者:
pix756
時間:
2012-7-30 01:15
回復
7#
小誌
TO小誌大,了解了,謝謝您細心的教學,目前我正在學習這章節。
經過這一番回答,對於!=的用意更加的深刻了。:)
歡迎光臨 麻辣家族討論版版 (http://forum.twbts.com/)