學慣用php建立多頁表單
來源:互聯網
上載者:User
建立 當然,到這裡並未結束。畢竟,如果可以在一個頁面上建立多個表單,為何不能建立跨多頁面的表單呢?
不幸的是,用 HTTP從一頁面傳送資料到另一頁面並不輕鬆。因為在 HTTP協議中沒有內建機制以定義系列頁面的概念。不過,僅需通過一些靈巧的技巧,以及PHP 某些有用的函數,我們就可以不用花太多力氣而突破此限制。在此章節中,關鍵思想在於把上一頁面擷取的輸入存到下一頁面表單的隱含變數中。當我們在螢幕不同頁面切換時,代碼也在頁面間傳遞資訊,每一表單都含有上一個表單的資料。這個方法似乎有點笨拙,不過就目前情況而言是最為簡便的方法——且無需使用資料庫或cookies。
意料之中的是我們將擴充對變數$state的使用以適應此特性。這正是為什麼我們過去學習了關於此技巧的內容,而沒有打算使用更為簡單的方式處理單一頁面中的多個表單。
為了方便起見,我們將重複使用先前的表單範例。但這次我們將將其拆分為兩個頁面,而非把有關乳酪的重要問題跟使用者名稱稱放在同一頁面之上。
由此會得到三個函數而非兩個。此外,對函數略微更名以反映其內容上的改變。display_form() 現已改名為display_name()。
<?php
function display_name() {
global $PHP_SELF;
?>
<FORM TARGET="<?php echo $PHP_SELF; ?>" METHOD=GET>
Name: <INPUT TYPE=TEXT NAME="name"><BR>
<INPUT TYPE=HIDDEN NAME="stage" VALUE="cheese">
<INPUT TYPE=SUBMIT VALUE="Thanks!">
</FORM>
<?php
}
?>
與先前所介紹的函數相同,但我們先解決下一問題,並把下一stage的名稱改為 cheese以更明確地告之使用者下一步要做什麼。
接下來是display_cheese()。
<?php
function display_cheese() {
global $PHP_SELF;
global $name;
?>
<FORM TARGET="<?php echo $PHP_SELF; ?>" METHOD=GET>
Favorite Cheese: <INPUT TYPE=RADIO NAME="cheese" VALUE="brie">Very soft French Brie
<INPUT TYPE=RADIO NAME="cheese" VALUE="cheddar">Farmhouse English Cheddar
<INPUT TYPE=RADIO NAME="cheese" VALUE="mozzarella">Italian Buffalo Mozzarella
Favorite Times to Eat Cheese: <INPUT TYPE=CHECKBOX NAME="times[]" VALUE="m">Morning
<INPUT TYPE=CHECKBOX NAME="times[]" VALUE="n">Noon
<INPUT TYPE=CHECKBOX NAME="times[]" VALUE="d">Dinner
<INPUT TYPE=CHECKBOX NAME="times[]" VALUE="l">Late night
<INPUT TYPE=HIDDEN NAME="name" VALUE="<?php echo htmlspecialchars($name); ?>">
<INPUT TYPE=HIDDEN NAME="stage" VALUE="results">
<INPUT TYPE=SUBMIT VALUE="Thanks!">
</FORM>
<?php
}
?>
以上的代碼看起來應該非常熟悉。除在輸出隱藏的stage元素前先輸出上一部分資料中的 $name變數名及值之外,我們沒有做任何意料之外的修改。我們並未直接輸出變數值,而是通過一個名為htmlspecialchars()的PHP函數。在HTM中,有以下四個字元除被作為標記(markup)使用外,在其他地方不應被使用的:“<”、“>”、“"”、以及“&”。因此,為了確保不使瀏覽器造成混亂,我們通過htmlspecialchars()函數使用$name變數。由此,某個人的名字原為"Bret & Jeff"就會成為"Brett & Jeff" 了。
現在,當提交此新表單時,不會漏失任何資訊。
以上技巧的作用是我們不必更改原process_form() 函數任何部分。事實上,我們還會保持函數名稱不變。僅需對頁面顯示邏輯加上新的一行。
<?php
if (empty($stage)) { display_name(); }
elseif ($stage == 'cheese') { display_cheese(); }
else { process_form(); }
?>
看到了嗎?我們只需在先前的兩個聲明中加入elseif。這正是使用變數$stage的巧妙之處。如果我們要再添加幾個頁面,只需寫一個新函數以顯示所要的內容,併當其顯示時加入一行代碼對其進行控制即可。