我这里有一个应用程序:应用程序
我有一些问题,并在复选框按钮中与每个问题的可能答案相关联,以及三个文本输入,显示问题ID,选项类型和每个单独答案的标记数。
实际上,如果我遇到问题,则每个单独答案的分数。我想尝试的是,对于每个问题的每个正确答案,它们都与自己的文本输入相关联,显示它们的价值(在下表中找到Individual_Answer),否则对于所有不正确的答案,它们都值得0
在他们的文本输入中/
下面是此示例应用程序的数据库表:
问题:
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
Individual_Answer:
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>
首先,我建议您重新考虑数据库架构。 您的表远远多于创建问题数据库所需的表,并且检索单个问题所需的所有联接等都是昂贵的操作。
假设您希望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;
}
}