You are on page 1of 50

PHP 的狀態管理與表單處理

 PHP 狀態管理的基礎
 PHP 的表單處理
 文字與密碼方塊
 文字區域
 核取方塊
 下拉式清單方塊
 選擇鈕
 隱藏欄位
 表單欄位驗證
PHP 狀態管理的基礎
 HTTP 通訊協定的特性
 狀態管理的種類
PHP 狀態管理的基礎
 當 PHP 程式在伺服端執行時,因為 HTTP 通訊協
定並不會保留客戶端的使用者狀態,所以瀏覽不
同的 PHP 程式時, PHP 程式需要將使用者狀態
傳遞給下一頁瀏覽的 PHP 程式,稱為「狀態管理
」( State Management )。

 簡單的說,狀態管理是在保留客戶端使用者狀態
,以便 PHP 網站可以取得使用者狀態來正確的執
行 PHP 程式。
HTTP 通訊協定的特性
 HTTP 通訊協 定不會 持續 保持連 線: 只有當瀏覽程式提
出請求時才會建立連線,在請求後就斷線等待回應,每一
次請求和回應都需事先建立連線。

 HTTP 通訊協 定並不 會保 留狀態 : 因為 HTTP 通訊協定


並不會保持連線,所以在連線時,伺服端和客戶端互相知
道對方,一旦請求結束,就互不相干,使用者狀態並不會
保留。

 HTTP 通訊協 定與資 料類 型無關 : 任何種類的資料都可


以透過 HTTP 通訊協定傳送到客戶端,這就是 Content-
Type 標頭資訊指定的 MIME 資料類型。
狀態管理的種類 - 說明
 狀態管理( State Management )是在
PHP 程式間傳遞資料,以便不同 PHP 程
式能夠保留使用者狀態。狀態管理以狀態
資訊儲存的位置,可以區分成兩大類:
• 儲存在客戶端
• 儲存在伺服端
狀態管理的種類 - 客戶端的狀態管理
 客戶端的狀態管理是將資料儲存在使用者
電腦,或是儲存在 HTML 網頁或 PHP 程
式建立的 HTML 標籤中,以便將資料傳遞
給下一個 PHP 程式,常用的方法如下表所
示:
使用方法 說明
表單欄位 使用 HTML 表單欄位內容傳遞資料到其他 PHP 程式
URL 參數 使用 URL 網址的參數來傳遞資料
Cookies Cookies 是保留在使用者電腦的小檔案,檔案內容是一
些執行時所需的使用者資訊
狀態管理的種類 - 伺服端的狀態管理
 伺服端的狀態管理是將資料儲存在伺服端
的電腦,換句話說,狀態管理的使用者狀
態資訊會佔用伺服器的資源,常用的方法
如下表所示:
使用方法 說明
Session 變數 使用 Session 變數儲存使用者資料
文字檔案 使用伺服端的文字檔案來儲存使用者資料
資料庫 使用資料庫的記錄儲存使用者資料
XML 文件 使用 XML 文件儲存使用者資料
PHP 的表單處理與 URL 參數
 網頁表單的用途
 HTML 標籤建立網頁表單

 $_POST 與 $_GET 結合陣列變數

 URL 參數傳遞資料
網頁表單的用途
 PHP 程式是在伺服端執行,換句話說,客
戶端網頁只負責取得使用者輸入的資料,
然後將輸入資料送到伺服端進行處理,使
用的是 HTML 網頁表單,如下圖所示:
HTML 標籤建立網頁表單 - 標籤
 在 HTML 標籤關於網頁表單的標籤只有五
個,如下表所示:
表單標籤 說明
<form> … </form> HTML 表單標籤
<input type=…> 輸入或選擇資料的表單欄位,包含按鈕和文字方
塊欄位,不同 type 屬性表示不同的欄位
<select> …. </select> 建立選單欄位,內含<option>標籤的選項
<option> …. </option> 選單欄位的選項
<textarea> …. </textarea> 文字區域欄位
HTML 標籤建立網頁表單 - 架構
<form name="name" method="post |
get" action="URL" enctype="MIME">
<input type=…>
<textarea> …. </textarea>
<select>
<option> …. </option>
</select>
<input type="submit" …>
</form>
HTML 標籤建立網頁表單 -<form> 標籤的屬

 name 屬性:表單名稱。
 method 屬性:設定資料送出方式,如下:
<form name="order"
method="post"></form>
 action 屬性:設定 PHP 表單處理程式所在的路徑,也可
以是 URL 網址,如下所示:
<form name="order" method="post"
 action="Ch9-3-2.php"></form>
 enctype 屬性:設定表單資料傳送時的編碼方式。
