第八章 Session與Cookie
章節目錄 Session Cookie 本章結論 重點提示 問題與討論
Session-1/3 當使用者登入帳號密碼後進入您所設計的網站,網站內需儲存使用者的帳號、密碼、IP或其他資訊,例如點選哪些項目,或網路購物車內放入多少物品,我們可以使用Session來儲存這些資料。 Session將資料儲存於伺服器端與瀏覽器視窗,只要視窗沒有關閉,Session型態變數均會保留。為了辨識不同的 Session, 每個Session 都會有一個唯一的編號稱為session id。 我們可以直接設定Session型態變數,PHP6已不允許現有的一般變數註冊為Session變數。
Session-2/3 與Session有關的函數很多,以下列出常用的幾個函數: 函數名稱 說明 session_start ( ) session_id( ) 每個session的唯一的編號。 session_register( ) session中註冊變數。【PHP6不再支援】 session_unregister( ) 從目前的session將變數取消註冊。【PHP6不再支援】 session_unset( ) 釋放所有變數。 session_destroy ( ) 將已登記的session id註銷。
Session-3/3 Session變數傳遞 Session id儲存於主機上位置與保存方式 Session啟動、釋放與註銷 返回章節目錄
Session變數傳遞-1/6 網頁設定Session型態變數前,需在網頁第一行執行session_start( )啟動Session,執行之前不能有任何輸出。 如果session_start( )無法放在第一行,請在第一行輸入ob_start( )以便開啟緩衝區儲存資料。 請依本書第8-3頁編輯PHP網頁,觀察兩個PHP網頁是如何傳送資料(「8」資料夾內「session1.php」)。
Session變數傳遞-2/6 session1.php在第01行啟動了Session,如果少了這一行,網頁無法建立session id,當我們透過超連結開啟其他網頁後,Session型態變數是不存在的。 第07行到第09行則是將相關資料存入三個Session型態變數: 07 $_SESSION['server'] = 'apache'; 08 $_SESSION['dbserver'] = 'mysql‘; 09 $_SESSION['time'] = date("Y年m月d日 H時i分s秒"); Session型態變數就是$_SESSION[ ]陣列變數。 PHP6不允許您以一般變數的方式表示Session變數,所以建議您養成習慣,以$_SESSION[ ]陣列變數處理Session相關資料。 Session儲存於使用者的瀏覽器視窗,若您使用IE或者Firefox開啟新分頁,都定義為同一個視窗。
Session變數傳遞-3/6 Session產生後會在Server與瀏覽器視窗做不同處理。 session id內儲存Session變數資料以檔案形式儲存於伺服器指定的目錄內。 使用者瀏覽器網頁視窗也會儲存session id資訊。 伺服器指定的目錄 Session id 儲存於 儲存於 網頁視窗
Session變數傳遞-4/6 當瀏覽器提出Session服務請求時,同時將資料送至伺服器與瀏覽器,確認session是否存在。 每一個網頁都要執行session_start( ),才能使Session於不同網頁頁面傳遞。 比對瀏覽器頁面 是否有此 session id資訊 是否有 session_start( )? 比對Server是否有此 session id資訊 沒有 沒有 沒有 Session變數 無法於不同頁面傳遞 無法顯示session變數資料 請重新開啟網頁建立 session id 無法顯示session變數資料 請重新開啟網頁建立 session id
Session變數傳遞-5/6 請依本書第8-4頁編輯PHP網頁,察看網頁該如何呈現Session變數資料(「8」資料夾內「session2.php」)。
Session變數傳遞-6/6 如果您直接開啟session2.php,您會發現到senssion2.php沒有資料顯示。所以我們可由session資料是否產生判斷是否經過我們指定的頁面。 返回Session
Session id儲存於主機上位置與保存方式-1/5 如果您使用的是Windows作業系統,請您搜尋php.ini這個檔案,一 般可在「windows」目錄內找到直接點兩下開啟檔案。 若您安裝「Appserv」,您可於開始功能表「Appserv」內 「Configuration Server」點選「PHP Edit the php.ini Configuration File」。 開啟檔案後請點選「編輯」功能表內的「尋找」,請尋找 「session.save_path」。 Linux系列作業系統請使用「find / -name ‘php.ini’」的方式搜尋, 若無特殊設定,一般可在/etc目錄內找到。若找到的檔案是 「/etc/php.ini」,請先切換到root(請下指定:su )身份後輸入「vi /etc/php.ini」。再進入php.ini編輯畫面後,請輸入「/」 後再請您輸 入「session.save_path」後按下enter。
Session id儲存於主機上位置與保存方式-2/5 您會找到以下的字串: session.save_path = "C:/DOCUME~1/rong/LOCALS~1/Temp“ session.save_path設定「Session ID」在主機上的位置,由於session id檔案容量小且數量多,Windows環境建議更改儲存目錄,不要與作業系統放在同一個磁區內。
Session id儲存於主機上位置與保存方式-3/5 當執行session1.php時,請您到該目錄察看是否有「sess_」開頭的檔案,這個檔案可用windows的記事本開啟察看。
Session id儲存於主機上位置與保存方式-4/5 開啟sess_開頭的session檔案。
Session id儲存於主機上位置與保存方式-5/5 Server上session檔案會保存多久呢?請察看php.ini內相關設定: session.gc_probability = 1 session.gc_divisor = 100 session.gc_maxlifetime = 1440 這三行設定分別為session清除垃圾比例分子(session.gc_probability)、session清除垃圾比例分母(session.gc_divisor)、session資料保存最大時間(session.gc_maxlifetime)。 以上述設定為例,代表主機會在瀏覽器失去訊息後1440秒清除1/100 session檔案。 至於為何不全部清除呢?因為主機無法判斷「瀏覽器失去訊息」是「瀏覽器關閉」或「網路傳輸速度慢」,所以主機不會主動把所有session資料清除。 返回Session
Session啟動、釋放與註銷-1/6 請依本書第8-7頁編輯PHP網頁,察看網頁如何啟動Session、釋放變數與銷毀Session呈現Session變數資料(「8」資料夾內「session.php」)。
Session啟動、釋放與註銷-2/6 第06行到第12行裡自訂了一個函數,偵測三個Session變數A、B、C是否存在以及session_id的內容。 06 function show(){ 07 echo "session_id = ".session_id()."<br>"; 08 if (isset($_SESSION['A'])){echo "A = ".$_SESSION['A']."<br>";} 09 if (isset($_SESSION['B'])){ echo "B = ".$_SESSION['B']."<br>"; } 10 if (isset($_SESSION['C'])){ echo "C = ".$_SESSION['C']; } 11 echo "<p>"; 12 } 第13行到第18行則是啟動session後,傳遞資料給將ABC三個Session變數後執行show( )函數。 13 session_start(); 14 $_SESSION['A']=10; 15 $_SESSION['B']=20; 16 $_SESSION['C']=30; 17 echo "session變數產生並給值<br>"; 18 show( );
Session啟動、釋放與註銷-3/6 執行完第18行後接著執行show( )這個函數後就會顯示出sesson id與這三個Session變數內容 session變數產生並給值 session_id = 87b7044bbba324e0b692ab02b3ece861 A = 10 B = 20 C = 30 第20行的session_unset( )這一個動作會讓所有變數釋放,在執行完這一行之後,網頁上所有Session變數均會由記憶體釋放,不再使用。 19 echo "取消所有session變數<br>"; 20 session_unset( ); 21 show( );
Session啟動、釋放與註銷-4/6 您會看到的輸出為: 取消所有session變數 session_id = 87b7044bbba324e0b692ab02b3ece861 雖然我們已經釋放所有的Session變數,但session id仍然存在,所以我們在第23行利用session_destroy ( )函數將已登記的session id取消,如此一來就可完全移除所有Session資料。 22 echo "銷毀session<br>"; 23 session_destroy( ); 24 show( ); 銷毀session session_id =
Session啟動、釋放與註銷-5/6 session_destroy ( )函數將已登記的session id銷毀後,Server與瀏覽器裡均沒有紀錄,即便Session型態變數仍存在,但變數已經無法在網頁之間傳遞。 請依本書第8-9頁編輯PHP網頁, session id在網頁中被銷毀(「8」資料夾內「session3.php」)。 session3.php第09行進行了session id銷毀的動作後,雖然變數仍在,但是否可以傳送呢? 請依本書第8-10頁編輯PHP網頁,觀察session變數是否可以傳遞(「8」資料夾內「session4.php」)。
Session啟動、釋放與註銷-6/6 網頁傳遞前已銷毀session id,所以無法傳遞session型態變數。 返回Session
Cookie-1/4 Cookie是一種能夠讓網站伺服器將資料儲存或讀取在使用者的瀏覽器指定目錄內的技術。
Cookie-2/4 Cookie只有一個函數設定Cookie,那就是setcookie( )。 setcookie函數使用前不能有任何網頁的輸出,所以若與header( )或session_start( )函數合用時,需在網頁第一行加上ob_start( )函數,才可避免錯誤發生。 setcookie()函數定義如下: setcookie("Cookie變數名稱","Cookie內容","保存期限","路徑","網域","安全")
Cookie-3/4 設定 說明 變數名稱 Cookie的變數名稱。 內容 Cookie型態變數的內容。若我們要移除Cookie變數,可將Cookie變數內容清空。 保存期限 在這時間之前,Cookie變數均有效;如果沒有設定保存期限,當關閉瀏覽器時Cookie就會消失。若我們要移除Cookie變數,也是以過期或時間空白的方式處理。 路徑 Cookie只有在網站伺服器的指定路徑內有效,這個設定可省略不做,預設值是「/」(網站根目錄)。 網域 Cookie只在指定網域內,這個設定可省略不做,預設值是沒有設定網域。 安全 值為1時必須以SSL,https加密方式才能傳送,這個設定可省略不做,預設值為0,代表沒有加密的方式傳送。
Cookie-4/4 Cookie變數內容保存與期限設定 Cookie的路徑與網域、安全連線之設定 以陣列存取多筆Cookie資料 返回章節目錄
Cookie變數內容保存與期限設定-1/11 設定Cookie時,最重要的是Cookie變數名稱、內容與保存期限。 保存期限可以是一段時間之後,也可以是固定的時間。 請依本書第8-11頁編輯PHP網頁,若保存期限為現在時間加上1800 秒,請觀察如何設定Cookie(「8」資料夾內「cookie1.php」)。 請依本書第8-12頁編輯PHP網頁,設計另外一個網頁讀取Cookie(「8」資料夾內「cookie2.php」)。
Cookie變數內容保存與期限設定-2/11 Cookie變數傳遞
Cookie變數內容保存與期限設定-3/11 Cookie變數儲存於$_COOKIE[ ]陣列內,當我們另開網頁視窗的情 況下,只要是在期限內開啟,您可以看到另外一個網頁顯示出 Cookie內容。 因不同瀏覽器對於Cookie的儲存位置與資料處理方式不同,所以 Cookie資料無法共用,只能匯出匯入的方式使用。 如果瀏覽器不允許您儲存Cookie或者您將安全性調高,可能造成 Cookie無法儲存。 上述練習若無法出現正確的結果,請您檢查瀏覽器的設定。 如何刪除Cookie的內容呢?請選擇兩種方式之一就可將Cookie刪 除: 1.保存期限設定為小於現在的時間 2.內容清空。
Cookie變數內容保存與期限設定-4/11 請依本書第8-13頁編輯PHP網頁,將cookie保存期限小於現在的時間(「8」資料夾內「cookie2a.php」)。
Cookie變數內容保存與期限設定-5/11 請依本書第8-14頁編輯PHP網頁,將cookie變數內容清空 (「8」資料夾內「cookie2b.php」)。
Cookie變數內容保存與期限設定-6/11 請依本書第8-14頁編輯PHP網頁,利用mktime設定固定時間保存Cookie變數內容 (「8」資料夾內「cookie3.php」)。
Cookie變數內容保存與期限設定-7/11 cookie3.php該網頁使用ini_set( )函數定義時區為亞洲台北。而後再使用mktime( )設定時間。關於mktime( )及date( )函數請參考第七章的介紹。 PHP網頁內設定2009年10月12日Cookie到期,只要沒有逾期, Cookie變數都有效。不過很顯然地現在已經逾期了,所以執行 cookie2.php後看到Cookie資料已經清空。
Cookie變數內容保存與期限設定-8/11 請依本書第8-15頁編輯PHP網頁,搭配date( )與mktime( )兩個函數設定固定日期保存Cookie變數內容 (「8」資料夾內「cookie4.php」)。
Cookie變數內容保存與期限設定-9/11 這裡設定了三個時間,第05行利用mktime設定時間,設定時間時利用date( )函數抓取系統時間,並將日期加一天。所以第06行儲存的時間是明天的時間。第07行則是將月份多加一個月,也就是下一個月的時間,而第08行則因年份加一而設定明年的時間。 05 ini_set("date.timezone","Asia/Taipei"); 06 $tomorrow = mktime (0,0,0,date("m"),date("d")+1,date("Y")); 07 $nextmonth = mktime (0,0,0,date("m")+1,date("d"),date("Y")); 08 $nextyear = mktime (0,0,0,date("m"),date("d"),date("Y")+1);
Cookie變數內容保存與期限設定-10/11 當我們計算出下一天、下一個月、下一年的時間值後,將資料分別 傳給$tomorrow、$nextmonth、$nextyear三個變數儲存。 第09行到第11行則依序設定Cookie資料。 第09行我們設定一個Cookie變數叫做b,內容為「cookie4_1」,保 存至明天為止。 第10行我們設定一個Cookie變數叫做c,內容為「cookie4_2」,保 存至下一個月為止。 第11行我們設定一個Cookie變數叫做d,內容為「cookie4_3」,保 存至下一年為止。 09 setcookie ("b", "cookie4_1",$tomorrow); 10 setcookie ("c", "cookie4_2",$nextmonth); 11 setcookie ("d", "cookie4_3",$nextyear);
Cookie變數內容保存與期限設定-11/11 請依本書第8-17頁編輯PHP網頁,setcookie( )內的保存期限可以用變數的方式運用,Cookie變數的內容也可以用變數替代(「8」資料夾內「cookie5.php」)。 返回Cookie
Cookie的路徑與網域、安全連線之設定-1/2 請依本書第8-18頁編輯PHP網頁,Cookie也可設定路徑與網域、安全連線 (「8」資料夾內「cookie6.php」)。 請依本書第8-18頁編輯PHP網頁,觀看cookie6.php執行結果(「8」資料 夾內「cookie-dir-host-ssl.php」)。
Cookie的路徑與網域、安全連線之設定-2/2 路徑與網域、安全連線是非必要的設定,如果要設定,需依照順序設定路徑、網域與安全連線,這三個設定也可全部使用,如果內容空白,也必須留下一對雙引號。 cookie6.php內第05行設定Cookie變數dir只有「8」資料夾內的網頁才有效;第06行設定Cookie變數host在使用者是由hinet網域連線上網瀏覽時有效,而因這一個變數設定並沒有設定路徑,所以路徑的部分空白,留下一對雙引號;第07行設定Cookie變數ssl只能在 安全模式下(預設值為0,代表非安全模式),也就是https://方式瀏覽下才有效,而因這一個變數設定並沒有設定路徑與網域,所以路徑與網頁的部分空白,留下兩對雙引號。 05 setcookie ("dir", "8資料夾內", time()+1800,"/8/"); 06 setcookie ("host", "由hinet連線", time()+1800,"",".hinet"); 07 setcookie ("ssl", "安全連線", time()+1800,"","","1"); 返回Cookie
以陣列存取多筆Cookie資料-1/2 請依本書第8-20頁編輯PHP網頁,設計一個陣列型態的Cookie變數儲存多 筆Cookie資料(「8」資料夾內「cookie7.php」)。 請依本書第8-20頁編輯PHP網頁,設計一個查詢cookie7.php設計產生的 Cookie變數(「8」資料夾內「cookie8.php」)。
以陣列存取多筆Cookie資料-2/2 請依本書第8-21頁編輯PHP 網頁,設計一個刪除 cookie7.php設計產生的 Cookie變數(「8」資料 夾內「cookie9.php」)。 只要Cookie的保存期限 到期了,例如第07行, 保存期限會小於當初設 定的時間,或者變數內 容沒了,例如第08行, Cookie變數也就會被刪 除。 返回Cookie
本章結論 Session與Cookie可讓不同網頁之間做資料傳遞。 Session資料儲存於頁面與伺服器,當所有網頁關閉或伺服器清除資 料就會清除Session資料。 Cookie資料儲存於使用者端電腦,當保存期限到期或變數內容清 空,就會清除Cookie資料。 css與java script都可以寫成獨立檔案的方式呼叫使用,那PHP是否 可以這樣做呢?如果可以,那我們就可以將多個PHP網頁內共同的 語法或共用的函數獨立為檔案,更方便管理PHP專案,下一章將為 各位介紹如何引用PHP檔案與利用header( )快速的進行網頁的轉換 與運用。 返回章節目錄
重點提示-1/3 Session將資料儲存於伺服器端與瀏覽器視窗。 為了辨識不同的 Session, 每個Session 都會有一個唯一的編號稱為 session id。 PHP6已不允許現有的一般變數註冊為Session變數。 session_unset()函數作用為「釋放所有變數」。 session_destroy()函數作用為「將已登記的session id註銷」。 session_start()函數作用為「啟動session」。 session_start()函數與set_cookie()函數之前不能有任何輸出。
重點提示-2/3 Session儲存於使用者的瀏覽器視窗,使用IE或者Firefox開啟新分 頁,都定義為同一個視窗。 php.ini內session.save_path設定「Session ID」在主機上的位置。 Server上session檔案保存期限,在php.ini內由session.gc_probability、 session.gc_divisor、session.gc_maxlifetime三個設定判斷。 session_destroy ( )函數將已登記的session id銷毀後,Server與瀏覽器裡均 沒有紀錄,即便Session型態變數仍存在,但變數已經無法在網頁之間傳 遞。 Cookie是一種能夠讓網站伺服器將資料儲存或讀取在使用者的瀏覽器指定目 錄內的技術。 setcookie( )函數內有六個參數,分別為:“Cookie變數名稱”、“Cookie內容 "、"保存期限"、"路徑"、"網域"、"安全"。
重點提示-3/3 不同瀏覽器對於Cookie的儲存位置與資料處理方式不同,所以 Cookie資料無法共用,只能匯出匯入的方式使用。 setcookie( )函數內的路徑與網域、安全連線是非必要的設定,如果 要設定,需依照順序設定,如果內容空白,也必須留下一對雙引 號。 返回章節目錄
問題與討論-1/3 1.設計一個網頁,當使用者按下重新整理,會顯示「請勿重複開 啟」訊息。 1.設計一個網頁,當使用者按下重新整理,會顯示「請勿重複開 啟」訊息。 2.設計一個網頁,當使用者兩小時內重複開啟,會顯示「兩小時候 請再開啟」訊息。 3.請設計以下的網頁: sessionform1.htm 讓使用者輸入帳號及密碼 sessionform1.php 接收表單傳遞過來的帳號及密碼,並產生兩個Session變數 sessionform2.php 判斷是否有form1.php產生的Session變數,有則顯示「OK」,沒有則顯示「Cancel」 sessionform3.php 銷毀session變數及session id,並加上session2.php連結,以確認session是否清除 返回章節目錄
問題與討論-2/3 4.請設計以下的網頁: 返回章節目錄 cookieform1.htm 讓使用者輸入帳號及密碼 cookieform1.php 接收表單傳遞過來的帳號及密碼,並產生兩個Cookie變數 cookieform2.php 判斷是否有cookieform1.php產生的Cookie變數,有則顯示「OK」,沒有則顯示「Cancel」 cookieform3.php 銷毀Cookie變數,並加上cookieform2.php連結,以確認Cookie是否清除 返回章節目錄
問題與討論-3/3 5.以下幾種是否為網頁間資料分享的方法: a.表單 b.網址URL參數 c.Cookies d.Session 6.請查閱你的php.ini內session id儲存的位置 7.Server上session檔案保存期限是由哪些設定決定? 8.不同瀏覽器可以共用Cookie嗎? 9.如何讓Cookie變數失效? 10.如何讓Seesion變數失效? 返回章節目錄