資料庫程式設計 – PHP+MySQL 第 四 章 PHP 語言  上一頁    

 

4-5 Cookie Session

內容:

  • 4-5-1 Cookie 與 Session 區別

  • 4-5-2 Cookie 宣告與讀取

  • 4-5-3 Cookie 簡單操作

  • 4-5-4 Cookie 陣列操作

  • 4-5-5 Cookie 有效時間

  • 4-5-6 Session 宣告與讀取

  • 4-5-7 範例研討:Session 變數共用

4-5-1 Cookie Session 區別

瀏覽器與網頁伺服器之間是以『要求/回應』(Request/Response)方式操作,當客戶端瀏覽器有需求時,提出網頁要求(Request),則伺服端回應(Response)網頁給客戶端。基本上,每一個要求/回應動作都是獨立性的,完成之後不會保留任何訊息,又稱為『 HTTP 無狀態』(HTTP stateless)。譬如,瀏覽器執行會員登入網頁時,要求使用者登入帳號/密碼,並經由伺服端確認,登入網頁結束之後,不再保留使用者輸入訊息,下次再要求登入時,必須重新輸入帳號/密碼。

許多情況需要保留一些通用訊息,譬如登入帳號、密碼、IP 位址、計數器等等。而且訊息大多以文字格式存取。以確保不同網頁之間可以共同存取。但這些訊息要存在甚麼地方呢?如儲存於瀏覽器(客戶端硬碟)則稱為『Cookie』,如儲存於伺服端(Apache) 則稱為『Session』,兩者差異如下:

(1)     Cookie Session 都是變數型態,以供儲存網頁存取訊息使用。

(2)     Cookie 變數儲存於瀏覽器(客戶端)Session 變數儲存於網頁伺服器(伺服端)

(3)     Cookie 變數存活時間大多是宣告時設定,超過時間或刻意刪除才會被消除。Session 變數大多依照『會議連線』(Session)存活時間而定。當產生一條 Session 連線時,伺服器會給予一個 Session ID (識別碼),之間也許會有多個不同網頁的存取,所產生的 Session 變數也都共同使用,當 Session 連線結束時,所有該 Session ID 下的變數也隨之被刪除。

(4)     伺服端大多會同時處理多個客戶端要求,伺服端利用 Session ID 來辨識哪一個客戶端,不至於產生混擾。

(5)     Cookie 變數儲存於瀏覽器上,一般 JavaScriptJquery、、等前端發展工具都可以存取,因此安全較低。Session 變數儲存於伺服端,一般較難存取到,相對的安全性較高。

4-5-2 Cookie 宣告與讀取

產生 Cookie 變數很簡單,它只有一個 PHP 函數,名為:

setcookie(name, value, expire, path, domain, secure)

呼叫函數執行後,回應 "True" 表示成功,否則 "False" 表示失敗,個個參數說明如下:

參數名稱

說明

name

必須,Cookie 變數名稱。

value

必須,Cookie 變數的內容(字串格式)

expire

選項,Cookie 變數的有效期。

path

選項,Cookie 變數儲存路徑。

domain

選項,Cookie 共用網域。

secure

選項,可否通過 HTTPS 連線傳輸 cookie

Cookie 變數名稱為:『$_COOKIE["name"]』,變數型態又分為兩種:

1.        單一變數:如同一般變數宣告方法,如:setcookie("var1", "300");,則表示宣告一個名為 var1 Cookie 變數,其內容為 300。如下:

l   宣告:setcookie("var1", "300");

l   讀取:echo $_COOKIE["var1"];  => 300

2.        陣列變數:如同一般陣列宣告方法,如:setcookie("arry1[three]", "good"),其中變數名稱 (arry1) 元素名稱 (three) 可以任意指定,並沒有先後順序關係,如下:

l   宣告:setcookie("arry1[one]", "Luck");

l   讀取:echo $_COOKIE["arry1"]["one"];   => Luck

4-5-3 Cookie 簡單操作

(A) 程式範例:Ex4_15.php

吾人用一個簡單範例來說明 Cookie 操作方法。如下:

1

2

3

4

5

6

7

8

9