$_POST 與 $_GET 結合陣列變數 - 說明
 PHP 的表單處理是使用 PHP 的「預定變數」
( Predefined Variables )取得欄位資料,預
定變數不同於使用者宣告的變數,屬於 PHP 引擎
建立的變數。
 PHP 關於表單處理的預定變數是一種預設擁有全
域變數範圍的結合陣列變數,一共有 2 個,其說
明如下表所示:
預定變數 說明
$_POST 結合陣列變數,儲存透過 HTTP POST 方法傳入 PHP 程式檔
案的表單欄位資料,鍵值是欄位名稱
$_GET 結合陣列變數,儲存透過 HTTP GET 方法傳入 PHP 程式檔
案的表單欄位資料,鍵值是欄位名稱
$_POST 與 $_GET 結合陣列變數 - 範例

 例如:網頁表單擁有名為 Username 的欄
位,在 PHP 程式碼可以使用上表的預定變
數取得欄位值,如下所示:
$name = $_POST["Username"];
$name = $_GET["Username"];
 上述程式碼可以取得結合陣列的元素值,
即欄位輸入的內容。
$_POST 與 $_GET 結合陣列變數 - 使用

 PHP 程式碼到底是使用 $_POST 或


$_GET 變數,需視 HTML 表單 <form>
標籤的 method 屬性值而定,如下表所示
: 屬性值
method PHP 程式使用的結合陣列變數
POST 或 post $_POST
GET 或 get $_GET
URL 參數傳遞資料 -<a> 標籤
 PHP 除了可以使用本章後的表單來傳遞資
料外,還可以使用超連結 URL 參數或是
header() 函數(詳見第 10 章的說明)轉
址傳送資料給其他 PHP 程式,如下所示:
<a href="Ch9-2-4.php?Username= 陳會安
&Password=5678"> 登入網站 </a>
 <a> 標籤的超連結傳遞 Username 和
Password 一共兩個參數。
URL 參數傳遞資料 - 取得參數值
PHP 程式取得超連結傳遞參數如同表單的
get 方法,可以使用 $_GET 陣列變數取得
參數或欄位值,如下所示:
$username = $_GET["Username"];
$pass = $_GET["Password"];
文字與密碼方塊
 文字與密碼方塊欄位
 取得文字與密碼方塊欄位的內容
文字與密碼方塊欄位 - 語法
 文字和密碼方塊都可以輸入一段文字內容
,唯一的差別在於密碼欄位輸入的資料並
不會顯示出來,而是使用小圓點或「 * 」
星號代替,其基本語法如下所示:
<input type="text | password"
name="Name" maxlength=value
readonly= False | True size="Value"
value="String">
文字與密碼方塊欄位 - 屬性
 語法的屬性說明,如下表所示:
屬性 說明
type 屬性值 text 為文字方塊,password 為密碼方塊
name 欄位名稱
maxlength 使用者允許輸入的最大字元個數,預設值 0 表示不限長度
readonly 欄位是否為唯讀,預設為 False 表示允許輸入,如為 True 表
示唯讀,不能輸入資料
size 設定欄位顯示的寬度有多少個字元
value 設定欄位的預設值
取得文字與密碼方塊欄位的內容
 在建立好文字與密碼方塊的 HTML 表單後
,我們就可以撰寫 PHP 程式取得欄位內容。
文字與密碼欄位是直接將輸入資料傳到伺
服器, PHP 程式只需使用 $_POST 結合陣
列變數就可以取得欄位內容,如下所示:
$username = $_POST["Username"];
$password = $_POST["Password"];
 上述程式碼的陣列鍵值是表單欄位的名稱
屬性 name ,分別為: User 文字方塊和
Pass 密碼方塊的內容。
文字區域
 文字區域欄位
 取得文字區域欄位的內容
文字區域欄位 - 語法
 當需要輸入整個段落或整篇文字時,我們
就可以在表單使用文字區域欄位,其基本
語法如下所示:
<textarea name="Name" rows=value
cols=value wrap=off | virtual | physical
value="String">
</textarea>
文字區域欄位 - 屬性
 語法的屬性說明,如下表所示:
屬性 說明
name 欄位名稱
rows 欄位可以輸入幾列
cols 欄位的每列有幾個字
wrap 設定顯示和送出時的換行方式,off 為不換行,virtual 為
自動換行,但輸出時仍然為一列,physical 也是自動換
行,不過輸出時同時也會換行
value 欄位的預設值
取得文字區域欄位的內容
 在建立文字區域欄位的 HTML 表單後,就
