0

我在这里说实话 - 我很确定我不是从最好的方法来解决这个问题 我有一个我正在开发的调查软件,它允许所有者构建不同输入类型的问题(文本、复选框、无线电......)文本非常容易,它搜索了问题表并找到了包含文本、复选框、单选...和输出的字段 ans_type

                switch ($rowq['ans_type']) {
            case "text":
                echo '<tr bgcolor="#DDDDDD"  align="left" valign="middle"><td width="30"> </td> <td width="350">'.$rowq['question'].'</td><td width="350"><input class="tb8" type="text" name="quest[]" value="'.$rowa['answer'].'" size="40"></td></tr>';
            break;

如您所见 - rowq 包含我的问题信息,而 rowa 包含答案信息。

我的问题出现在复选框和收音机上,我们可能有多个选项,目前我的表格是这样设置的,最多允许 15 个复选框和收音机选项

CREATE TABLE `question` (
 `sid` int(10) NOT NULL,
 `qid` double(10,1) NOT NULL,
 `question` varchar(500) NOT NULL,
 `ans_type` varchar(100) NOT NULL,
 `opt_one` varchar(200) DEFAULT NULL,
 `opt_two` varchar(200) DEFAULT NULL,
 `opt_three` varchar(200) DEFAULT NULL,
 `opt_four` varchar(200) DEFAULT NULL,
 `opt_five` varchar(200) DEFAULT NULL,
 `opt_six` varchar(200) DEFAULT NULL,
 `opt_seven` varchar(200) DEFAULT NULL,
 `opt_eight` varchar(200) DEFAULT NULL,
 `opt_nine` varchar(200) DEFAULT NULL,
 `opt_ten` varchar(200) DEFAULT NULL,
 `opt_eleven` varchar(200) DEFAULT NULL,
 `opt_twelve` varchar(200) DEFAULT NULL,
 `opt_thirteen` varchar(200) DEFAULT NULL,
 `opt_fourteen` varchar(200) DEFAULT NULL,
 `opt_fifteen` varchar(200) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1

CREATE TABLE `answers` (
 `surveyid` int(10) NOT NULL,
 `question` double(10,1) NOT NULL,
 `answer` varchar(50000) DEFAULT NULL
) ENGINE=MyISAM DEFAULT CHARSET=latin1

所以我需要首先确定这些类型的任何给定问题有多少可用选项 - 我想我可以让它只添加复选框如果 rowq['...'] != NULL 在每个 opt_numbers 这不能解决我的问题第二个问题 - 如果该调查已经填写并且该人正在编辑它,我需要检查他们已经选择的框(对于复选框,这可能是全部 15 它可能是 1 对于收音机自然它只会是一个)rowa ['answer'] 包含我的答案,这些答案将用“,”分隔

老实说,我不知道从哪里可以得到任何帮助 - 如果有更好的方法,包括更改我的数据库。

case "radio":

break;
4

1 回答 1

0

我有一个看起来有点像你的系统。我的做法是让每个问题行都有一个 fieldanswerTypes和一个 field answersanswerTypes是一个数组,它告诉可以对问题给出哪些答案。

系统循环遍历answerTypes数组并获取可以从 给出的适当答案answers,例如如果answerTypes是数组(1,3),则 answerTypes 是radiobuttontext input

answers然后具有不同的所有“特定”设置answerTypes,例如文本输入的最大长度、复选框的不同名称和单选按钮的不同值。

我如何做的一个小代码片段:

  foreach($q->answerTypes AS $type) { 
          if($type == 1) { //radio buttons
            $ans = $q->answers['radioButton'];
            $return .= "<div class=\"radioButtonContainer\">";
            $return .= "<table><tbody>";
            foreach($ans AS $value=>$label) { 
              $return .= "<tr><td><label for=\"radiobutton_{$value}\">{$label}</label> </td><td><input id=\"radiobutton_{$value}\" type=\"radio\" name=\"radioButton\" value=\"{$value}\"".(($_POST['radioButton'] == $value) ? ' checked' : '')."></td></tr>";
            }
            $return .= "</tbody></table>";
            if(!empty($errl['radioButton'])) { 
              $return .= error($errl['radioButton'], 0, false);
            }
            $return .= "</div>";
          } elseif($type == 2) { //checkboxes
            $ans = $q->answers['checkbox'];
            $return .= "<div class=\"checkboxContainer\"><table><tbody>";
            foreach($ans['boxes'] AS $name=>$label) { 
              $return .= "<tr><td><label for=\"checkbox_{$name}\">{$label}</label> </td><td><input id=\"checkbox_{$name}\" type=\"checkbox\" name=\"checkbox_{$name}\" value=\"1\"".(($_POST['checkbox_'.$name] == "1") ? ' checked' : '')."></td></tr>";
            }
            $return .= "</tbody></table>";
            if(!empty($errl['checkbox'])) { 
              $return .= error($errl['checkbox'], 0, false);
            }
            $return .= "</div>";
          } elseif($type == 3) { //text input
            $ans = $q->answers['textInput'];
            $return .= "<div class=\"textInputContainer\">";
            if(!empty($ans['label'])) { 
              $return .= "<div class=\"textInputLabel\"><label for=\"textInput\">{$ans['label']}</label></div>";
            }
            if(isset($errl['textarea'])) { 
              $return .= error($errl['textarea'], 0, false);
            }
            $return .= "<input type=\"text\" onkeyup=\"countText($(this), $('#textInputChars'));\" id=\"textInput\" class=\"textInput\" name=\"textInput\" value=\"".htmlspecialchars($_POST['textInput'])."\"><br>
            <span class=\"smallText\"><span id=\"textInputChars\">".number_format(strlen($_POST['textInput']))."</span>/".number_format($ans['maxChars'])."</span></div>";
          } elseif($type == 4) { //textarea
            $ans = $q->answers['textarea'];
            $return .= "<div class=\"textareaContainer\">";
            if(!empty($ans['label'])) { 
              $return .= "<div class=\"textareaLabel\"><label for=\"textarea\">{$ans['label']}</label></div>";
            }
            if(isset($errl['textarea'])) { 
              $return .= error($errl['textarea'], 0, false);
            }
            $return .= "<textarea onkeyup=\"countText($(this), $('#textareaChars'));\" id=\"textarea\" class=\"textarea\" name=\"textarea\">".htmlspecialchars($_POST['textarea'])."</textarea><br>
            <span class=\"smallText\"><span id=\"textareaChars\">".number_format(strlen($_POST['textInput']))."</span>/".number_format($ans['maxChars'])."</span></div>";
          }
    }

数据格式为:

   [answerTypes] => Array
    (
        [0] => 1
        [1] => 2
        [2] => 3
    )

[answers] => Array
    (
        [radioButton] => Array
            (
                [a] => Radio button 1 //radio button name => radio button label
                [b] => Radio button 2
                [c] => Radio button 3
            )

       [checkbox] => Array
           (
               [atLeast] => 0 //the minimum number of checkboxes that have to be checked
               [boxes] => Array
                   (
                       [a] => Checkbox 1 //checkbox name => checkbox label
                       [b] => Checkbox 2
                   )

           )

       [textInput] => Array
           (
               [label] => Please fill in:
               [maxChars] => 255
               [required] => 1
           )

   )
于 2012-08-17T14:37:39.770 回答