Session & Cookie


Session 是什麼?

Session 是一種用來儲存資料(變數)以便在多個頁面上使用這些資料的方法;不同於 Cookie 的是,Session 的資料並非儲存在瀏覽器或用戶端檔案內,而是儲存於 Web Server 上。

PHP Session 又是啥?

當我們在使用網路時,Web Server 無法直接知道我們是誰亦或我們做了些什麼事,因為 HTTP 位址不是靜態的。

而 Session 變數的存在解決了這一問題,因為我們可以使用 Session 變數來儲存使用者資料(如:使用者名稱等),如此一來我們便能在多個網頁上使用這些資料。


建立 PHP Session

session_start() 為建立 session 的方法;若要設定 session 變數值則需使用 PHP 全域變數:$_SESSION

首先,我們建立一個名為 demo_session1.php 的網頁,並在網頁上建立 session 及設置一些 session 變數。

<?php // Start the session session_start(); ?> <!DOCTYPE html> <html> <body> <?php // Set session variables $_SESSION["username"] = "cmrdb"; $_SESSION["favoriteColor"] = "green"; ?> </body> </html>

session_start() 必須為檔案中的第一個 function,其前不可出現任何 HTML 標籤。

存取 PHP Session 變數

接著,我們建立另一個名為 demo_session2.php 的網頁,並在這個網頁上存取我們在第一個網頁(demo_session1.php)上設定的資料。

必須注意的是,session 變數並不會自動被傳遞到每一個新頁面,而是透過我們在每一個頁面開頭所開啟的 session 來獲取的(session_start())。

<?php session_start(); ?> <!DOCTYPE html> <html> <body> <?php // Echo session variables that were set on previous page echo "Username is " . $_SESSION["username"] . ".<br>"; echo "Favorite color is " . $_SESSION["favoriteColor"] . "."; ?> </body> </html>

另一種顯示所有 session 變數的方法為:

<?php session_start(); ?> <!DOCTYPE html> <html> <body> <?php print_r($_SESSION); ?> </body> </html>

修改 PHP Session 變數

若要修改 session 變數,只要覆寫該變數即可。

<?php session_start(); ?> <!DOCTYPE html> <html> <body> <?php // to change a session variable, just overwrite it $_SESSION["favoriteColor"] = "yellow"; print_r($_SESSION); ?> </body> </html>

摧毀 PHP Session

session_unset():移除所有全域 session 變數。
session_destroy():摧毀 session。

<?php session_start(); ?> <!DOCTYPE html> <html> <body> <?php // remove all session variables session_unset(); // destroy the session session_destroy(); ?> </body> </html>

實作練習?

使用 Session 做出註冊/登入功能
可參考: 會員登入系統


Cookie 是一種服務器為了辨別使用者身份而儲存在用戶端的小型文字檔案。每當同一台電腦向瀏覽器送出網頁請求時,也會將 cookie 一並送出。

setcookie():建立 cookie。

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

在下列範例中,我們建立一個名為 user 的 cookie 並將它的值設為 John Doe,這個 cookie 將在 30 天(86400*30)後過期,“/” 代表整個網站皆可存取這個 cookie。

<?php $cookie_name = "user"; $cookie_value = "John Doe"; setcookie($cookie_name, $cookie_value, time() + (86400 * 30), "/"); // 86400 = 1 day ?> <html> <body> <?php if(!isset($_COOKIE[$cookie_name])) { echo "Cookie named '" . $cookie_name . "' is not set!"; } else { echo "Cookie '" . $cookie_name . "' is set!<br>"; echo "Value is: " . $_COOKIE[$cookie_name]; } ?> </body> </html>

setcookie() 必須出現在 <html> 標籤之前。

在送出 Cookie 時,它的值會自動以 URL 編碼;在被讀取時,會自動被解碼。若不想讓 cookie 的值以 URL 編碼,則可使用 setrawcookie()

若要修改 cookie,僅需再用 setcookie() 去設定 cookie 即可。

<?php $cookie_name = "user"; $cookie_value = "Alex Porter"; setcookie($cookie_name, $cookie_value, time() + (86400 * 30), "/"); ?> <html> <body> <?php if(!isset($_COOKIE[$cookie_name])) { echo "Cookie named '" . $cookie_name . "' is not set!"; } else { echo "Cookie '" . $cookie_name . "' is set!<br>"; echo "Value is: " . $_COOKIE[$cookie_name]; } ?> </body> </html>

若要刪除 cookie,僅需將 setcookie() 的到期日設為一個過去的時間點。

<?php // set the expiration date to one hour ago setcookie("user", "", time() - 3600); ?> <html> <body> <?php echo "Cookie 'user' is deleted."; ?> </body> </html>

下方範例中,我們建立一個小腳本來確認 cookie 是否有被啟用;首先,使用 setcookie() 建立一個測試用的 cookie,接著計算 $_COOKIE 字串變數:

<?php setcookie("test_cookie", "test", time() + 3600, '/'); ?> <html> <body> <?php if(count($_COOKIE) > 0) { echo "Cookies are enabled."; } else { echo "Cookies are disabled."; } ?> </body> </html>

實作練習?

實作於登入頁面自動填入使用者帳密?


參考資料

W3schools PHP Tutorial