可以撰寫 PHP 程式取得欄位內容,如下所
示:
$msg = $_POST["Message"];
echo " 意見 :<br>".nl2br($msg)."<br>";
 上述程式碼取得名為 Message 文字區域的
內容,因為 HTML 標籤顯示欄位內容時,
並不會顯示換行,所以呼叫 nl2br() 函數
將換行符號 \n 替換成 <br> 換行標籤。
核取方塊
 核取方塊欄位
 取得核取方塊欄位的內容
核取方塊欄位 - 語法
 表單欄位的核取方塊如同一個開關,可以
勾選或取消勾選來設定是否使用此功能,
其基本語法如下所示:
<input type="checkbox" name="Name"
checked value="String">
核取方塊欄位 - 屬性
 語法的屬性說明,如下表所示:
屬性 說明
type 屬性值 checkbox 為核取方塊
name 欄位名稱
checked 此屬性沒有參數值,加上屬性名稱表示預設勾選
value 勾選後表單送出的值,在送出表單時,如果是沒有勾選的核取
方塊,這個值會被忽略掉
取得核取方塊欄位的內容
 核取方塊在表單扮演的角色是一個開關,
PHP 程式取得核取方塊欄位內容是使用
isset() 檢查欄位是否勾選,傳回值是欄位
的 value 屬性值,如下所示:
if (isset($_POST["ie"]))
echo " 使用 Internet Explorer<br>";
 上述 if 條件檢查 ie 核取方塊是否被勾選,

如果 isset() 傳回 true ,就表示使用者勾


選核取方塊,每一個核取方塊都可以使用
相同方式進行檢查。
下拉式清單方塊
 下拉式清單方塊欄位
 取得下拉式清單方塊欄位的內容

 取得清單方塊欄位的內容
下拉式清單方塊欄位 - 種類
 下拉式清單方塊 : 當 size 屬性值為 1 時
只顯示一個選項,需要按右邊▼鈕才能顯
示其他選項,如下圖所示:

 清單方塊: 和下拉式清單方塊一樣,只不
過顯示的選項不只一個, size 屬性為顯示
的選項數,如果選項太多超過清單方塊尺
寸,視窗就會出現捲動軸幫助檢視選項,
如下圖所示:
下拉式清單方塊欄位 - 語法
 HTML 的 <select> 標籤需要配合
<option> 標籤的選項,才能建立下拉式
清單方塊欄位,其基本語法,如下所示:
<select name="Name" multiple size=number>
<option value="Item_Name"> 選項名稱 </option>

<option value="Item_Name" selected> 選項名稱 </option>

…..
</select>
下拉式清單方塊欄位 - 屬性
 <select> 標籤的屬性說明,如下表所示:
屬性 說明
name 欄位名稱
multiple 設定是否為複選,如為複選一定是清單方塊
size 顯示選項數目,1 為下拉式清單方塊,大於 1 為清單方塊
 <option> 標籤的屬性說明,如下表所示

屬性 說明
value 選項值
selected 此屬性沒有屬性值,加上此屬性表示是預選選項
取得下拉式清單方塊欄位的內容
 下拉式清單方塊欄位會將 <option> 選項
標籤屬性 value 的值傳送到伺服器,在
PHP 程式是使用 $_POST 結合陣列取得欄
位內容,如下所示:
$gender = $_POST["Gender"];
 上述程式碼取得下拉式清單方塊 Gender
的值,此值就是使用者選擇選項的 value
屬性值。
取得清單方塊欄位的內容 - 標籤
 清單方塊如果是單選, PHP 處理程式取得選擇的
方式和下拉式清單方塊相同,如果是複選的清單
方塊欄位, HTML 表單標籤的欄位名稱是一個陣
列,如下所示:
<select name="Webs[]" size="4" multiple>
……
</select>
 上述 <select> 標籤的 name 屬性為 Webs[] ,
表示 PHP 取得的欄位值是一個陣列,接著我們可
以使用 if 或 switch 條件敘述來判斷使用者的選
擇。
取得清單方塊欄位的內容 - 取得欄位內

 在 PHP 程式一樣是使用 $_POST 取得欄位
內容,只不過取得的欄位內容是一個陣列
,如下所示:
$webs = $_POST["Webs"];
 上述程式碼取得清單方塊欄位 Webs[] 的

陣列值,可以使用 foreach 迴圈配合


switch 條件進一步判斷使用者複選的選項

選擇鈕
 選擇鈕欄位
 取得選擇鈕欄位的內容
選擇鈕欄位 - 語法
選擇鈕能夠在表單設計一組選項,每一個
選項名稱旁有一個圓形的選項鈕,屬於多
選一的單選題,其基本語法如下所示:
<input type="radio" name="Name"
checked value="String">
選擇鈕欄位 - 屬性
 語法的屬性說明,如下表所示:
