第 10 章 交談期追蹤的session與cookies處理

45
10 10 第第第第第第 第第第第第第 Session Session Cookies Cookies 第第 第第 10-1 PHP 10-1 PHP 第第第第第 第第第第第 10-2 HTTP 10-2 HTTP 第第第第 第第第第 10-3 10-3 第第第第第第第 第第第第第第第 10-4 Cookies 10-4 Cookies 第第第 第第第 10-5 PHP 10-5 PHP 第第第第第第 第第第第第第 10-6 Session 10-6 Session 第第第 第第第

Upload: janine

Post on 06-Jan-2016

129 views

Category:

Documents


7 download

DESCRIPTION

第 10 章 交談期追蹤的Session與Cookies處理. 10-1 PHP 的預定變數 10-2 HTTP 標頭處理 10-3 輸出緩衝區處理 10-4 Cookies 的處理 10-5 PHP 的交談期追蹤 10-6 Session 的處理. 10-1 PHP的預定變數. 10-1-1 PHP 的預定變數 10-1-2 伺服器系統資訊的內容. 10-1-1 PHP的預定變數- 說明. - PowerPoint PPT Presentation

TRANSCRIPT

Page 1: 第 10 章  交談期追蹤的Session與Cookies處理

第第 1010 章 章 交談期追蹤的交談期追蹤的SessionSession與與 CookiesCookies處理處理

10-1 PHP10-1 PHP 的預定變數的預定變數 10-2 HTTP10-2 HTTP 標頭處理標頭處理 10-3 10-3 輸出緩衝區處理輸出緩衝區處理 10-4 Cookies10-4 Cookies 的處理的處理 10-5 PHP10-5 PHP 的交談期追蹤的交談期追蹤 10-6 Session10-6 Session 的處理的處理

Page 2: 第 10 章  交談期追蹤的Session與Cookies處理

10-1 PHP10-1 PHP的預定變數的預定變數 10-1-1 PHP10-1-1 PHP 的預定變數的預定變數 10-1-2 10-1-2 伺服器系統資訊的內容伺服器系統資訊的內容

Page 3: 第 10 章  交談期追蹤的Session與Cookies處理

10-1-1 PHP10-1-1 PHP的預定變數的預定變數 -- 說明說明 PHPPHP的預定變數屬於的預定變數屬於 PHPPHP引擎建立的變數,在舊引擎建立的變數,在舊版版 PHPPHP預定變數的格式為:預定變數的格式為: $HTTP_*_VARS$HTTP_*_VARS,,表示變數屬於瀏覽程式請求網頁時,表示變數屬於瀏覽程式請求網頁時, HTTPHTTP通訊通訊協定傳回伺服器的相關資料,因為協定傳回伺服器的相關資料,因為 HTTPHTTP通訊協通訊協定傳送的不只定傳送的不只 URLURL網址,在網址,在 HTTPHTTP標頭資訊擁有標頭資訊擁有瀏覽程式版本、伺服器、瀏覽程式版本、伺服器、 CookieCookie、表單欄位資、表單欄位資料等相關資訊。料等相關資訊。

在在 PHP 4.10PHP 4.10之後版本提供一組結合陣列的預定之後版本提供一組結合陣列的預定變數,可以取得變數,可以取得 PHPPHP程式和程式和 HTTPHTTP標頭的相關資標頭的相關資訊,預設擁有全域的變數範圍,稱為「自動全訊,預設擁有全域的變數範圍,稱為「自動全域」(域」( AutoglobalsAutoglobals)或「超全域」)或「超全域」(( SuperglobalsSuperglobals)變數。)變數。

Page 4: 第 10 章  交談期追蹤的Session與Cookies處理

10-1-1 PHP10-1-1 PHP的預定變數的預定變數 -- 超全域超全域變數變數

超全域變數 說明$GLOBALS 在 PHP 3就已經存在,包含目前 PHP程式所有全域變數,鍵值是

全域變數的名稱$_SERVER Web伺服器指定的變數,屬於目前 PHP程式執行環境的相關變數,

詳見第 10-1-2節的說明$_GET 結合陣列儲存透過 HTTP GET方法傳入 PHP程式檔案的表單欄位

資料,鍵值是欄位名稱,例如:程式範例 Ch9-2-4.php

$_POST 結合陣列儲存透過 HTTP POST方法傳入 PHP程式檔案的表單欄位資料,鍵值是欄位名稱,詳見第 9章

$_COOKIE 結合陣列儲存透過 HTTP傳遞的 Cookie資料,詳見第 10-4節$_FILES 結合陣列儲存使用 HTTP POST方法上傳檔案的相關資訊,詳見第

11章的說明$_ENV 結合陣列儲存 PHP執行時或 CGI的環境變數

$_REQUEST 結合陣列儲存$_GET、$_POST、$_COOKIE和$_FILES變數的內容。請注意!從 PHP 4.3.0版開始,$_FILES變數已經不存在

$_REQUEST變數$_SESSION 結合陣列儲存目前 PHP程式擁有的 Session變數,詳見第 10-6節

的說明

Page 5: 第 10 章  交談期追蹤的Session與Cookies處理

10-1-2 10-1-2 伺服器系統資訊的內容伺服器系統資訊的內容 --變數名稱變數名稱