<?php

       $setVar = setcookie("var1", "php-cookie"); // 宣告 cookie 變數

       if ($setVar) {                        // 是否宣告成功

               if (isset($_COOKIE["var1"]))      // 是否以設定內容

                       echo "Cookie 變數 var1= ".$_COOKIE["var1"]."<br>";

               else

                       echo "Cookie 儲存成功,請重新整理頁面 <BR>";

       }

?>

l   2:利用 setcookie() 函數宣告 Cookie 變數,成功傳回 "True",否則 'False"

l   5:測試變數內容是否設定。

l   第一次執行時,雖然已產生成功,但未擷取到內容,網頁重新整理後,即可取得內容。

(B) 執行結果:

重新整理頁面後,出現:

(C) 由網頁查詢 Cookie 變數

1.        點選網址前位置,如下:

2.        可以找到該網頁的 Cookie,並且可以將它刪除。

4-5-4 Cookie 陣列操作

(A) 程式範例:Ex4_16.php

吾人用一個簡單範例來說明 Cookie 陣列操作方法。如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

14

<?php

    // 宣告 Cookie 陣列

       setcookie("var1[1]", "Cookie-1");

       setcookie("var1[one]", "Cookie-one");

       setcookie("var1[three]", "Cookie-three");

       // 測試 Cookie 變數是否存在

       if (isset($_COOKIE["var1"])) {

               foreach($_COOKIE["var1"] as $name => $value)

                       echo "$name : $value <br>";

       }else {

               echo "儲存成功,請重新整理網頁 <br>";

       }

?>

1.  程式說明 式說明:

l   3~5:利用 setcookie() 產生 3 個陣列 Cookie 變數,名稱為 var1[1]var1[one]var1[three],其中元素可以任意指定。

l   8:測試變數是否設定成功。

l   9~10:利用 foreach() 迴圈列印出陣列內容。

2.        第一次執行結果:如沒出現此畫面,請由網頁刪除 Cookie 再重新執行就會出現。

3.        重新整理後結果

4-5-5 Cookie 有效時間

宣告產生 Cookie 變數時沒有指定它的有效時間,則該變數可以存留多久?大多依照瀏覽器設定,或者關閉瀏覽器就自動刪除,但還是要指定存活時間較安全。存活時間大多以『秒』為單位計算,宣告格式如下:

setcookie(name, value, expire)

譬如:希望它存活時間為 1 小時 (3600 ),則存活時間為 expire =  time()+3600,其中 time() 為產生時的時間,再加上 3600 (1 小時)

(A) 程式範例:Ex4_17.php

吾人希望網頁上記錄『本人』當天瀏覽次數,但過了今日該紀錄就歸零重新計算。如下:

1

2

3

4

5

6

7

8

9

10

11

12

13

<?php

       $Today = date("y-m-d 23:59:59");

   echo "計數器截止時間是".$Today."<br>";

       if (isset($_COOKIE["counter"])) {

               $count = $_COOKIE["counter"];

               $count = $count + 1;

               setcookie("counter", $count, strtotime($Today));

               echo "您今日瀏覽次數為".$count." <br>";

       } else {

               setcookie("counter", "0", strtotime($Today));

       header("Location: Ex4_17.php");

       }

?>

1.   程式說明 說明:

l   2:利用 date("y-m-d 23:59:59") 函數設定截止時間。

l   7:利用 strtotime($Today) 將其轉換成 Unix 時間格式。

l   11:利用 header("Location: Ex4_17.php")函數傳回客戶端網頁位址,再重新整理一次。

2.        第一次執行結果:如沒出現此畫面,請由網頁刪除 Cookie 再重新執行就會出現。

3.        重新整理後:(或重新開啟瀏覽器,再瀏覽該網址)

4-5-6 Session 宣告與讀取

Session 變數記錄著使用者與網站之間『會議連結』(Session),可能會重複使用的訊息,譬如:登入帳號/密碼、登入 IP 位址、或在電商平台紀錄著客戶訂購貨品清單(購物車)、、等等。有了 Session 變數可以減少許多客戶重複輸入的次數,但當『會議連結』終止時,這些變數也隨之消失。

基本上,Session 變數是紀錄於伺服端 (Apache Server),每一個客戶的『會議連結』都有一個唯一識別的 Session ID。雖然伺服端同時處理多條客戶連線,但都有唯一的 Session ID,之間的 Session 變數也不會產生混擾。

