| 經驗交流 |
|
|---|---|
|
重現使用者填寫錯誤的表單 | |
問題說明 | |
| 當我們設計一個複雜的表單,供使用者輸入資料時,萬一眾多欄位中僅有一點小錯誤,而被系統所拒絕,並且強迫返回前一頁的話,那麼使用者將得再度面臨一個複雜難填的表單。 | |
| 若是在強迫返回的同時,幫使用者保留先前已填的內容,這不但可以讓使用者確實瞭解填表時的錯誤何在,更可以為使用者大大節省重填所需的時間。 | |
| 這要怎麼做呢?請參考以下的做法。 | |
我的做法 | |
| 首先,我將使用兩支程式來實現這個效果,一個負責前端的填表介面(X_26_demo1.php),另一個擔任後端強迫返回的工作(X_26_demo2.php)。 | |
| 我在 X_26_demo1.php 裡使用多種表單元件: | |
|
• 會員註冊 <form action="X_26_demo2.php" name="DemoForm" method="POST" onsubmit="return Final_Check( );"> 帳號:<input type="text" name="UserName"> 密碼:<input type="password" name="Password"> 性別:<input type="radio" name="Sex" value="M" checked>男 <input type="radio" name="Sex" value="F">女 興趣:<input type="checkbox" name="Interest_1" value="music">音樂 <input type="checkbox" name="Interest_2" value="sport">運動 月薪:<select name="Salary"> <option value="3M">三萬以下 <option value="35" selected>三 ∼ 五萬 <option value="57">五 ∼ 七萬 <option value="7P">七萬以上 </select> 簡歷:<textarea name="Introduction" rows=4 cols=40></textarea> <input type="submit" value="送出"> </form> | |
|
現在,為了示範的理由,無論使用者填寫什麼內容,在送給 X_26_demo2.php 後,我們都將表單退回去。重點來了,在退回這份表單時,原來填寫的資料,除了「Password」這個欄位之外,我們都必須要回復到他原來所填的樣貌。 | |
| 為了達到這種效果,您可以試試以下兩種方法: | |
| 《方法一》 | |
| 我在 X_26_demo2.php 直接使用 JavaScript 的 history.back() 方法,將畫面導回前一頁。 | |
|
<script language="JavaScript"> history.back(); </script> | |
|
《方法二》 | |
| 我在 X_26_demo2.php 裡重製一個類似於 X_26_demo1.php 裡的 DemoForm,以便傳回資料。 | |
|
<form action="X_26_demo1.php" name="DemoForm" method="POST"> <input type="hidden" name="UserName" value="<?echo stripslashes($_POST['UserName']);?>"> <input type="hidden" name="Sex" value="<?echo $_POST['Sex'];?>"> <input type="hidden" name="Interest_1" value="<?echo $_POST['Interest_1'];?>"> <input type="hidden" name="Interest_2" value="<?echo $_POST['Interest_2'];?>"> <input type="hidden" name="Salary" value="<?echo $_POST['Salary'];?>"> <input type="hidden" name="Introduction" value="<?echo stripslashes($_POST['Introduction']);?>> </form> | |
|
您注意到了嗎?由於 UserName 與 Introduction 這兩個欄位可能會傳入帶有 ASCII 92 字元(\)的中文字,所以我們必須先以 stripslashes() 為它們加工一下,才能回傳給使用者。 | |
| 上述的寫法在表單內容不太大時還能接受,若表單內有數十個元件的話,那就累人了。此時,您可以改用下列這種簡便的方法。 | |
|
<form action="X_26_demo1.php" name="DemoForm" method="POST"> <? while ( list($k, $v) = each($_POST) ) echo "<input type=\"hidden\" name=\"" . $k . "\" value=\"" . stripslashes($v) . "\">\n"; ?> </form> | |
|
之所以能採用這麼簡單的方式,那是因為 X_26_demo1.php 以 POST 的方式送出表單資料,所以整個表單的內容就被存在 $_POST 裡頭。它是一個陣列,內容大致如下: | |
|
Array ( [UserName] => chensh(使用者填的 UserName) [Password] => 123456(使用者填的 Password) [Sex] => M(使用者選取的 Sex) [Interest_1] => (使用者未選取 Interest_1) [Interest_2] => sport(使用者選取 Interest_2) [Salary] => 35(使用者選取的 Salary) [Introduction] => 我是一個國小教師(使用者填的 Introduction) ) | |
|
由於在 $_POST 這個陣列裡,元素的鍵值(key)並不是數字,而是文字,所以我使用 while 迴圈,並搭配 each 函數,便能一一取出陣列中的 key 與 value。 | |
|
上述的「方法二」較為複雜,我將其程式寫成以下的範例,您可以自行試用看看。 | |
|
| |
| 2005.1.27 寫於嘉義市教網中心 | |
| 經驗交流 |
|


問題說明