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

Posted

技术标签:

【中文标题】如何将每个选项按钮与其各自的标记相关联?【英文标题】:How to associate each option button with their own individual marks? 【发布时间】:2012-06-27 07:14:01 【问题描述】:

我在这里有一个应用程序:APPLICATION

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

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

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

问题:

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

Option_Table:

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

答案:

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

实际代码如下:

//$qandaqry query is here and executed


        $qandaqrystmt->bind_result($qandaQuestionId,$qandaQuestionNo,$qandaQuestionContent,$qandaOptionType,$qandaAnswer,$qandaAnswerMarks );

        $arrQuestionId = array();
        $arrQuestionNo = array();
        $arrQuestionContent = array();
        $arrOptionType = array();
        $arrAnswer = array();
        $arrAnswerMarks = array();

        while ($qandaqrystmt->fetch()) 
        $arrQuestionId[ $qandaQuestionId ] = $qandaQuestionId; //QuestionId
        $arrQuestionNo[ $qandaQuestionId ] = $qandaQuestionNo; //QuestionNo
        $arrQuestionContent[ $qandaQuestionId ] = $qandaQuestionContent; //QuestionContent
        $arrOptionType[ $qandaQuestionId ] = $qandaOptionType; //OptionType
        $arrAnswer[ $qandaQuestionId ] = $qandaAnswer; //Answer
        $arrAnswerMarks[ $qandaQuestionId ] = $qandaAnswerMarks; //AnswerMarks
      


    ?>
    <form action='results.php' method='post' id='exam'>

    <?php

//Retrieve options for each question

    function ExpandOptionType($option)  
        $options = explode('-', $option);
        if(count($options) > 1) 
            $start = array_shift($options);
            $end = array_shift($options);
            do 
                $options[] = $start;
            while(++$start <= $end);
         
         else
            $options = explode(' or ', $option);
         
         echo '<p>';
         foreach($options as $indivOption) 
             echo '<div class="ck-button"><label class="fixedLabelCheckbox"><input type="checkbox" name="options[]" id="option-' . $indivOption . '" value="' . $indivOption . '" /><span>' . $indivOption . '</span></label></div>';
         
          echo '</p>';


    


    foreach ($arrQuestionId as $key=>$question) 

    ?>

    <div class="queWrap">

//Each QuestionNo and QuestionContent
    <p><?php echo htmlspecialchars($arrQuestionNo[$key]) . ": " .  htmlspecialchars($arrQuestionContent[$key]); ?></p>

//Output each Individual Option
    <p><?php echo ExpandOptionType(htmlspecialchars($arrOptionType[$key])); ?></p>

//Output each QuestionId text input per question
    <p>Question Id:<input type='text' class='questionIds' name='questionids' value='<?php echo htmlspecialchars($arrQuestionId[$key]); ?>' /></p>

//Output each OptionType text input per question
    <p>Option Type: <input type='text' class='optionType' name='optiontype' value='<?php echo htmlspecialchars($arrOptionType[$key]); ?>' /></p>

//Output each AnswerMarks per answer in each question
    <p>Each Answer's Marks<input type='text' class='answermarks' name='answerMarks' value='<?php echo htmlspecialchars($arrAnswerMarks[$key]); ?>' /></p>

    </div>


    <?php

    

    ?>
    </form>

【问题讨论】:

previously asked too localized question的副本 您是想构建一个表格供某人提出问题还是供某人回答问题?如果这是针对提出问题的人,那么为什么在 DB 模式中没有问题文本和答案文本可去?如果这是为了回答问题的人,无论如何您都不应该在文本输入中显示任何这些值。 @runspired 我试图限制问题中的信息,所以我没有包括问题内容等内容。每个问题的答案文本都显示在“答案”表中,我确实有一个“学生答案”表来跟踪学生的答案。此页面是学生进行的实际评估。它们是文本输入的原因是我们可以看到这些值发生了什么,一旦工作,它们将在稍后更改为隐藏输入。 你在哪里评估答案? 在评估所有用户的回答时,应处理问题是否获得满分的概念。如果您显示一些响应处理代码,我可以尝试帮助您.. 【参考方案1】:

首先,我建议您重新考虑您的数据库架构。您拥有的表比创建问题数据库所需的要多得多,而且检索单个问题所需的所有连接等都是昂贵的操作。

假设您希望您的 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-&gt;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)&lt;input type="checkbox" name="options_72[]" id="option-D" value="D"&gt;

这是使用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;



【讨论】:

以上是关于如何将每个选项按钮与其各自的标记相关联?的主要内容,如果未能解决你的问题,请参考以下文章

将 aiohttp 请求与其响应相关联

如何将 WAVE_MAPPER 音频线与其音频设备相关联

将列表元素与其索引相关联的pythonic方法

如何将文件表与SQL Server中的现有表链接

“无法启动服务,原因可能是已被禁用或与其相关联的设备没有启动”怎么办?

如何在 ReactJS 中更改单选按钮时重置选定的下拉列表