變數名稱 說明GATEWAY_INTERFACE 伺服端 CGI版本

PHP_SELF 目前執行 PHP程式的檔案名稱DOCUMENT_ROOT 目前執行 PHP程式的根目錄

QUERY_STRING URL參數的資料REMOTE_ADDR 客戶端的 IP位址REMOTE_PORT 客戶端與主機連線的埠號

REQUEST_METHOD HTTP的請求方法為 GET、PUT或 POST

SCRIPT_NAME 目前執行的 PHP程式所在的虛擬路徑SCRIPT_FILENAME 目前執行的 PHP程式所在的實際路徑

SERVER_NAME 伺服器的網域名稱或 IP位址SERVER_PORT HTTP通訊協定的埠號

SERVER_PROTOCOL HTTP通訊協定的版本SERVER_SOFTWARE 使用的伺服器軟體和版本

Page 6: 第 10 章  交談期追蹤的Session與Cookies處理

10-1-2 10-1-2 伺服器系統資訊的內容伺服器系統資訊的內容 --使用使用

在在 PHPPHP 程式可以指定變數名稱的鍵值來取得指定程式可以指定變數名稱的鍵值來取得指定的系統資訊,如下所示:的系統資訊,如下所示:

$ip = $_SERVER["REMOTE_ADDR"];$ip = $_SERVER["REMOTE_ADDR"];$path = $_SERVER["SCRIPT_NAME"];$path = $_SERVER["SCRIPT_NAME"]; 程式碼的鍵值是變數名稱,以此例可以取得使用程式碼的鍵值是變數名稱,以此例可以取得使用

者的者的 IPIP 位址和目前執行位址和目前執行 PHPPHP 程式的路徑。程式的路徑。 PHPPHP 程式可以使用程式可以使用 foreachforeach 迴圈顯示伺服器的所迴圈顯示伺服器的所

有變數值,如下所示:有變數值,如下所示:foreach ($_SERVER as $key=>$value) {foreach ($_SERVER as $key=>$value) { echo "<tr><td>" . $key . "</td>";echo "<tr><td>" . $key . "</td>"; echo "<td>" . $value . "</td></tr>";echo "<td>" . $value . "</td></tr>";}}

Page 7: 第 10 章  交談期追蹤的Session與Cookies處理

10-2 HTTP10-2 HTTP 標頭處理標頭處理 10-2-1 10-2-1 轉址到其他網頁或轉址到其他網頁或 PHPPHP程式程式 10-2-2 10-2-2 定時更新網頁定時更新網頁 10-2-3 10-2-3 設定輸出文件內容的資料類型設定輸出文件內容的資料類型 10-2-4 10-2-4 設定在快取保留的期限設定在快取保留的期限

Page 8: 第 10 章  交談期追蹤的Session與Cookies處理

10-2 HTTP10-2 HTTP 標頭處理標頭處理 PHPPHP的的 header()header() 函數可以送出函數可以送出 HTMLHTML 文文

件的標頭資訊,透過送出的標頭資訊來轉件的標頭資訊,透過送出的標頭資訊來轉址或定時更新網頁、指定文件內容和保留址或定時更新網頁、指定文件內容和保留期限。期限。 header()header() 函數的說明,如下表所示:函數的說明,如下表所示:函數 說明

header(string [, bool ]) 傳回第 1個參數的 HTTP標頭資料,預設取代前一個標頭中相同型態的資料,如果第 2個參數為 false,表

示允許多個同型態的資料

Page 9: 第 10 章  交談期追蹤的Session與Cookies處理

10-2-1 10-2-1 轉址到其他網頁或轉址到其他網頁或 PHPPHP程式程式

轉址功能是指在執行轉址功能是指在執行 PHPPHP 程式時,可以轉程式時,可以轉址到其他網址或網站的其他網頁或址到其他網址或網站的其他網頁或 PHPPHP 程程式,式, header()header() 函數是使用函數是使用 LocationLocation 型態型態來指定轉址的來指定轉址的 URLURL 網址,如下所示:網址,如下所示:

header("Location: Ch10-1-2.php");header("Location: Ch10-1-2.php");

