PHP5與MySQL5 入門學習指南 凱文瑞克 著 第 18 章 Cookie和 Session
本章大綱 18-1 Cookie 18-2 存取Cookie 18-3 Cookie有效時間 18-4 Session 問題與討論
18-1 Cookie Cookie 是將少量的資料儲存在遠端的個人電腦中的技術。
Netscape Cookie 設定 以 Netscape 7.0 為例, 開啟瀏覽器後選擇 [Edit] -> [Preferences] 可以開啟如圖的視窗, 再依各個人需求決定使用 Cookie 的權限。
IE Cookie 設定 IE 則是 [工具]->[網際網路選項]->[隱私], 如圖所示, 選擇所需權限。
18-2 存取Cookie 存入Cookie可利用setcookie()函數 setcookie() 函數 格式: boolean setcookie ( 變數名稱 [, 存入值 [, 有效時間 [, 路徑 [, 領域 [, 安全性]]]]]) 變數名稱是設定 Cookie 的名稱。 存入值設定存入變數的值。 有效時間設定Cookie 變數的生命週期。 路徑是指存放 Cookie 的路徑。 領域說明 Cookie 的領域。 安全性設定為 1 時表示必須藉由 https 安全連線才可存入 Cookie。 否則設定為 0。
setcookie()範例 1. setcookie (“A”, “10”); 設定名稱為A的 Cookie, 其內容為 10。 2. setcookie (“B”, “20”,time()+3600); 設定名稱為 B, 其值為 20, 有效時間為一個小時。 3. setcookie (“C”, “Hello”,time()+7200, “./test/”, “.abc.def.tw”, 1); 設定有效時間二小時名稱為 C 的 Cookie, 存放於路徑 ./test/ 下, 領域為 .abc.def.tw, 並必須使用安全連線。
3: setcookie("B","Hello, I am B."); 4: echo "我已設定 Cookie "; 5: ?> 1: <?php 2: setcookie("A","10"); 3: setcookie("B","Hello, I am B."); 4: echo "我已設定 Cookie "; 5: ?> 第 2 行設定名稱為 A 的 Cookie, 其內容為 10。 第三行設定 Cookie 名稱為 B, 其值為 "Hello, I am B."。 第 3 行顯示提示字串。
取出cookie 利用全域變數取出cookie, 即使用 $_COOKIE陣列取得儲存於遠端電腦中的 Cookie. 1: <?php 2: echo "A = ". $_COOKIE[A] . "<p>"; 3: echo "B = ". $_COOKIE[B] . "<p>"; 4: echo "取出 Cookie"; 5: ?> 第 2-3 行分別取出並顯示 Cookie A 和 B 的內容。 第 4 行顯示提示字串。
請記得執行範例18-1 和範例 18-2 必須是同一個瀏覽器, 否則看不到圖 18-4 的結果。 這是因為目前我們所使用的設定 Cookie 的方法只能在特定的瀏覽器中使用。 換句話說, 哪一個瀏覽器中所設定的 Cookie 只能在該瀏覽器中使用。 如果已設定的 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: ?>
18-3 Cookie有效時間 已設定的 Cookie 要讓所有的瀏覽器使用就必須在設定 Cookie 時加上有效時間。 設定有效時間二種方法 time()+秒數 time()+3600 表示有效時間為設定 Cookie 後的 1 個小時 (60x60=3600)。 mktime(): 某個指定日期前都有效。格式: int mktime(時, 分, 秒, 月, 日, 年)
Cookie 設定實例: setcookie ("A", "10",time()+3600); Cookie A 的有效時間為 1 小時。 setcookie ("C", "20",time()+86400); Cookie B 的有效時間為 1 天。 setcookie ("D", "30", mktime(0,0,0,6,20,2008); Cookie C 的有效時間為 2008 年 6 月 20 日前。 setcookie ("E", "50", mktime(0,0,0,12,31,2020); Cookie D 的有效時間為 2020 年 12 月 31 日前。
圖(a) 圖(b) 瀏覽器過60秒後, 又變成圖(a) 1: <?php 2: $nowcnt=$_COOKIE[cnt]; 3: $nowcnt++; 4: setcookie("cnt", $nowcnt, time()+60); 5: echo "您是第 $nowcnt 次光臨本站"; 6: ?> 第 2 行取得 Cookie cnt 並指定給 $nowcnt。 第 3 行 $nowcnt 加一, 表示上站次數加一。 第 4 行將 $nowcnt 的值設定給 Cookie cnt, 有效時間為 60 秒。 第 5 行顯示上站次數。 圖(a) 圖(b) 瀏覽器過60秒後, 又變成圖(a)
刪除cookie 改變 Cookie 的有效時間讓 Cookie 立即失效, 這樣子就相當於刪除了 Cookie。 例 setcookie ("A", "",time()-60); time() 表示目前時間, 那麼 time()-60 就表示將有效時間調整成過去的時間。 這樣一來 Cookie A 就會立即失效。
第 5 行如果計數次數大於或等於 5 則將原先Cookie cnt 的 time()+60 改成 time()-60 讓 cnt 立即失效。 1: <?php 2: $nowcnt=$_COOKIE[cnt]; 3: $nowcnt++; 4: setcookie("cnt",$nowcnt,time()+60); 5: if ($nowcnt>=5) setcookie("cnt",$nowcnt,time()-60); 6: echo "您是第 $nowcnt 次光臨本站"; 第 5 行如果計數次數大於或等於 5 則將原先Cookie cnt 的 time()+60 改成 time()-60 讓 cnt 立即失效。 執行範例無論是重讀網頁幾次, 結果都是由 1 累加至 5 然後再由 1 開始到 5 一直循環。
18-4 Session Session 將資料寫在伺服器端。 資料的安全性比較高。 為了辨識不同的 Session, 每個Session 都會有一個唯一的編號稱為 Session id。 Session id 的產生方式有二種, 分別是 Cookie URL 傳遞
18-5 存取Session 啟動 session 功能的方式有二種: 第一種是參數設定。 在 php.ini 檔案中有一個參數 session.auto_start 。 將此參數改為 1 表示 enable。 第二種方式也是比較常用的方式就是利用 session_start() 函數來啟動 session。 啟動 session 後, 伺服器便會利用本次連線 (session)的 session id 前面加上 "sess_" 組合成一個檔案名稱來存放未來希望處理的 session 資料。
Session 變數在使用之前必須先 “註冊” 變數之後才可以使用。 反之, 當不使用某個變數就要“取消註冊 ”。 Session_register (“變數名稱”) 可以註冊一個session 變數。 Session_unregister (“變數名稱”) 可以取消一個 session 變數註冊。 例如 session_register(“user”) : 註冊user session_unregister(“count”) : 取消註冊count變數 用$_SESSION['變數名稱'] 的方式操作session變數。
1: <?php 2: session_start(); 3: session_register("A"); 4: session_register("B"); 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> 第 2 行啟動 session 的功能。 第 3-4 行在session中註冊二的 Session 變數 A, B。 第 5 行設定 session 變數 A 的值為 10。 第 6 行設定 session 變數 B 的值為字串 。 第 12 行取得 session 的 id。 第 13-15 行顯示運算前Session 變數 A, B 的內容於網頁上。 第 16 行將 Session 變數 A 的內容加1。 第 17 行將 Session 變數 B 與 "Friend." 字串連接在一起。 第 18-20 行顯示運算後 Session 變數 A, B 的內容於網頁上。 於 session.save_path 所指定的目錄下找到 sess_session_id 的檔案。
開啟新視窗,可傳遞session id 1: <?php 2: session_start(); 3: if (!session_is_registered('A')) { 4: session_register('A'); 5: $_SESSION['A'] = 1; 6: }else{ 7: $_SESSION['A']++; 8: } 9: echo "Session id = ".session_id()."<p>"; 10: echo "變數值 = ".$_SESSION['A']."<p>"; 11: echo "<A HREF=\"./18-6.php\"?SID TARGET=newwin>開新視窗</A>"; 12: ?> 開啟新視窗,可傳遞session id
1: <?php 2: function show(){ 3: echo "session_id = ".session_id()."<br>"; 4: echo "A = ".$_SESSION['A']."<br>"; 5: echo "B = ".$_SESSION['B']."<br>"; 6: echo "C = ".$_SESSION['C']."<p>"; 7: } 8: session_start(); 9: session_register("A"); 10: session_register("B"); 11: session_register("C"); 12: $_SESSION['A']=10; 13: $_SESSION['B']=20; 14: $_SESSION['C']=30; 15: show(); 16: session_unregister("A"); 17: show(); 18: session_unset(); 19: show(); 20: session_destroy(); 21: show(); 22: ?> 第 16 行取消 A 變數註冊。 第 17 行呼叫 show()函數。 第 18 行取消所有變數。 第 19 行呼叫 show() 函數。 第 20 行取消 session。 第 21 行呼叫show() 函數。
18-6 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 資料, 但是不可以更改內容 bool session_register(mixed name) - 註冊 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 bool session_unregister(string name) -- 取消目前 session 中的指定變數 void session_unset(void) -- 釋放所有 session 變數 void session_write_close(void) - 寫入 session 資料及結束session
問題與討論 請說明 Cookie 的功能。 請說明 Session 的功能。 Cookie 和 Session 功能有何異同? 請利用 Session 紀錄使用者姓名, 爾後讀取網頁時會出現使用者姓名在網頁上。(提示:HTML表單)