Session 是一種用來儲存資料(變數)以便在多個頁面上使用這些資料的方法;不同於 Cookie 的是,Session 的資料並非儲存在瀏覽器或用戶端檔案內,而是儲存於 Web Server 上。
當我們在使用網路時,Web Server 無法直接知道我們是誰亦或我們做了些什麼事,因為 HTTP 位址不是靜態的。
而 Session 變數的存在解決了這一問題,因為我們可以使用 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 標籤。
接著,我們建立另一個名為 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>
若要修改 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>
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>
實作於登入頁面自動填入使用者帳密?