header("Location: http://localhost/Ch09/Ch9-header("Location: http://localhost/Ch09/Ch9-3-1.htm“);3-1.htm“);

header("Location: http://www.hinet.net");header("Location: http://www.hinet.net");

Page 10: 第 10 章  交談期追蹤的Session與Cookies處理

10-2-2 10-2-2 定時更新網頁定時更新網頁 PHPPHP的的 header()header() 函數可以使用函數可以使用 RefreshRefresh

型態指定間隔時間來定時更新網頁,如下:型態指定間隔時間來定時更新網頁,如下:header("Refresh: 2");header("Refresh: 2"); 上述上述 RefreshRefresh 型態的「型態的「 :: 」符號後是間隔」符號後是間隔

時間,以此例是時間,以此例是 22 秒。秒。 如果在一定時間後轉址到其他如果在一定時間後轉址到其他 URLURL 網址或網址或

PHPPHP 檔案路徑,只需加上檔案路徑,只需加上 urlurl 參數,如下參數,如下所示:所示:

header("Refresh:2;url=Ch10-1-2.php");header("Refresh:2;url=Ch10-1-2.php");

Page 11: 第 10 章  交談期追蹤的Session與Cookies處理

10-2-3 10-2-3 設定輸出文件內容的資設定輸出文件內容的資料類型料類型 -- 說明說明

在在 header()header() 函數可以使用函數可以使用 Content-typeContent-type型態指定型態指定 HTTPHTTP 通訊協定傳送資料到瀏覽通訊協定傳送資料到瀏覽程式的資料種類,其值是程式的資料種類,其值是 MIMEMIME 資料類型,資料類型,常用類型如下表所示:常用類型如下表所示:

MIME資料類型 說明text/html HTML文件檔案text/xml XML文件的檔案text/plain 一般文字檔

image/jpeg JPEG格式的圖片檔image/gif GIF格式的圖片檔

Page 12: 第 10 章  交談期追蹤的Session與Cookies處理

10-2-3 10-2-3 設定輸出文件內容的資設定輸出文件內容的資料類型料類型 -- 使用使用

如果需要輸出成其他文件類型,可以使用如果需要輸出成其他文件類型,可以使用header()header() 函數指定函數指定 MIMEMIME 資料類型,其程資料類型,其程式碼如下所示:式碼如下所示:header("Content-type: text/xml");header("Content-type: text/xml");

上述程式碼指定上述程式碼指定 Content-typeContent-type 型態為型態為text/xmltext/xml ,表示傳送的內容是一份,表示傳送的內容是一份 XMLXML文件。文件。

Page 13: 第 10 章  交談期追蹤的Session與Cookies處理

10-2-4 10-2-4 設定在快取保留的期限設定在快取保留的期限 --說明說明

雖然網站的雖然網站的 PHPPHP 程式、程式、 HTMLHTML 網頁和圖片網頁和圖片等多媒體資料是儲存在等多媒體資料是儲存在 WebWeb 伺服器,不過伺服器,不過為了加速網頁存取,在伺服端、客戶端電為了加速網頁存取,在伺服端、客戶端電腦或腦或 ProxyProxy 伺服器都會將網頁內容保留在伺服器都會將網頁內容保留在快取空間(快取空間( CacheCache )的資料夾或磁碟,以)的資料夾或磁碟,以便加速網頁的瀏覽。便加速網頁的瀏覽。

Page 14: 第 10 章  交談期追蹤的Session與Cookies處理

10-2-4 10-2-4 設定在快取保留的期限設定在快取保留的期限 --客戶端快取的說明客戶端快取的說明

在客戶端電腦啟動瀏覽程式瀏覽網頁時,網頁內在客戶端電腦啟動瀏覽程式瀏覽網頁時,網頁內容同時會保留在客戶端電腦的資料夾,此資料夾容同時會保留在客戶端電腦的資料夾,此資料夾是一個快取空間,可以加速網頁瀏覽。是一個快取空間,可以加速網頁瀏覽。

當使用者重複瀏覽相同的網頁時,瀏覽程式先到當使用者重複瀏覽相同的網頁時,瀏覽程式先到快取找找看是否檔案已經存在,如果有,就直接快取找找看是否檔案已經存在,如果有,就直接從快取取出網頁內容,而不是每次都連結網站下從快取取出網頁內容,而不是每次都連結網站下載網頁內容,如此可節省下載檔案時間,提高瀏載網頁內容,如此可節省下載檔案時間,提高瀏覽效率。覽效率。

不過,為了保密、安全原因或希望每次都連結網不過,為了保密、安全原因或希望每次都連結網站下載網頁內容,我們並不希望將網頁內容保留站下載網頁內容,我們並不希望將網頁內容保留在客戶端快取,或是只允許保留一段時間,所以,在客戶端快取,或是只允許保留一段時間,所以,我們需要設定我們需要設定 PHPPHP 程式的保留期限。程式的保留期限。

Page 15: 第 10 章  交談期追蹤的Session與Cookies處理

10-2-4 10-2-4 設定在快取保留的期限設定在快取保留的期限 --指定指定 PHPPHP 程式的保留期限程式的保留期限

PHPPHP 程式可以使用程式可以使用 header()header() 函數指定函數指定 ExpiresExpires型態設定網頁檔案在快取保留的時間,時間是型態設定網頁檔案在快取保留的時間,時間是GMTGMT 格林威治時間,如下所示:格林威治時間,如下所示:

header("Expires: ". gmdate("D, d M Y H:i:s",header("Expires: ". gmdate("D, d M Y H:i:s", mktime(0,0,0,12,31,2006))." GMT" );mktime(0,0,0,12,31,2006))." GMT" ); 程式碼使用程式碼使用 gmdate()gmdate() 函數取得函數取得 GMTGMT 時時

間,間, mktime()mktime() 函數指定日期函數指定日期 // 時間,以此例是:時間,以此例是:Sat, 30 Dec 2006 16:00:00 GMTSat, 30 Dec 2006 16:00:00 GMT 。。

如果不想將如果不想將 PHPPHP 程式保留在快取,只需將程式保留在快取,只需將ExpiresExpires 設為過去時間即可,如下所示:設為過去時間即可,如下所示:

header("Expires: Mon, 26 Jul 2004 05:00:00 header("Expires: Mon, 26 Jul 2004 05:00:00 GMT");GMT");

Page 16: 第 10 章  交談期追蹤的Session與Cookies處理

10-3 10-3 輸出緩衝區處理輸出緩衝區處理 10-3-1 10-3-1 為什麼使用輸出緩衝區為什麼使用輸出緩衝區 10-3-2 10-3-2 輸出緩衝區處理輸出緩衝區處理

Page 17: 第 10 章  交談期追蹤的Session與Cookies處理

10-3-1 10-3-1 為什麼使用輸出緩衝區為什麼使用輸出緩衝區 --說明說明

PHPPHP 的「輸出緩衝區」(的「輸出緩衝區」( Output BuffeOutput Bufferr )是用來儲存)是用來儲存 PHPPHP 程式的輸出結果,其程式的輸出結果,其目的是等到執行完目的是等到執行完 PHPPHP 程式後,才一次送程式後,才一次送到瀏覽程式顯示。到瀏覽程式顯示。

在在 PHPPHP 程式使用輸出緩衝區主要是針對使程式使用輸出緩衝區主要是針對使用用 header()header() 或第或第 10-410-4 節的節的 setcookie()setcookie()函數會更改函數會更改 HTTPHTTP 標頭的情況,避免產生標頭的情況,避免產生重複寫入標頭資料的錯誤。重複寫入標頭資料的錯誤。

Page 18: 第 10 章  交談期追蹤的Session與Cookies處理

10-3-1 10-3-1 為什麼使用輸出緩衝區為什麼使用輸出緩衝區 --圖例圖例

例如:更改程式範例例如:更改程式範例 Ch10-2-1.phpCh10-2-1.php ,刪除第,刪除第 11列的列的 <? ob_start(); ?><? ob_start(); ?> 設定不使用輸出緩衝區設定不使用輸出緩衝區輸出網頁內容,就可以測試轉址輸出網頁內容,就可以測試轉址 PHPPHP 程式碼時產程式碼時產生的錯誤,如下圖所示:生的錯誤,如下圖所示:

Page 19: 第 10 章  交談期追蹤的Session與Cookies處理

10-3-2 10-3-2 輸出緩衝區處理輸出緩衝區處理 -PHP-PHP 的的輸出緩衝區處理輸出緩衝區處理 (( 說明說明 ))

在在 PHPPHP 程式開啟輸出緩衝區可以在程式開啟輸出緩衝區可以在php.iniphp.ini 檔案指定檔案指定 output_bufferingoutput_buffering 屬性屬性為為 OnOn 或是使用或是使用 PHPPHP 的函數來開啟,我們的函數來開啟,我們通常是使用通常是使用 PHPPHP 函數來開啟。函數來開啟。

PHPPHP 引擎在執行引擎在執行 PHPPHP 程式碼時,可以選擇程式碼時,可以選擇將處理的結果馬上輸出到客戶端的瀏覽程將處理的結果馬上輸出到客戶端的瀏覽程式顯示,或是先輸出到暫放的輸出緩衝區,式顯示,或是先輸出到暫放的輸出緩衝區,等到等到 PHPPHP 程式執行完或是緩衝區已滿,才程式執行完或是緩衝區已滿,才送到瀏覽程式顯示。送到瀏覽程式顯示。

Page 20: 第 10 章  交談期追蹤的Session與Cookies處理

10-3-2 10-3-2 輸出緩衝區處理輸出緩衝區處理 -PHP-PHP 的的輸出緩衝區處理輸出緩衝區處理 (( 圖例圖例 ))

Page 21: 第 10 章  交談期追蹤的Session與Cookies處理

10-3-2 10-3-2 輸出緩衝區處理輸出緩衝區處理 -PHP-PHP 的的輸出緩衝區處理輸出緩衝區處理 (( 圖例說明圖例說明 ))

PHPPHP 程式是使用程式是使用 ob_start()ob_start() 函數開啟輸出函數開啟輸出緩衝區。緩衝區。 PHPPHP 程式在送到程式在送到 PHPPHP 引擎執行後,引擎執行後,可以直接將輸出內容送到瀏覽程式顯示,可以直接將輸出內容送到瀏覽程式顯示,或是將輸出結果先輸出到緩衝區,當遇到或是將輸出結果先輸出到緩衝區,當遇到下列情況才會將輸出的內容送到瀏覽程式,下列情況才會將輸出的內容送到瀏覽程式,如下所示:如下所示:• 執行完執行完 PHPPHP 程式後。程式後。• 執行到執行到 ob_end_flush()ob_end_flush()、、 ob_flush()ob_flush() 函數馬函數馬

上將緩衝區的內容送出。上將緩衝區的內容送出。

Page 22: 第 10 章  交談期追蹤的Session與Cookies處理

10-3-2 10-3-2 輸出緩衝區處理輸出緩衝區處理 -PHP-PHP 輸輸出緩衝區處理函數出緩衝區處理函數

PHPPHP 提供輸出緩衝區控制函數可以開啟、提供輸出緩衝區控制函數可以開啟、使用和關閉使用輸出緩衝區,其相關函數使用和關閉使用輸出緩衝區,其相關函數的說明,如下表所示:的說明,如下表所示:函數 說明

ob_start() 開啟輸出緩衝區ob_end_clean() 清除輸出緩衝區的內容且關閉輸出緩衝區ob_end_flush() 送出輸出緩衝區的內容且關閉輸出緩衝區

ob_flush() 送出輸出緩衝區的內容到瀏覽程式ob_clean() 清除輸出緩衝區的內容,表示不顯示其內容

Page 23: 第 10 章  交談期追蹤的Session與Cookies處理

10-4 Cookies10-4 Cookies的處理的處理 10-4-1 Cookies10-4-1 Cookies 的基礎的基礎 10-4-2 10-4-2 新增新增 CookieCookie 10-4-3 10-4-3 取得取得 CookieCookie 的內容的內容 10-4-4 10-4-4 刪除刪除 CookieCookie 10-4-5 10-4-5 陣列陣列 CookieCookie 的使用的使用

Page 24: 第 10 章  交談期追蹤的Session與Cookies處理

10-4-1 Cookies10-4-1 Cookies 的基礎的基礎 -- 說明說明 在在WebWeb 網站通常都需要保留一些使用者的網站通常都需要保留一些使用者的

瀏覽記錄,例如:使用者是否曾經瀏覽過瀏覽記錄,例如:使用者是否曾經瀏覽過網站,或是一些個人輸入的資訊或選網站,或是一些個人輸入的資訊或選擇。擇。 CookiesCookies 就是儲存這些資料的主要解就是儲存這些資料的主要解決方案之一。決方案之一。

CookiesCookies 的英文是小餅乾的意義,源於這的英文是小餅乾的意義,源於這些儲存在客戶端電腦的檔案尺寸都很些儲存在客戶端電腦的檔案尺寸都很小,小, CookiesCookies 並不是儲存在伺服器,而是並不是儲存在伺服器,而是儲存在瀏覽程式所在電腦,所以並不會浪儲存在瀏覽程式所在電腦,所以並不會浪費伺服器資源。費伺服器資源。

Page 25: 第 10 章  交談期追蹤的Session與Cookies處理

10-4-1 Cookies10-4-1 Cookies 的基礎的基礎 -HTTP-HTTP標頭的標頭的 CookieCookie 資料資料 (( 格式格式 ))

在伺服器回應客戶端請求的在伺服器回應客戶端請求的 HTTPHTTP回應資料內就回應資料內就含有含有 HTTPHTTP 標頭資訊,標頭資訊, HTTPHTTP 標頭提供回應網頁標頭提供回應網頁檔案的重要資訊,內含多種欄位資料,每個欄位檔案的重要資訊,內含多種欄位資料,每個欄位的格式,如下所示:的格式,如下所示:

field-name:field_valuefield-name:field_value field-namefield-name 為欄位名稱,為欄位名稱, field_valuefield_value 為欄位值,為欄位值,

當客戶端向伺服器提出請求時,在當客戶端向伺服器提出請求時,在 HTTPHTTP回應資回應資料的標頭就會將設定料的標頭就會將設定 CookieCookie 資料的欄位送到客資料的欄位送到客戶端,其格式如下所示:戶端,其格式如下所示:

Set-Set-Cookie:name=value;expires=date;path=pCookie:name=value;expires=date;path=pname;domain=dname;securename;domain=dname;secure

Page 26: 第 10 章  交談期追蹤的Session與Cookies處理

10-4-1 Cookies10-4-1 Cookies 的基礎的基礎 -HTTP-HTTP標頭的標頭的 CookieCookie 資料資料 (( 屬性說明屬性說明 ))

namename屬性:屬性: CookieCookie 的名稱,可以使用此名稱的名稱,可以使用此名稱取出取出 CookieCookie 值和刪除值和刪除 CookieCookie 。。

expiresexpires屬性:屬性:一個選項,可有可無,指定一個選項,可有可無,指定CookieCookie 存在的有效期限,使用存在的有效期限,使用 GMTGMT 的時間,其的時間,其格式如下所示:格式如下所示:

Weekday, DD-MM-YY HH:MM:SS GMTWeekday, DD-MM-YY HH:MM:SS GMT domaindomain 屬性:伺服器的網域名稱,預設是建立屬性:伺服器的網域名稱,預設是建立

CookieCookie 的伺服器網域名稱。的伺服器網域名稱。 pathpath 屬性:在屬性:在 domaindomain 屬性下的路徑名屬性下的路徑名

稱,稱, pathpath 屬性可以進一步在同一個網站分辨是屬性可以進一步在同一個網站分辨是哪一個網頁所建立的哪一個網頁所建立的 CookiesCookies 。。

securesecure 屬性:如果指定此屬性,表示屬性:如果指定此屬性,表示 CookieCookie 需需要在保密情況下,才能在客戶端和伺服端傳送。要在保密情況下,才能在客戶端和伺服端傳送。

Page 27: 第 10 章  交談期追蹤的Session與Cookies處理

10-4-1 Cookies10-4-1 Cookies 的基礎的基礎 -- CookieCookie的基本應用的基本應用

個人資訊:個人資訊:使用使用 CookiesCookies 保留個人資訊,保留個人資訊,例如:姓名、地址、時區、帳號和是否曾例如:姓名、地址、時區、帳號和是否曾經進過此網站的記錄。經進過此網站的記錄。

個人化的內容:個人化的內容: CookiesCookies 可以儲存個人化可以儲存個人化網站外觀和個人偏好的網站內容,或是提網站外觀和個人偏好的網站內容,或是提供使用者有興趣的資訊。供使用者有興趣的資訊。

網站購物車:網站購物車:線上購物車需要保留使用者線上購物車需要保留使用者選擇的商品,選擇的商品, CookiesCookies 就可以用來記錄選就可以用來記錄選購的商品清單。購的商品清單。

Page 28: 第 10 章  交談期追蹤的Session與Cookies處理

10-4-2 10-4-2 新增新增 Cookie-Cookie- 語法語法 PHPPHP的的 CookieCookie 是使用是使用 setcookie()setcookie() 函數函數建立,其語法格式如下所示:建立,其語法格式如下所示:

setcookie ( string name [, string value setcookie ( string name [, string value [, int expire [, string path [, string [, int expire [, string path [, string domain [, int secure]]]]])domain [, int secure]]]]])

函數的參數是對應函數的參數是對應 HTTPHTTP 標頭標頭 CookieCookie 資料資料的屬性,的屬性, valuevalue是是 CookieCookie 值,值, expireexpire是是CookieCookie 保留的客戶端的期限,其值是整數保留的客戶端的期限,其值是整數的的 UNIXUNIX 時間刻記。時間刻記。

Page 29: 第 10 章  交談期追蹤的Session與Cookies處理

10-4-2 10-4-2 新增新增 Cookie-Cookie- 範例範例 在在 PHPPHP 程式建立程式建立 CookieCookie 主要使用主要使用

setcookie()setcookie() 函數的前函數的前 33 個參數,其程式碼個參數,其程式碼如下所示:如下所示:

setcookie("Username", $name, $date);setcookie("Username", $name, $date); 程式碼參數字串程式碼參數字串 UsernameUsername為為 CookieCookie 名名

稱,變數稱,變數 $name$name 是值,是值, $date$date 是時間刻是時間刻記的整數值,這是記的整數值,這是 CookieCookie 檔案儲存在客戶檔案儲存在客戶端電腦的有效期限,其日期計算的運算式,端電腦的有效期限,其日期計算的運算式,如下所示:如下所示:

$date = strtotime("+10 days", time());$date = strtotime("+10 days", time());

Page 30: 第 10 章  交談期追蹤的Session與Cookies處理

10-4-3 10-4-3 取得取得 CookieCookie 的內容的內容 客戶端電腦如果擁有客戶端電腦如果擁有 CookieCookie,, PHPPHP 程式程式

可以使用可以使用 $_COOKIE$_COOKIE 預定變數的結合陣列預定變數的結合陣列取得取得 CookieCookie 值,其程式碼如下所示:值,其程式碼如下所示:

$user = $_COOKIE["Username"];$user = $_COOKIE["Username"];

$pass = $_COOKIE["Password"];$pass = $_COOKIE["Password"]; 上述程式碼取得上述程式碼取得 CookieCookie 名稱名稱 UsernameUsername和和 PasswordPassword 的值,然後將它指定給變數的值,然後將它指定給變數$user$user和和 $pass$pass 。。

Page 31: 第 10 章  交談期追蹤的Session與Cookies處理

10-4-4 10-4-4 刪除刪除 CookieCookie

如果客戶端的如果客戶端的 CookieCookie 不再需要,不再需要, PHPPHP 程程式可以使用式可以使用 setcookie()setcookie() 函數刪除函數刪除 CookieCookie ,,刪除刪除 CookieCookie 是將是將 expireexpire 參數設為過期,參數設為過期,其程式碼如下所示:其程式碼如下所示:

setcookie("Username", "", time()-setcookie("Username", "", time()-3600);3600);

上述程式碼將有限期限設定為上述程式碼將有限期限設定為 11 個小時前,個小時前,因為因為 CookieCookie 已經過期,換句話說,就是刪已經過期,換句話說,就是刪除客戶端名為除客戶端名為 UsernameUsername的的 CookieCookie 。。

Page 32: 第 10 章  交談期追蹤的Session與Cookies處理

10-4-5 10-4-5 陣列陣列 CookieCookie 的使用的使用 --建建立立

CookieCookie 儲存的資料也可以是結合陣列,在儲存的資料也可以是結合陣列,在 PHPPHP程式取得程式取得 CookieCookie 後,同一個後,同一個 CookieCookie 名稱下還名稱下還可以使用鍵值儲存多個值,如下所示:可以使用鍵值儲存多個值,如下所示:

setcookie("user[Name]", "setcookie("user[Name]", "陳會安陳會安 ", ", time()+3600);time()+3600);setcookie("user[Username]", "Joe",setcookie("user[Username]", "Joe", time()+3600);time()+3600);setcookie("user[Password]", "1234",setcookie("user[Password]", "1234", time()+3600);time()+3600); 程式碼新增名為程式碼新增名為 useruser的的 CookieCookie ,這個,這個 CookieCookie

