麻辣家族討論版版's Archiver

小誌 發表於 2011-4-19 17:50

第6章 資料儲存與檔案處理(6-1 Session記錄物件)

[color=DarkRed][size=4][b]6-1   Session記錄物件[/b][/size][/color]
Session 物件為紀錄使用者的相關資訊,提供使用者再次對此網頁伺服器要求時作確認,例如使用者帳號與密碼的確認,有 Session 物件的建立,來保留身分認證的結果,則使用者不用於每一頁網頁登錄時都需輸入密碼作確認。
Session 物件是用來記錄『變數』值的, Session 物件是一對一的,對於所有的連線瀏覽者而言,都個別擁有一個『私用』的 Session 物件。
Session為一個陣列形式的記錄物件,在使用Session之前必須先初始它,也就是告知PHP我們要使用Session了:

[color=Magenta]Sessiont_start 初始函數[/color][code]bool session_start ( void)[/code]接著,加入Session變數到陣列中成為陣列元素的註標,此字串陣列註標就是Session變數名:
[color=Magenta]Sessiont_register 註冊函數[/color][code]bool session_register (mixed name [, mixed ...])[/code]完成Session的變數註冊後才能存取Session變數資料值,例如:[code]<?
session_register("myname"); //註冊Session變數
$_SESSION["mynam"]="Charles"; //設定Session變數值
echo $_SESSION["mynam"];  //輸出Session變數值
?>[/code]在上例中,筆者並沒有使用「session_start()」函數告知PHP我們要使用Session陣列,為何能直接使用Session呢?原因在於PHP為我們預設了一個名為「PHPSESSID」的Session陣列了!不過千萬要小心!這麼做的話,在後續的程式敘述中將不能改變Session變數的值,除非您在變動Session變數值之前先行呼叫「session_start()」函數!
在實際應用時並不需要先使用「session_register()」函數先行Session變數註冊,在指定Session變數資料值時也就同時進行了Session變數註冊。

小誌 發表於 2011-4-19 17:55

[color=Magenta]實做學習:[/color]
利用Session製作「個人」計數器:
ex6_2.php[code]<?
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";
?>[/code]當第一次進入網頁時,網頁畫面如下圖:
[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變數是否已經註冊:
[color=Magenta]Sessiont_is_registered函數[/color][code]bool session_is_registered (string name)[/code]如果Session變數已經在Session陣列中註冊過了,則session_is_registered( )函數傳回True值,否則回傳False值。

小誌 發表於 2011-4-19 17:58

[color=Magenta]實做學習[/color]:
利用Session製作「登入驗證」:
[attach]5548[/attach]
圖6-4   登入頁面。
login.php[code]<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>[/code]驗證方式很簡單,在login.php中輸入帳號與密碼,輸入的資料送交login_chk.php驗證,只要帳號密碼正確就可通過驗證,就出現「驗證通過,請繼續動作」訊息文字,否則就出現警告訊息,若已經驗證過,而再次連結login_chk.php,則出現「已驗證通過,不用驗證了,請繼續動作」訊息文字。
[attach]5549[/attach]
圖6-5   登入驗證。
login_chk.php[code]<?
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>[/code]

小誌 發表於 2011-4-19 17:59

還有一件事要提醒您:「session_start()」函數的呼叫如同header()函數一般,只可用在尚未有任何資料輸出至瀏覽器之前才可呼叫,否則會出現如下圖的錯誤:
[attach]5550[/attach]
圖6-5_1

pix756 發表於 2012-7-26 15:52

[i=s] 本帖最後由 pix756 於 2012-7-26 17:15 編輯 [/i]

小誌大大你好,我是使用本機的localhost會出現像下圖錯誤訊息。

[attach]11844[/attach]

請問小誌大大,我有哪裡設定錯誤嗎?

謝謝~

另外有個地方不懂就是

if($_REQUEST['userid'][color=Red]<>[/color]"charlies"){

中的[color=Red]<>[/color]是小於大於嗎?

我一直不懂,

請小誌大大為我解惑。

萬分感謝您。

小誌 發表於 2012-7-27 01:31

附圖的錯誤: 請打開資料夾的寫入權限,一般是將 everyone 設為可讀寫
以你的附圖錯誤資訊而言,是將 C:\Windows\Temp 這個資料夾設為everyone皆可讀寫

抱歉: <> 是不等於,但不是PHP語言的不等於
PHP的不等於是[color=Red] !=[/color]
這篇教學誤植的部分我已更正

pix756 發表於 2012-7-30 01:15

[b]回復 [url=http://forum.twbts.com/redirect.php?goto=findpost&pid=41348&ptid=3163]7#[/url] [i]小誌[/i] [/b]

TO小誌大,了解了,謝謝您細心的教學,目前我正在學習這章節。

經過這一番回答,對於!=的用意更加的深刻了。:)

頁: [1]

麻辣家族討論版版為 麻辣學園 網站成員  由 昱得資訊工作室 © Since 1993 所提供