如何将每个选项按钮与各自的标记相关联?

时间:2012-06-26 00:43:30

标签: php javascript jquery mysqli

我在这里有一个申请:APPLICATION

我所拥有的是一些问题,并且在复选框按钮的可能答案中与每个问题相关联,并且三个文本输入显示了每个答案的questionId,选项类型和标记数。

实际上,如果我遇到问题,每个人的分数都会回答。我想要尝试的是,对于每个问题的每个正确答案,它们与他们自己的文本输入相关联,显示它们的价值数量(在下面的Individual_Answer表中找到),否则对于所有不正确的答案,它们都值得{{ 1}}在他们的文本输入/

现在,这是此示例应用程序的数据库表:

问题:

0

Option_Table:

QuestionId (PK auto)  QuestionNo  SessionId (FK Session) OptionId (FK Option)    
72                    1           26                     3
73                    2           26                     4

答案:

OptionId (PK Auto)  OptionType
1                   A-C
2                   A-D
3                   A-E
4                   A-F

Individual_Answer:

AnswerId (PK auto)    QuestionId (FK Question)      Answer  
1                          72                         C             
2                          73                         A             
3                          73                         C             
4                          73                         D    

实际代码如下:

AnswerId (PK auto)  AnswerMarks
1                   2
2                   2
3                   1
4                   2

1 个答案:

答案 0 :(得分:0)

首先,我建议您重新考虑数据库架构。你有更多的表来创建一个问题数据库,你需要检索一个问题的所有连接等都是昂贵的操作。

假设您希望HTML看起来如下所示:

<div class="queWrap" id="question-72">
    <h2 class="question-text">What is 4+4?</h2>
    <h3>Answers: <span class="questionMarks">(this question is worth 2 points)</span></h3>

    <div class="ck-button">
        <label class="fixedLabelCheckbox">
            <input type="checkbox" name="options_72[]" id="option-A" value="A">
            <span>0</span>
        </label>
    </div>

    <div class="ck-button">
        <label class="fixedLabelCheckbox">
            <input type="checkbox" name="options_72[]" id="option-B" value="B">
            <span>4</span>
        </label>
    </div>

    <div class="ck-button">
        <label class="fixedLabelCheckbox">
            <input type="checkbox" name="options_72[]" id="option-C" value="C">
            <span>8</span>
        </label>
    </div>

    <div class="ck-button">
        <label class="fixedLabelCheckbox">
            <input type="checkbox" name="options_72[]" id="option-D" value="D">
            <span>16</span>
        </label>
    </div>
</div>

现在让我们说上面的查询result->fetch()更加巧妙地重写:

$_Questions = array();
while( $qandaqrystmt->fetch() ) {
   $_Questions[] = array('id'=>$qandaQuestionId,'num'=>$qandaQuestionNo,'content'=>$qandaQuestionContent,'type'=>$qandaOptionType,'answer'=>$qandaAnswer,'marks'=>$qandaAnswerMarks);
}

然后输出我们想要循环的问题并生成适当的HTML。我想指出,将正确的答案和问题一起发送给考生,即使它隐藏在html中也是非常愚蠢的。你会注意到这个HTML与你自己的HTML类似,但是有一个重要的改变:因为你只有一个表单元素围绕你的所有问题,每个问题的复选框数组需要一个唯一的名称。我选择将_(questionID)附加到每个数组,如此

(例如问题72)<input type="checkbox" name="options_72[]" id="option-D" value="D">

以下是使用heredoc

循环的方法
foreach( $_Questions AS $question ) {
  echo <<<EOT
    <div class="queWrap" id="question-{$question['id']}">
        <h2 class="question-text">{$question['content']}</h2>
        <h3>Answers: <span class="questionMarks">(this question is worth {$question['marks']} points)</span></h3>
    EOT;

$options = ['A','B','C','D','E','F'];
$lastOption = substr($question['type'], -1, 1);
foreach( $options as $opt ) {
  echo <<<EOT
    <div class="ck-button">
        <label class="fixedLabelCheckbox">
            <input type="checkbox" name="options_{$questions['id']}[]" value="$opt">
            <span>$opt</span>
        </label>
    </div>
    EOT;
  if( $opt == $lastOption )
    break;
}

}