是結合陣列,擁有是結合陣列,擁有 33 個元素,其鍵值依序為:個元素,其鍵值依序為:NameName、、 UsernameUsername和和 PasswordPassword ,分別儲存,分別儲存使用者名稱、帳號和密碼。使用者名稱、帳號和密碼。

Page 33: 第 10 章  交談期追蹤的Session與Cookies處理

10-4-5 10-4-5 陣列陣列 CookieCookie 的使用的使用 -- 取取出出

因為因為 CookieCookie 是一個陣列,在取得陣列是一個陣列,在取得陣列CookieCookie 的值時,可以使用的值時,可以使用 whilewhile 迴圈配合迴圈配合list()list()和和 each()each() 函數取得每一個鍵值的內函數取得每一個鍵值的內容,如下所示:容,如下所示:

if (isset($cookie)) {if (isset($cookie)) { while (list($name, $value) = while (list($name, $value) =

each($cookie))each($cookie)) echo "$name = $value<br>";echo "$name = $value<br>";}}

Page 34: 第 10 章  交談期追蹤的Session與Cookies處理

10-5 PHP10-5 PHP 的交談期追蹤的交談期追蹤 10-5-1 PHP10-5-1 PHP的的 SessionSession 基礎基礎 10-5-2 10-5-2 交談期追蹤交談期追蹤

