Cookie 存取Cookie Cookie有效時間 Session 存取Session session 函數
關於 Cookie 與 Session 使用者在瀏覽網頁時並不是一直與伺服器保持 在連線的狀態下,事實上當瀏覽者送出需求到 伺服器端處理後將結果回傳顯示,就已經結束 與伺服器的連線。 當需要新資料或是更新顯示內容時,都必須重 新載入頁面或是重新送出需求。 HTTP 之無狀態(Stateless)特性
為什麼要使用 Cookie 與 Session? 例如:會員系統 當會員以帳號密碼登入系統後,程式有兩個方式來記 住登入會員的資料: 在登入者的電腦中放入一個小檔案來記憶 Cookie 在伺服器的記憶體產生一個空間來記憶 Session
Cookie 簡介 Cookie 是將少量的資料儲存在遠端的個人電腦 中的技術。
Chrome 設定
存取Cookie 存入Cookie可利用setcookie()函數 注意事項: setcookie() 必須在任何輸出(echo, print)及 <html><head>之前,否則Cookie 的設定都 會失敗。 Cookie內容設定必須等到下次讀取網頁 時才會看到內容的改變。
存取Cookie setcookie() 函數 功能: 設定一個 cookie 於遠端電腦中 格式: boolean setcookie ( 變數名稱 [, 存入值 [, 有效時間 [, 路徑 [, 領域 [, 安全性]]]]]) 變數名稱: 設定 Cookie 的名稱。 存入值: 設定存入變數的值。 有效時間: 設定Cookie 變數的生命週期。 路徑: 存放 Cookie 的路徑。 領域: 說明 Cookie 的領域。 安全性設定: 1 : 必須藉由 https 安全連線才可存入 Cookie。 否則設定為 0。
設定Cookie 範例 setcookie ("A", "10"); setcookie ("B", "20", time()+3600); 設定名稱為A的 Cookie, 其內容為 10。 setcookie ("B", "20", time()+3600); 設定名稱為 B, 其值為 20, 有效時間為一個小時。 setcookie ("C", "Hello", time()+7200, "./test/", ".abc.def.tw", 1); 設定有效時間二小時名稱為 C 的 Cookie, 存放於路 徑 ./test/下, 領域為 .abc.def.tw,並必須使用安全連線。
取出cookie 利用全域變數$_COOKIE陣列取出cookie, 取得儲存於遠端電腦中的 Cookie. Ex. $lang = $_COOKIE['language'];
Cookie 範例 存取Cookie 範例 1: <?php 2: setcookie("A","10"); 3: setcookie("B","Hello, I am B."); 4: echo "我已設定 Cookie "; 5: ?> 1: <?php 2: echo "A = ". $_COOKIE['A'] . "<p>"; 3: echo "B = ". $_COOKIE['B'] . "<p>"; 4: echo "取出 Cookie"; 5: ?>
http://ycchen.im.ncnu.edu.tw/www2011/lab/php/cookie.zip <?php if (!isset($_COOKIE["cnt"])) { setcookie("cnt", "1"); $msg = "Welcome to Visit us!"; } else { $cnt = $_COOKIE["cnt"]; $cnt++; setcookie("cnt", $cnt); $msg = "This is your {$cnt}-th visit!"; } ?> <!DOCTYPE html> <html> <head> <meta charset="UTF-8"> <title>Cookie, Visit count</title> </head> <body> <div id="content"> echo $msg; </div> </body> </html>
Cookie有效時間 預設Cookie 有效時間為關閉瀏覽器時即失效 設定有效時間兩種方法: time()+秒數 例如: time()+3600 有效時間為設定 Cookie 後 1 個小時 (60x60=3600) mktime() 某個指定日期前都有效。 格式: int mktime(時, 分, 秒, 月, 日, 年)
Cookie有效時間 setcookie ("A", "10", time()+3600); setcookie ("B", "20", time()+86400); Cookie B 的有效時間為 1 天。 setcookie ("C", "30", mktime(0,0,0,6,20,2014)); Cookie C 的有效時間為 2014 年 6 月 20 日前。 setcookie ("D", "50", mktime(0,0,0,12,31,2020)); Cookie D 的有效時間為 2020 年 12 月 31 日前。
Cookie有效時間 Cookie 有效時間範例: <?php $nowcnt=$_COOKIE['cnt']; $nowcnt++; setcookie("cnt", $nowcnt, time()+3600); echo "您是第 $nowcnt 次光臨本站"; ?> 示範步驟: 先同一個Browser 重複整理 關掉 browser 再開啟 換不同 的browser
刪除cookie 改變 Cookie 的有效時間使 Cookie 過期立即 失效,即可刪除 Cookie。 例: <?php $nowcnt=$_COOKIE['cnt']; $nowcnt++; setcookie("cnt", $nowcnt,time()+3600); if ($nowcnt>=5) setcookie("cnt", $nowcnt,time()-3600); echo "您是第 $nowcnt 次光臨本站"; ?> 18-4.php
Session Cookie URL 傳遞 Session 將資料寫在伺服器端,資料的安全性比較高, 但較佔資源。 為了辨識不同的 Session,每個Session 都會有一個唯一 的編號稱為 Session id。 Session id 的產生方式有兩種, 分別是 Cookie URL 傳遞 補充: 伺服器安全性可能會降低
啟動Session 啟動 session 功能的方式有兩種: php.ini參數設定 參數 session.auto_start ,將此參數改為 1。 使用session_start() 函數 較為常用的方式 啟動 session 後,伺服器會利用本次連線之 session id 前面加上 "sess_" ,組合成一個檔案名稱,用來存放 session 資料。
存取Session 存取session 有兩種方式: 利用全域變數設定: (不建議) 將php.ini 中的 register_globals 設定為enable 建議使用 $_SESSION['變數名稱'] 儲存的session 會放置於「php.ini」檔案中 session.save_path 所指定的目錄下找到。
Session 範例 1: <?php 2: session_start(); 3: // session_register("A"); 舊版php 4: // session_register("B"); 舊版php 5: $_SESSION['A']=10; 6: $_SESSION['B']="Hello My "; 7: ?> 8: <html> 9: <title>Session測試</title> 10: <body> 11: <?php 12: echo "Session ID = " . session_id() . "<p>"; 13: echo "運算前 <br>"; 14: echo "A = " . $_SESSION['A'] . "<br>"; 15: echo "B = " . $_SESSION['B'] . "<p>"; 16: $_SESSION['A']++; 17: $_SESSION['B'] .= "Friend."; 18: echo "運算後 <br>"; 19: echo "A = " . $_SESSION['A'] . "<br>"; 20: echo "B = " . $_SESSION['B']; 21: ?> 22: </body> 23: </html>
Session id 傳遞 理論上,每個連線(瀏覽器)都有不同的session id, 因此瀏覽器之間無法共同使用session 變數。 而若必須讓二個瀏覽器間共用session 變數,那麼 使用相同的session id 就可以了 可利用 URL 傳遞 有安全疑慮 Session Hijacking
Session id 傳遞範例 <?php session_start(); if (isset($_SESSION['A'] )) else $_SESSION['A']=1; echo "Session id = ".session_id()."<p>"; echo "變數值 = ".$_SESSION['A']."<p>"; echo "<a href=\"./18-6.php\" traget=\"newwin\">開新視窗</a>"; ?>
取消註冊session 變數* <?php function show(){ echo "session_id = ".session_id()."<br>"; echo "A = ".$_SESSION['A']."<br>"; echo "B = ".$_SESSION['B']."<br>"; echo "C = ".$_SESSION['C']."<p>"; } session_start(); $_SESSION['A']=10; $_SESSION['B']=20; $_SESSION['C']=30; show(); unset($_SESSION['A']); session_unset(); session_destroy(); ?>
addCart.php addCart.php?pid=003 showCart.php
product.php <?php $product["001"]= array("Sony 16G隨身碟", 1200); $product["002"]= array("Asus 802.11g基地台", 3100); $product["003"]= array("Acer 150G外接式硬碟", 2780); $product["004"]= array("Logitech 無線光學滑鼠", 1340); ?> addCart.php (1/2) <?php include "product.php"; session_start() ; $sel=""; if (isset($_GET["pid"])) { $sel = $_GET["pid"]; if (isset($_SESSION["cart"][$sel])) $_SESSION["cart"][$sel]++; else $_SESSION["cart"][$sel]=1; } ?> <html> … 例: $sel = "003" (addCart.php?pid=003) $_SESSION["cart"]["003"]++; $_SESSION["cart"]["003"] = 1; http://ycchen.im.ncnu.edu.tw/www2011/lab/php/session.zip
addCart.php (2/2) <div id="content"> <h2>商品一覽表</h2> <table border="2" cellpadding="5"> <tr><th>商品名稱</th><th>價格</th><th>購物</th></tr> <?php foreach ($product as $pid => $pInfo) if ($pid == $sel) echo "<tr id=\"sel\"><td>{$pInfo[0]}</td><td>NT\${$pInfo[1]}</td><td> <a href=\"addCart.php?pid=$pid\">放入購物車</a></td></tr>\n"; else echo "<tr><td>{$pInfo[0]}</td><td>NT\${$pInfo[1]}</td><td> ?> </table> <h3><a href="showCart.php">購物車內容</a></h3> </div> #sel td {background-color: darkGreen; color: ivory}
showCart.php <?php include "product.php"; session_start() ; ?> … <div id="content"> <h2>購物車內容</h2> <table border="2" cellpadding="5"> <tr><th>商品名稱</th><th>價格</th><th>數量</th></tr> if (isset($_SESSION["cart"])) { foreach ($_SESSION["cart"] as $pid => $cnt) echo "<tr><th>{$product[$pid][0]}</th><th>NT\${$product[$pid][1]}</th> <th>$cnt</th></tr>\n"; } </table> <h3><a href="addCart.php">繼續購物</a></h3> </div>
表單登入 login.php <?php if (!(isset($_POST['name']) || isset($_POST['passwd']))) include "login_inc.php"; elseif (($_POST['name'] != "admin") || ($_POST['passwd'] != "pwd999")) else { echo "登入成功 .....<br/>"; echo "您登入的帳號是 ".$_POST['name']."<br/>"; echo "<a href=\"admin.php\">進入系統管理畫面</a>"; // not complete, 待續 } ?> login_inc.php <h3>未輸入帳號或密碼, 或帳號,密碼不正確 </h3> <form action="login.php" method=post> 帳號 <input type=text name=name value="請輸入帳號" size=10><br/> 密碼 <input type=password name=passwd size=10><br/> <input type=submit value=" 登入 "> <input type=reset value=" 清除 "> </form>
使用session檢查是否已登入 login1.php <?php session_start(); ?> … <?php if (!(isset($_POST['name']) || isset($_POST['passwd']))) include "login1_inc.php"; elseif (($_POST['name'] != "admin") || ($_POST['passwd'] != "pwd999")) else { $_SESSION['isAdmin']=true; echo "登入成功 .....<br/>"; echo "您登入的帳號是 ".$_POST['name']."<br/>"; echo "<a href=\"admin1.php\">進入系統管理畫面</a>"; } ?>
admin1.php <?php session_start(); if (!$_SESSION['isAdmin']) { header("Location: login1.php"); exit; } ?> <html xmlns="http://www.w3.org/1999/xhtml"> <head> … <body> <div id="content"> <h3>~系統管理~</h3> <ul> <li><a href="…">使用者帳戶管理</a></li> <li> ><a href="…">變更密碼</a></li> <li> ><a href="…">首頁管理</a></li> </ul> </div> </body> </html>
session 函數 函數名稱 函數說明 int session_cache_expire() 傳回 PHP.INI 中 session.cache_expire 的值 string session_cache_limiter([string cache_limiter]) 取得或設定目前 cache limiter 的名稱 bool session_decode(string data) 將 session 的資料解碼 bool session_destroy(void) 取消所有 session 中註冊的資料 string session_encode(void) 將 session 的資料編碼 array session_get_cookie_params() 取得 session cookie 的資訊 string session_id([string id]) 設定或取回 session id bool session_is_registered(string name) 檢查變數是否已經在 session 中註冊。 變數已經註冊傳回 True否則傳回 False。 String session_module_name([string module]) 取回或設定 session 模組 String session_name(string name) 取回或設定 session 的名稱
session 函數 void session_readonly(void) 可讀取 session 資料, 但是不可以更改內容 string session_save_path(string path) 取得或設定儲存 session 的路徑 void session_set_cookie_params ( int lifetime [, string path [, string domain [, bool secure]]]) 設定 php.ini 中 session cookie 參數 bool session_set_save_handler ( string open, string close, string read, string write, string destroy, string gc) 設定使用者定義 session 儲存功能 bool session_start (void) 啟動 session void session_unset(void) 釋放所有 session 變數 void session_write_close(void) 寫入 session 資料及結束session