--- 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)