Page 35: 第 10 章  交談期追蹤的Session與Cookies處理

10-5-1 PHP10-5-1 PHP的的 SessionSession 基礎基礎 -- 說說明明

若若 PHPPHP 程式啟動程式啟動 SessionSession 處理功能(交談處理功能(交談期處理功能)。當使用者進入網站,期處理功能)。當使用者進入網站, PHPPHP引擎就會自動指定引擎就會自動指定 Session IDSession ID 編號建立一編號建立一個新個新 SessionSession (交談期),(交談期), SessionSession (交(交談期)是指使用者第一次進入網站,直到談期)是指使用者第一次進入網站,直到使用者離開網站為止的整個過程。使用者離開網站為止的整個過程。

SessionSession 類似儲存在客戶端的類似儲存在客戶端的 CookieCookie ,它,它可以在伺服端保留一些資源來儲存可以在伺服端保留一些資源來儲存SessionSession 變數,變數, PHPPHP 程式可以註冊不定數程式可以註冊不定數量的量的 SessionSession 變數,變數, PHPPHP 事實上是使用檔事實上是使用檔案來儲存這些案來儲存這些 SessionSession 變數。變數。

Page 36: 第 10 章  交談期追蹤的Session與Cookies處理

10-5-1 PHP10-5-1 PHP的的 SessionSession 基礎基礎 -- 圖圖例例