常用的 Session 相關函數有:

函數名稱

說明

session_start()

宣告 session 開始並產生 session ID,此函數之前不可有任何輸出。

session_id()

取得 session ID 識別值。

session_unset()

釋放所有 session 變數。

session_destory()

註銷 session ID,刪除伺服器上所有 session 變數。

Session 變數

$_SESSION["變數名稱"]

(A) Session 變數的宣告與讀取

說明如下:

l   啟動連線session_start();

l   變數名稱$_SESSION["變數名稱"],如 $_SESSION["name"] = "tsnien";

l   陣列名稱$_SESSION["陣列名稱"]["元素名稱"] ,如:

Ø   $_SESSION ["teachers"]["name"]= "粘添壽";

Ø   $_SESSION["teachers"]["no"] = "235";

l   讀取變數echo $_SESSION["變數名稱"]

l   刪除變數unset($_SESSION["變數名稱"]),如 unset($_SESSION["name"]);

l   刪除所有變數session_unset();

(B) Session 的有效期限

發生以下四種情況之一時,Session 與其中資料會消失:

l   客戶端關閉目前使用的瀏覽器。

l   關閉網頁伺服器。

l   客戶端超過預設時間未向伺服器提出請求,一般預設時間為 30 分鐘。

l   所執行程式結束 Session

4-5-7 範例研討:Session 變數共用

(A) 程式範例:Ex4_18.php

接下用一個簡單範例來說明 Session 連結的啟動與操作方法。為了驗證 Session 變數儲存於伺服端,吾人用兩個網頁 (Ex4_18_1.php Ex4_18_2.php) 共同存取 Session 變數,如下:

(B) 第一頁網頁:Ex4_18_1.php

程式功能是:進入網頁時立即啟動 Session,接著測試 $_SESSION["time"] 變數是否以產生,如果以產生,則讀取並顯示『前網頁的時間』,再產生目前時間 ($dateTime),並將其寫入 $_SESSION["time"] 變數內。最後請求連結下一個網頁,重點說明如下。

l   1:啟動 Session 連結:session_start()

l   9: 讀取 Session 變數並將轉換成文字化格式 ($timeFormat)

l   17: 將目前時間寫入 Session 變數內。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

20

21

<?php session_start(); ?>

<html><head>

<title> 第一頁網頁 </title></head>

<body>

<?php

       echo "第一頁網頁 <BR>";

       if (isset($_SESSION["time"])) {

               $timeFormat = $_SESSION["time"] -> format ("y-m-d h:i:s");

               echo "前網頁時間是".$timeFormat." <br>";

       }

       $dateTime = new DateTime("now");

       $timeFormat = $dateTime -> format ("y-m-d h:i:s");

       echo "現在的時間是".$timeFormat.",並將它寫入 Session 變數內 <br>";

       $_SESSION["time"] = $dateTime;

       echo "<a href='Ex4_18_2.php'> 回第二頁 </a> <br>";

?>

</body>

</html>

(C) 第二頁網頁:Ex4_18_2.php

程式功能幾乎與第一頁網頁 (Ex4_18_1.php) 相同,不再另外說明。

1

2

3

4

5

6

7

8

9

10

11

12

13

14

15

16

17

18

19

<?php session_start(); ?>

<html><head>

<title> 第二頁網頁 </title></head>

<body>

<?php

       echo "第二頁網頁 <BR>";

       if (isset($_SESSION["time"])) {

               $timeFormat = $_SESSION["time"] -> format ("y-m-d h:i:s");

               echo "前網頁時間是".$timeFormat." <br>";

       }

       $dateTime = new DateTime("now");

       $timeFormat = $dateTime -> format ("y-m-d h:i:s");

       echo "現在的時間是".$timeFormat.",並將它寫入 Session 變數內 <br>";

       $_SESSION["time"] = $dateTime;

       echo "<a href='Ex4_18_1.php'> 回第一頁 </a> <br>";

?>

</body>

</html>

 (D) 執行結果

l   執行第一頁網頁:

l   執行第二頁網頁 

l   查閱網頁儲存變數:吾人可發現在網頁上找不到該變數,它是儲存在伺服端。

主講人:粘添壽博士

course_db 關聯圖

 

資料庫程式設計 - PHP+MySQL: