---
title: Session & Cookie
tags: 學習筆記
---
# Session & Cookie
---
## Session 是什麼?
Session 是一種用來儲存資料(變數)以便在多個頁面上使用這些資料的方法;不同於 Cookie 的是,Session 的資料並非儲存在瀏覽器或用戶端檔案內,而是儲存於 Web Server 上。
## PHP Session 又是啥?
當我們在使用網路時,Web Server 無法直接知道我們是誰亦或我們做了些什麼事,因為 HTTP 位址不是靜態的。
而 Session 變數的存在解決了這一問題,因為我們可以使用 Session 變數來儲存使用者資料(如:使用者名稱等),如此一來我們便能在多個網頁上使用這些資料。
---
### 建立 PHP Session
<font color=orange>session_start()</font> 為建立 session 的方法;若要設定 session 變數值則需使用 PHP 全域變數:<font color=orange>$_SESSION</font>。
首先,我們建立一個名為 demo_session1.php 的網頁,並在網頁上建立 session 及設置一些 session 變數。
```php=
<?php
// Start the session
session_start();
?>
<!DOCTYPE html>
<html>
<body>
<?php
// Set session variables
$_SESSION["username"] = "cmrdb";
$_SESSION["favoriteColor"] = "green";
?>
</body>
</html>
```
:::warning
<font color=orange>session_start()</font> 必須為檔案中的第一個 function,其前不可出現任何 HTML 標籤。
:::
### 存取 PHP Session 變數
接著,我們建立另一個名為 demo_session2.php 的網頁,並在這個網頁上存取我們在第一個網頁(demo_session1.php)上設定的資料。
必須注意的是,session 變數並不會自動被傳遞到每一個新頁面,而是透過我們在每一個頁面開頭所開啟的 session 來獲取的(<font color=orange>session_start()</font>)。
```php=
<?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=
<?php
session_start();
?>
<!DOCTYPE html>
<html>
<body>
<?php
print_r($_SESSION);
?>
</body>
</html>
```
### 修改 PHP Session 變數
若要修改 session 變數,只要覆寫該變數即可。
```php=
<?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
<font color=orange>session_unset()</font>:移除所有全域 session 變數。
<font color=orange>session_destroy()</font>:摧毀 session。
```php=
<?php
session_start();
?>
<!DOCTYPE html>
<html>
<body>
<?php
// remove all session variables
session_unset();
// destroy the session
session_destroy();
?>
</body>
</html>
```
## 實作練習?
使用 Session 做出註冊/登入功能
可參考: [會員登入系統](https://ithelp.ithome.com.tw/articles/10207241)
---
## Cookie 是什麼?
Cookie 是一種服務器為了辨別使用者身份而儲存在用戶端的小型文字檔案。每當同一台電腦向瀏覽器送出網頁請求時,也會將 cookie 一並送出。
### 用 PHP 建立 Cookie
<font color=orange>setcookie()</font>:建立 cookie。
``` setcookie(name, value, expire, path, domain, secure, httponly) ```
### PHP 建立/存取 Cookie
在下列範例中,我們建立一個名為 user 的 cookie 並將它的值設為 John Doe,這個 cookie 將在 30 天(86400\*30)後過期,“/” 代表整個網站皆可存取這個 cookie。
```php=
<?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>
```
:::warning
<font color=orange>setcookie()</font> 必須出現在 \<html> 標籤之前。
:::
在送出 Cookie 時,它的值會自動以 URL 編碼;在被讀取時,會自動被解碼。若不想讓 cookie 的值以 URL 編碼,則可使用 <font color=orange>setrawcookie()</font>。
### 修改 Cookie 值
若要修改 cookie,僅需再用 <font color=orange>setcookie()</font> 去設定 cookie 即可。
```php=
<?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
若要刪除 cookie,僅需將 <font color=orange>setcookie()</font> 的到期日設為一個過去的時間點。
```php=
<?php
// set the expiration date to one hour ago
setcookie("user", "", time() - 3600);
?>
<html>
<body>
<?php
echo "Cookie 'user' is deleted.";
?>
</body>
</html>
```
### 確認 Cookie 是否有被啟用
下方範例中,我們建立一個小腳本來確認 cookie 是否有被啟用;首先,使用 <font color=orange>setcookie()</font> 建立一個測試用的 cookie,接著計算 $_COOKIE 字串變數:
```php=
<?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](https://www.w3schools.com/php/default.asp)