當這些變數註冊成為當這些變數註冊成為 SessionSession 變數後,所有啟動變數後,所有啟動SessionSession 處理功能的處理功能的 PHPPHP 程式都可以存取這些變程式都可以存取這些變數。如果同時有多位使用者進入網站,因為每位數。如果同時有多位使用者進入網站,因為每位使用者都會指定不同的使用者都會指定不同的 Session IDSession ID編號,換句話編號,換句話說,每個人都可以擁有專屬的說,每個人都可以擁有專屬的 SessionSession 變數,如變數,如下圖所示:下圖所示:

Page 37: 第 10 章  交談期追蹤的Session與Cookies處理

10-5-2 10-5-2 交談期追蹤交談期追蹤 -- 說明說明 交談期追蹤(交談期追蹤( Session TrackingSession Tracking )是一種)是一種機制,可以在一段時間內,讓網站維持一機制,可以在一段時間內,讓網站維持一系列從同一位使用者提出(通常是指同一系列從同一位使用者提出(通常是指同一個瀏覽程式提出)請求的狀態保留機制,個瀏覽程式提出)請求的狀態保留機制,以便追蹤使用者的狀態。以便追蹤使用者的狀態。

交談期追蹤和第交談期追蹤和第 99 章的狀態管理十分相似,章的狀態管理十分相似,不過第不過第 99 章的狀態管理是指如何將一頁章的狀態管理是指如何將一頁PHPPHP 程式的狀態傳遞到下一頁程式的狀態傳遞到下一頁 PHPPHP 程式的程式的方法,交談期追蹤強調的是使用者在整個方法,交談期追蹤強調的是使用者在整個SessionSession 交談期和跨過多頁交談期和跨過多頁 PHPPHP 程式程式HTTPHTTP 請求的狀態保留。請求的狀態保留。

Page 38: 第 10 章  交談期追蹤的Session與Cookies處理

10-5-2 10-5-2 交談期追蹤交談期追蹤 -- 圖例圖例 PHPPHP 引擎實作交談期追蹤的方式是使用引擎實作交談期追蹤的方式是使用 SessionSession

變數,變數, PHPPHP 引擎指定每一位瀏覽網站的使用者一引擎指定每一位瀏覽網站的使用者一個個 Session IDSession ID編號來作為識別,使用者每一次的編號來作為識別,使用者每一次的HTTPHTTP請求都需附上請求都需附上 Session IDSession ID編號,以便判斷編號,以便判斷是否是同一位使用者提出的請求,如下圖所示:是否是同一位使用者提出的請求,如下圖所示:

Page 39: 第 10 章  交談期追蹤的Session與Cookies處理

10-6 Session10-6 Session的處理的處理 10-6-1 10-6-1 註冊與存取註冊與存取 SessionSession 變數變數 10-6-2 10-6-2 取消註冊取消註冊 SessionSession 變數與關閉變數與關閉

SessionSession 10-6-3 10-6-3 使用使用 SessionSession 變數傳遞資料變數傳遞資料

Page 40: 第 10 章  交談期追蹤的Session與Cookies處理

10-6-1 10-6-1 註冊與存取註冊與存取 SessionSession 變變數數 -- 函數函數

