Board logo

標題: 第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 初始函數
  1. bool session_start ( void)
複製代碼
接著,加入Session變數到陣列中成為陣列元素的註標,此字串陣列註標就是Session變數名:
Sessiont_register 註冊函數
  1. bool session_register (mixed name [, mixed ...])
複製代碼
完成Session的變數註冊後才能存取Session變數資料值,例如:
  1. <?
  2. session_register("myname"); //註冊Session變數
  3. $_SESSION["mynam"]="Charles"; //設定Session變數值
  4. echo $_SESSION["mynam"];  //輸出Session變數值
  5. ?>
複製代碼
在上例中,筆者並沒有使用「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
  1. <?
  2. session_start();
  3. if (! session_is_registered("mynum"))
  4.   {
  5.    session_register("mynum");
  6.    $_SESSION["mynum"]=1;
  7.   }
  8. else
  9.   {
  10.    echo "之前人數: " . $_SESSION["mynum"] . "<br>";
  11.    $_SESSION["mynum"]++;
  12.   }
  13. $num=$_SESSION["mynum"];
  14. echo "現在人數:$num";
  15. ?>
複製代碼
當第一次進入網頁時,網頁畫面如下圖:
[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函數
  1. 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
  1. <HTML><HEAD>
  2. <TITLE>登入驗證</TITLE>
  3. </HEAD><BODY>
  4. <Center><H2>管理員登入</H2><HR>
  5. <form action="login_chk.php" method="Post">
  6. 帳號:<input type="Text" name="userid"><BR>
  7. 密碼:<input type="Password" name="pas"><BR>
  8. <input type="Submit">
  9. </form>
  10. </BODY>
  11. </HTML>
複製代碼
驗證方式很簡單,在login.php中輸入帳號與密碼,輸入的資料送交login_chk.php驗證,只要帳號密碼正確就可通過驗證,就出現「驗證通過,請繼續動作」訊息文字,否則就出現警告訊息,若已經驗證過,而再次連結login_chk.php,則出現「已驗證通過,不用驗證了,請繼續動作」訊息文字。
[attach]5549[/attach]
圖6-5   登入驗證。
login_chk.php
  1. <?
  2. session_start();
  3. if (!session_is_registered("chk") || $_SESSION["chk"] != "yes")
  4. {
  5. $msg="";
  6. if ($_REQUEST["userid"] != "charles")
  7.   {
  8.     $msg="登入帳號錯誤";
  9.   }
  10. else if ($_REQUEST["pas"] != "12345")
  11.   {
  12.     $msg="密碼輸入錯誤";
  13.   }
  14. else if ($_REQUEST["pas"] != "12345" || $_REQUEST["userid"] != "charles")
  15.   {
  16.     $msg="密碼輸入錯誤";
  17.   }
  18. else
  19.   {
  20.     $msg="驗證通過,請繼續動作";
  21.     $_SESSION["chk"]="yes";
  22.   }
  23. }
  24. else
  25. {
  26. $msg="已驗證通過,不用驗證了,請繼續動作";
  27. }
  28. ?>

  29. <HTML><HEAD>
  30. <TITLE>管理員專區</TITLE>
  31. </HEAD><BODY>
  32. <Center><H2><?=$msg?></H2><HR>
  33. </BODY>
  34. </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/)