HonestQiao 回復于:2005-04-15 17:02:28 |
問題頁面設計:第一問題分類頁面:
[code:1:ee17087108] <PRE> <form action="invest.php" method="post" target="_self"> 一、第一類問題 1. 問題1? <input type="checkbox" name="q1[1][]" value="1">選項1 <input type="checkbox" name="q1[1][]" value="2">選項2 2. 問題2? <input type="radio" name="q1[2][]" value="1">選項1 <input type="radio" name="q1[2][]" value="2">選項2 <input type="text" name="q1_input[2]" value=""> <input name="step" type="hidden" id="step" value="1"> <input type="submit" name="Submit" value="下一步"> </form> </PRE> [/code:1:ee17087108] |
HonestQiao 回復于:2005-04-15 17:07:07 |
問題頁面設計:第二問題分類頁面:
[code:1:06639d1d6d] <PRE> <form action="invest.php" method="post" target="_self"> 二、第二類問題 1. 問題1? <input type="checkbox" name="q2[1][]" value="1">選項1 <input type="checkbox" name="q2[1][]" value="2">選項2 2. 問題2? <input type="radio" name="q2[2][]" value="1">選項1 <input type="radio" name="q2[2][]" value="2">選項2 <input type="text" name="q2_input[2]" value=""> <input name="step" type="hidden" id="step" value="2"> <input type="submit" name="Submit" value="下一步"> </form> </PRE> [/code:1:06639d1d6d] |
HonestQiao 回復于:2005-04-15 17:12:02 |
問題頁面設計:第三問題分類頁面:
[code:1:1e201a60a2] <PRE> <form action="invest.php" method="post" target="_self"> 三、第三類問題 1. 問題1? <input type="checkbox" name="q3[1][]" value="1">選項1 <input type="checkbox" name="q3[1][]" value="2">選項2 2. 問題2? <input type="radio" name="q3[2][]" value="1">選項1 <input type="radio" name="q3[2][]" value="2">選項2 <input type="text" name="q3_input[2]" value=""> <input name="step" type="hidden" id="step" value="3"> <input type="submit" name="Submit" value="下一步"> </form> </PRE> [/code:1:1e201a60a2] |
HonestQiao 回復于:2005-04-15 17:18:39 |
問題頁面設計:選項的設計技巧:
從以上三個問題頁面的HTML代碼可以看出: [code:1:b6efb7b6e4] <input type="radio" name="q1[2][]" value="2"> [/code:1:b6efb7b6e4] [color=red:b6efb7b6e4] q1、q2、q3表示問題的分類 q1[2]表示這是第一個分類的第二個問題 q1[2][]表示這是第一個分類的第二個問題的選項 value="2" 表示這是第二個選項 [/color:b6efb7b6e4] [code:1:b6efb7b6e4] <input name="step" type="hidden" id="step" value="1"> [/code:1:b6efb7b6e4] 這個表示進行到了第幾個問題分類 |
HonestQiao 回復于:2005-04-15 17:33:25 |
特別注意:以下程序經過刪節,如有不全之處,請告知
[code:1:clearcase/" target="_blank" >cc1332e52c] <?php session_start(); $intStep=(int)$_POST['step']; if ($intStep==0) { session_unset(); session_destroy(); session_register("invest_setp"); $_SESSION["invest_setp"] = 1; include("q1.htm"); } else if ($intStep==1 && $_SESSION["invest_setp"]==1) { session_register("INVEST_ANSWER_1"); $_SESSION["INVEST_ANSWER_1"] = $_POST["q1"]; session_register("INVEST_INPUT_1"); $_SESSION["INVEST_INPUT_1"] = $_POST["q1_input"]; include("q2.htm"); } else if ($intStep==2 && $_SESSION["invest_setp"]==1) { session_register("INVEST_ANSWER_2"); $_SESSION["INVEST_ANSWER_2"] = $_POST["q2"]; session_register("INVEST_INPUT_2"); $_SESSION["INVEST_INPUT_2"] = $_POST["q2_input"]; include("q3.htm"); } else if ($intStep==3 && $_SESSION["invest_setp"]==1) { session_register("INVEST_ANSWER_3"); $_SESSION["INVEST_ANSWER_3"] = $_POST["q3"]; session_register("INVEST_INPUT_3"); $_SESSION["INVEST_INPUT_3"] = $_POST["q3_input"]; session_register("INVEST_USER"); $_SESSION["INVEST_USER"] = $_POST["u_input"]; $intUID = 0; /// 調查表格 $strSQLSelect = ""; $strSQLInput = ""; for ($intQCID = 1;$intQCID<=3;$intQCID++) { $strSESSION_QNAME = "INVEST_ANSWER_$intQCID"; $strSESSION_QINPUT = "INVEST_INPUT_$intQCID"; $intCount = count($_SESSION["$strSESSION_QNAME"]); for ($i=1;$i<=$intCount;$i++) { $intQID = $i; $intCountJ = count($_SESSION["$strSESSION_QNAME"][$i]); for ($j=0;$j<$intCountJ;$j++) { $intSID = (int)$_SESSION["$strSESSION_QNAME"][$i][$j]; $intSVALUE = 1; if ($strSQLSelect!="") $strSQLSelect.=","; $strSQLSelect .= " ($intUID, $intQCID, $intQID, $intSID, $intSVALUE) "; } $strSINPUT = addslashes($_SESSION["$strSESSION_QINPUT"][$i]); $intSID = 0; if ($strSINPUT!="" || !empty($strSINPUT)) { if ($strSQLInput!="") $strSQLInput .= ","; $strSQLInput.= " ($intUID, $intQCID, $intQID, $intSID, '$strSINPUT') "; } } } } else { session_unset(); session_destroy(); session_register("invest_setp"); $_SESSION["invest_setp"] = 1; include("q1.htm"); } ?> [/code:1:cc1332e52c] |
HonestQiao 回復于:2005-04-15 17:39:48 |
[code:1:392a0f1788]
session_register("INVEST_ANSWER_1"); $_SESSION["INVEST_ANSWER_1"] = $_POST["q1"]; [/code:1:392a0f1788] 這個表示,使用SESSION來緩存第一個問題分類的用戶提交數據。 當然你可以采取其他方法,在這里,我們演示為SESSION [code:1:392a0f1788] session_register("INVEST_INPUT_1"); $_SESSION["INVEST_INPUT_1"] = $_POST["q1_input"]; [/code:1:392a0f1788] 這個表示緩存用戶輸入 [code:1:392a0f1788] for ($intQCID = 1;$intQCID<=3;$intQCID++) [/code:1:392a0f1788] 這個表示當前問題,有三個大的分類 [code:1:392a0f1788] $strSESSION_QNAME = "INVEST_ANSWER_$intQCID"; $strSESSION_QINPUT = "INVEST_INPUT_$intQCID"; [/code:1:392a0f1788] 這個表示獲取某個大的問題的分類的SESSION保存名稱 [code:1:392a0f1788] $intCount = count($_SESSION["$strSESSION_QNAME"]); for ($i=1;$i<=$intCount;$i++) [/code:1:392a0f1788] 這個表示該分類有多少個問題,并進行循環 [code:1:392a0f1788] $intCountJ = count($_SESSION["$strSESSION_QNAME"][$i]); for ($j=0;$j<$intCountJ;$j++) [/code:1:392a0f1788] 這個表示當前問題,已經選擇的選項,并進行循環 [code:1:392a0f1788] $intSID = (int)$_SESSION["$strSESSION_QNAME"][$i][$j]; [/code:1:392a0f1788] 這個表示獲取選項值 [code:1:392a0f1788] $strSINPUT = addslashes($_SESSION["$strSESSION_QINPUT"][$i]); [/code:1:392a0f1788] 這個表示獲取該問題用戶輸入的文字 |
HonestQiao 回復于:2005-04-15 17:54:08 |
HTML之中選項命名規則:
QM[N][] Q:表示問題,常量字符 M:表示問題分類,整數 [N]:表示當前分類的第幾個問題,[整數] []:表示屬于該問題的一個選項 PHP之中如何取得選項的值呢? 在提交表單之后,如果input輸入項的名字相同,會自動形成一個數組傳遞給你的PHP程序 首先,QM確定了該問題的分類,而QM本身就成為了一個問題的結果的數組。 然后,[N],表示了是QM分類的第幾個問題,而我們恰好通過這個N,到QM數組取得對應的選項數據。 然后,[],我們沒有設定其值,但是,我們選擇了之后,他會自動生成一個選項值的數組,因而我們可以獲取這個數組的大小,得到選項的數目;如果是單選,大小為1,如果不是,根據實際的大小得知多選的個數。 然后,[],之中,我們在HTML設置了每一個選項的值分別為1,2,...... 因而,通過QM我們得知了該分類,有多少個問題 通過QM[N],我們得知了是哪一個問題,并且得知用戶選擇了幾個選項 通過遍歷QM[N],我們得知了用戶選擇了那幾個選項。 因而,我們通過一個巧妙的構造輸入選項的名稱,從而在PHP之中可以簡單有效的獲取用戶的輸入結果。 隨后的一點提示: 如果要保存到數據庫,那么你可以這么做: ID UID QCID QID SID SVALE ID: 自動增加的編號 UID:用戶的編號,你可能需要 QCID:分類編號 QID:問題編號 SID:選項編號 SVALE:選項的值或者設置為1表示選擇了這個選項 |
yb0312 回復于:2005-04-15 17:55:38 |
謝謝!正在找這類文章,不過我想問一下,滿屏幕都是session.為什么不用cookie當數組存起來呢? |
HonestQiao 回復于:2005-04-15 18:05:17 |
[quote:7a5d988bae="yb0312"]謝謝!正在找這類文章,不過我想問一下,滿屏幕都是session.為什么不用cookie當數組存起來呢?[/quote:7a5d988bae]
我說了: [quote:7a5d988bae="HonestQiao大大"] 這個表示,使用SESSION來緩存第一個問題分類的用戶提交數據。 當然你可以采取其他方法,在這里,我們演示為SESSION [/quote:7a5d988bae] |
geel 回復于:2005-04-16 02:16:49 |
這個問題3年前我用asp實現了一把 :) |
HonestQiao 回復于:2005-04-16 10:12:23 |
但是你沒有共享出來,所以大家好事需要的,雖然對于你來說是陳舊的小兒科的 |
imbiss 回復于:2005-04-16 19:55:33 |
為了填一個調查表,要在客戶和服務器之間來回那么多回合。能不能這樣。
把所有問題全部坐在一個html里面。 每一類的問題放在不同的層。 通過js來顯示或隱藏層,來適應用戶的選擇。 通過最后一個按鈕,把數據一次發送到服務器。服務器遍歷所有數據,添加到數據庫。 這樣做的優點 1.用戶覺得相應快速。因為是本地js實現,用戶不必等待 2.萬一用戶中途放棄填寫,不會在服務器上產生垃圾數據。 缺點 客戶需要打開js。 |
HonestQiao 回復于:2005-04-16 23:07:18 |
所以還是分頁面的按部就班的好。
用JS,不同的瀏覽器支持不同,不同的操作系統可能差別很大。 還有,N多都禁止了運行,例如很多瀏覽器,默認的瘟到死SP2下面的瀏覽器 |
imbiss 回復于:2005-04-16 23:31:51 |
[quote:b700dfb133="HonestQiao"]所以還是分頁面的按部就班的好。
用JS,不同的瀏覽器支持不同,不同的操作系統可能差別很大。 還有,N多都禁止了運行,例如很多瀏覽器,默認的瘟到死SP2下面的瀏覽器[/quote:b700dfb133] 那你如何處理用戶中途放棄的數據呢? 比如一共10頁,用戶填了5頁就沒耐性了,走了??墒遣糠謹祿呀浱峤坏綌祿炝?,怎么辦? 添加一個是否有效的字段? :lol: |
HonestQiao 回復于:2005-04-17 23:48:38 |
[quote:26937b7316="imbiss"]
那你如何處理用戶中途放棄的數據呢? 比如一共10頁,用戶填了5頁就沒耐性了,走了??墒遣糠謹祿呀浱峤坏綌祿炝?,怎么辦? 添加一個是否有效的字段? :lol:[/quote:26937b7316] 大哥,拜托你看貼再回帖喔。 我們是在用戶所有的調查完成了之后,才錄入數據庫的。 我不知道我們中途那一步將數據放入了數據庫呢? 還望指點。 |
imbiss 回復于:2005-04-17 23:55:44 |
就是說,在用戶沒完成最后一步之前,數據都保存在session里面了,對嗎? |
HonestQiao 回復于:2005-04-17 23:58:49 |
[quote:b312b35759="imbiss"]就是說,在用戶沒完成最后一步之前,數據都保存在session里面了,對嗎?[/quote:b312b35759]
我們只是舉例子: 可以SESSION:如果用戶中途離開了,SESSION可以自動的清除數據的 也可以COOKIE:如果用戶中途離開了,呵呵,與我們服務器無關 還可以是序列化之后,使用FORM的Hidden的Input來表示:同上 |
imbiss 回復于:2005-04-18 02:57:22 |
要是我做的話,思路如下
數據庫 表a, 問卷表 記錄所有問題,每一個問題對應一行記錄 表b,答卷表 記錄所有答卷 每個記錄對應一張答卷。 前面記錄調查者的信息,后面對應問卷表的每個問題有每個記錄。因為只是選擇題,所以不選為NULL,選中為true. 最后加一個是否有效的列。 前臺部分 調查表用js作,分層顯示。最后提一次提交數據庫,返回結果,感謝信息,game over. |
HonestQiao 回復于:2005-04-18 11:06:20 |
大哥,I服了you,大哥你怎么老跑題???
前面的帖子,你自己回復的包括其他任何我回復的,希望可以看一看哦。 這個帖子主要說的是,如何能更好的取得結果。 而你所說的,對于這個帖子的主旨來說,似乎完全跑題了。 而你所說的什問卷表么、答卷表、什么前臺部分,這些,哎,我不作評價了。 |
geel 回復于:2005-04-18 11:24:22 |
[quote:a064ca790f="HonestQiao"]但是你沒有共享出來,所以大家好事需要的,雖然對于你來說是陳舊的小兒科的[/quote:a064ca790f]
我以為很簡單,拿出來會被人笑話,就沒敢 :oops: |
HonestQiao 回復于:2005-04-18 12:09:28 |
[quote:219e6cd999="geel"]
我以為很簡單,拿出來會被人笑話,就沒敢 :oops:[/quote:219e6cd999] 哦,我很受打擊的,你這么說。 管它哪,這年頭,好酒也怕巷子深;要是大家喜歡的話,也可以成為好酒 |
imbiss 回復于:2005-04-18 15:47:26 |
:lol:
抱歉跑題了。 你的代碼大致看了一下。我 不知道你說的作的更好是指什么,或者說哪方面能做的更好? :mrgreen: |
geel 回復于:2005-04-18 16:53:02 |
[quote:a2fec3c7f5="HonestQiao"]
哦,我很受打擊的,你這么說。 管它哪,這年頭,好酒也怕巷子深;要是大家喜歡的話,也可以成為好酒[/quote:a2fec3c7f5] 我那時候的方法跟你的不一樣的,所以沒敢拿出來 那時候是遍歷Request.Form數組,根據名字來賦值的 :oops: 比如radio就取名radio_xxx,text就取名text_xxx :cry: |
HonestQiao 回復于:2005-04-18 17:53:59 |
[quote:fa5eedfff1="imbiss"]:lol:
抱歉跑題了。 你的代碼大致看了一下。我 不知道你說的作的更好是指什么,或者說哪方面能做的更好? :mrgreen:[/quote:fa5eedfff1] 我不是有說明的嗎? 大哥你強,直接就看代碼了。不過希望可以看懂。 |
geel 回復于:2005-04-18 20:29:03 |
有朋友問為什么不用cookie?答:客戶端cookie有大小限制的,所以不用cookie
而session可以自定義它的行為,所以想怎么辦就怎么辦了 |
tkmxxg 回復于:2005-04-19 10:18:15 |
如果全是多選項
可以用無限分類方法先列出來, 再如這樣: for($i=0;$i<count($p_ids);$i++){ if($p_ids[$i]) { $p_id.=$p_ids[$i].","; } } |
HonestQiao 回復于:2005-04-22 22:23:59 |
你這個也不錯的。 |
ftpw 回復于:2005-04-23 11:10:48 |
表笑,看結構斗知道我很菜的。所有要提交的內容斗放在session里面。
........ ......... if(trim($_POST['normal_habit'])=="") $error = $error."至少選擇一項愛好;<br></br>"; else{ $str_normal_habit = ""; //$_SESSION['normal_habit'] = ""; if(!empty($_POST['normal_habit']) and is_array($_POST['normal_habit'])){ if(sizeof($_POST['normal_habit'])>6) $error = $error."最多只能選擇六項愛好;<br><br>"; foreach ($_POST['normal_habit'] AS $code){ $str_normal_habit = $str_normal_habit." ".$code; }; $_SESSION['normal_habit'] = trim($str_normal_habit); } } ........... .......... <?php $normal_habit_query = $DB->query("select code , comment from n_normal_habit order by code asc"); $count = 0; $normal_habit_items = explode(" ",$_SESSION['normal_habit']); while($normal_habit=$DB->fetch_array($normal_habit_query)){ if($count==5) { echo "<br>"; $count = 0; } if($normal_habit['code']!= "13" and $normal_habit['code']!= "15" ) echo "<input type=\"checkbox\" ".(in_array($normal_habit['code'],$normal_habit_items)?" CHECKED ":" ")."name=\"normal_habit[".$normal_habit['code']."]\" value=\"".$normal_habit['code']."\">".$normal_habit['comment']."&&"; else echo "<input type=\"checkbox\" ".(in_array($normal_habit['code'],$normal_habit_items)?" CHECKED ":" ")."name=\"normal_habit[".$normal_habit['code']."]\" value=\"".$normal_habit['code']."\">".$normal_habit['comment']; $count++; } ?> ........ ....... |
HonestQiao 回復于:2005-04-23 13:36:41 |
呵呵,如果這么做確實太麻煩了,還是把頁面和程序分開的好啊 |
ftpw 回復于:2005-04-24 19:49:10 |
[quote:b1b5b75173="HonestQiao"]呵呵,如果這么做確實太麻煩了,還是把頁面和程序分開的好啊[/quote:b1b5b75173]
我也不想,但是我還不會那個叫模板的東東,聽說模板有幾種,不知道用哪種實用點? |
phphp 回復于:2005-04-26 16:15:33 |
分類還值得看看,后面的就沒必要了,
每次都給服務器.. 不如壓縮后用隱藏字段傳遞[/b] |
zywhao 回復于:2005-05-07 19:25:02 |
看起來有點暈 |
qiufeng1737 回復于:2005-05-07 22:53:50 |
此時感覺PHP中對變量的應用不太好,直接在代碼中隨便用了,看別人的代碼時感覺對不好號~ |
原文轉自:http://www.anti-gravitydesign.com