在在 PHPPHP 程式使用程式使用 SessionSession 處理功能需要呼處理功能需要呼叫叫 session_start()session_start() 函數,以便讓函數,以便讓 PHPPHP 引引擎將擎將 SessionSession 變數等相關資訊載入記憶體,變數等相關資訊載入記憶體,其相關函數的說明如下表所示:其相關函數的說明如下表所示:

函數 說明session_start() 啟動 Session,也就是將此 PHP程式加入交談期session_id() 傳回 Session ID編號的字串

session_register(string) 將參數的變數名稱註冊成為 Session變數session_is_registered(string)檢查參數是否是已註冊的 Session變數,如果是,

傳回 true,否則為 false

Page 41: 第 10 章  交談期追蹤的Session與Cookies處理

10-6-1 10-6-1 註冊與存取註冊與存取 SessionSession 變變數數 -- 使用使用

在在 PHPPHP 程式使用程式使用 SessionSession 變數需要先註冊,如變數需要先註冊,如下所示:下所示:

session_register("page_counter");session_register("page_counter"); 在註冊成為在註冊成為 SessionSession 變數後,變數後, PHPPHP 程式就可以程式就可以

使用使用 $_SESSION$_SESSION 結合陣列的預定變數來取得指結合陣列的預定變數來取得指定的定的 SessionSession 變數,如下所示:變數,如下所示:

$_SESSION["page_counter"]++;$_SESSION["page_counter"]++; 程式碼將程式碼將 SessionSession 變數變數 page_counterpage_counter 加一。可加一。可

以使用以使用 session_id()session_id() 函數取得使用者的函數取得使用者的 Session Session IDID ,如下所示:,如下所示:

使用者的使用者的 Session ID : <? echo session_id() ?Session ID : <? echo session_id() ?><br>><br>

Page 42: 第 10 章  交談期追蹤的Session與Cookies處理

10-6-2 10-6-2 取消註冊取消註冊 SessionSession 變數變數與關閉與關閉 SessionSession

PHPPHP 提供提供 SessionSession 相關處理函數可以取消相關處理函數可以取消註冊註冊 SessionSession 變數與關閉變數與關閉 SessionSession ,其相,其相關函數的說明,如下表所示:關函數的說明,如下表所示:

函數 說明session_unregister(string) 取消註冊參數字串的 Session變數

session_unset() 刪除所有 Session變數session_destroy() 關閉 Session且刪除所有 Session變數

Page 43: 第 10 章  交談期追蹤的Session與Cookies處理

10-6-3 10-6-3 使用使用 SessionSession 變數傳遞變數傳遞資料資料 --建立建立 SessionSession 變數變數 11

PHPPHP的的 SessionSession 變數可以在網頁之間傳遞變數可以在網頁之間傳遞資料,換句話說,我們可以使用資料,換句話說,我們可以使用 SessionSession變數取代表單欄位或變數取代表單欄位或 URLURL 參數來傳遞資料。參數來傳遞資料。例如:使用例如:使用 SessionSession 變數儲存使用者資訊,變數儲存使用者資訊,使用者使用者 hueyanhueyan的的 SessionSession 變數,如下所變數,如下所示:示:

$_SESSION["userName"] = "hueyan";$_SESSION["userName"] = "hueyan";

$_SESSION["userPassword"] = "1234";$_SESSION["userPassword"] = "1234";

Page 44: 第 10 章  交談期追蹤的Session與Cookies處理

10-6-3 10-6-3 使用使用 SessionSession 變數傳遞變數傳遞資料資料 --建立建立 SessionSession 變數變數 22

如果另一位使用者如果另一位使用者 janejane 也執行此也執行此 PHPPHP 程程式,伺服器也會替它建立一組式,伺服器也會替它建立一組 SessionSession 變變數,其程式碼如下:數,其程式碼如下:

$_SESSION["userName"] = "jane";$_SESSION["userName"] = "jane";

$_SESSION["userPassword"] = "5678";$_SESSION["userPassword"] = "5678";

Page 45: 第 10 章  交談期追蹤的Session與Cookies處理

10-6-3 10-6-3 使用使用 SessionSession 變數傳變數傳遞資料遞資料 -- 取得取得 SessionSession 變數值變數值

只要只要 PHPPHP 程式啟動程式啟動 SessionSession 交談期,都可交談期,都可以取得上述以取得上述 SessionSession 變數值,如下所示:變數值,如下所示:

$name = $_SESSION["userName"];$name = $_SESSION["userName"];

$pass = $_SESSION["userPassword"];$pass = $_SESSION["userPassword"];