[我的原創文章] 多頁多項可單選可復選調查的實現

發表于:2007-05-25來源:作者:點擊數: 標簽:原創文章多頁多項單選我的
現在有一個小的項目(已經實現),做一個產品調查,限于某些原因,以下所給出的內容會有所刪節。 基本要求: 1、問題分為幾個大類 2、每個大類之中包含若干個問題 3、每個問題可能是多選,也可能是單選 4、有的問題,可以輸入文字 [size=20:9b79c6637a][co

現在有一個小的項目(已經實現),做一個產品調查,限于某些原因,以下所給出的內容會有所刪節。

基本要求:
1、問題分為幾個大類
2、每個大類之中包含若干個問題
3、每個問題可能是多選,也可能是單選
4、有的問題,可以輸入文字

[size=20:9b79c6637a][color=red:9b79c6637a]本文所揭示的:
如何取得某個被調查者的每個問題的結果。[/color:9b79c6637a]
[/size:9b79c6637a]

當然:要是按照普通的方法,也可以發揚愚公移山的精神為每一個問題設置一個選項的名字,然后再PHP之中依次取得其值。

但是:我們要使用更好的方法來取得其值?。?!

 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

国产97人人超碰caoprom_尤物国产在线一区手机播放_精品国产一区二区三_色天使久久综合给合久久97