屬性 說明
type 屬性值 radio 為選擇鈕
name 欄位名稱
checked 此屬性沒有參數值,加上屬性名稱表示預設選取此選擇鈕
value 選取後表單送出的值,在送出表單時,如果是沒有選取的選
擇鈕,這個值就會被忽略掉
取得選擇鈕欄位的內容
 選擇鈕欄位是一個單選題,其處理方式和
單選的下拉式清單方塊相同,也是將標籤
屬性 value 值傳送到伺服器,使用
$_POST 結合陣列取得選擇鈕欄位的內容
,如下所示:
$gender = $_POST["Gender"];
 上述程式碼取得選擇鈕 Gender 的值,此

值是選取選項的 value 屬性值,換句話說


,依屬性值就可進一步使用 if 或 switch 條
件敘述判斷使用者的選擇。
隱藏欄位
 隱藏欄位
 取得隱藏欄位的內容
隱藏欄位
 隱藏欄位並不需使用者輸入資料,而是直
接將 value 屬性值傳送到伺服端,通常是
用來傳送表單的環境參數,或是在不同網
頁表單間傳遞資料,其基本語法如下所示

<input type="hidden" name="Name“ value="String">
 屬性上述語法的屬性說明,如下表所示:
說明
type 屬性值 hidden 為隱藏欄位
name 欄位名稱
value 欄位送出的值
取得隱藏欄位的內容
 隱藏欄位和文字或密碼方塊一樣,在伺服
端只需使用 $_POST 結合陣列就可以取得
隱藏欄位的內容,如下所示:
$order = $_POST["Order"];
 上述程式碼取得名為 Order 的隱藏欄位值

,傳送的是欄位屬性 value 的值。


表單欄位驗證
 PHP 程式如何驗證表單
 表單欄位驗證
PHP 程式如何驗證表單 - 說明
 在 PHP 程式取得表單欄位資料並不困難,事實上
,我們反而需要多考量使用者輸入的資料是否符
合需求,在處理取得的資料前進行欄位資料的驗
證,檢查使用者輸入的資料是否符合所需的格式。

 當 PHP 程式使用 $_POST 或 $_GET 結合陣列取


得欄位資料後,在真正處理資料前,我們可以使
用 if 等條件敘述檢查使用者輸入的欄位資料是否
正確,或資料是否空白,表示使用者忘了輸入欄
位資料。
PHP 程式如何驗證表單 - 流程圖
 如果使用者輸入的資料有錯誤, PHP 程式
並不進行資料處理,而是顯示錯誤訊息,
然後回到表單網頁要求使用者重新輸入,
表單欄位驗證的流程圖,如下圖所示:
PHP 程式如何驗證表單 - 實作
 在實做表單欄位驗證時,我們可以使用兩個 PHP
程式:一是表單網頁顯示錯誤訊息,一是 PHP 處
理程式,當錯誤產生時,就使用 header() 轉址
回網頁表單( header 的說明請參閱教科書第 19 章)。

 另一種方式是將表單和 PHP 處理程式寫在同一個


PHP 程式,使用 if 條件判斷是否是表單送回,如
果是,再進行表單欄位驗證和處理。在下一節筆
者準備使用此方式建立表單欄位驗證。
表單欄位驗證 - 判斷是否是表單送回
 PHP 程式進行欄位驗證時,因為表單和處理程式
寫在同一個程式檔案,所以 PHP 程式需要判斷顯
示表單內容,或是輸入資料後的表單送回,可以
執行表單欄位驗證,如下所示:
if ( isset($_GET["Reg"]) ) {
// 表單處理
………
}
 上述 if 條件可以判斷使用者是否按下表單按鈕,

因為表單使用 get 方法,所以在 PHP 程式是使用


$_GET 結合陣列。
表單欄位驗證 - 欄位驗證
 如果按下按鈕,就表示使用者已經輸入資
料,將表單送回進行處理,所以我們可以
開始執行欄位資料的檢查,接著進行表單
處理。
 如果欄位有錯誤,就不進行表單處理,直
接再次顯示網頁表單,以便讓使用者重新
輸入正確的欄位資料。
表單欄位驗證 - 保留資訊
 因為 HTTP 通訊協定並不能保留狀態,當
錯誤發生回到表單後,就算是一些輸入正
確的欄位也一樣需要重新輸入,為了保留
使用者已經輸入正確的欄位資料,表單欄
位在欄位的 value 屬性有設定預設值,如
下所示:
<input type="text" name="Name"
size ="10“
value="<? echo $name ?>"><br>