我的輸出不會插入用於Total Marks
正確的數據,現在看來似乎缺少佔總分的問題1,這是因爲對於每一個問題的標誌是這樣的:不正確的數據
Question 1: 3
Question 2: 5
Question 3: 2
現在表中包含不正確的答案使表看起來像這樣的小提琴,我發現http://phpfiddle.org/main/code/7j1-we2,如果你看一下結果,你就會意識到,這兩個問題1和2包含問題2標記和queston 3包含了痕跡。但是我怎樣才能得到正確的標記來顯示,爲什麼它缺少第一個問號?
更新1:
$query = "SELECT q.QuestionNo, an.Answer, q.TotalMarks, o.OptionType
FROM
Question q INNER JOIN Answer an ON q.QuestionID = an.QuestionID
INNER JOIN Option_Table o ON o.OptionID = q.OptionID
ORDER BY q.QuestionId, an.Answer
";
// prepare query
$stmt=$mysqli->prepare($query);
// execute query
$stmt->execute();
// This will hold the search results
$searchQuestionNo = array();
$totalMarks = array();
$incorrect_ans = array();
// Fetch the results into an array
// get result and assign variables (prefix with db)
$stmt->bind_result($dbQuestionNo, $dbAnswer, $dbTotalMarks $dbOptionType);
$specialOptionTypes = array('Yes or No' => array('Yes', 'No'),'True or False' => array('True', 'False'));
while ($stmt->fetch()) {
// Do this for each row:
if (array_key_exists($dbOptionType, $specialOptionTypes)) {
$options = $specialOptionTypes[$dbOptionType];
} else if (preg_match('/^([A-Z])-([A-Z])$/', $dbOptionType, $match)) {
$options = range($match[1], $match[2]);
} else {
// issue warning about unrecognized option type
$options = array();
}
$right = str_split($dbAnswer);
$wrong = array_diff($options, $right);
$searchQuestionNo[] = $dbQuestionNo;
$totalMarks[] = $dbQuestionMarks;
}
以上是檢索錯誤的答案代碼。每個問題會發生什麼,它會退回每個問題$dbOptionType
並顯示可能的答案列表。因此,舉例來說,如果問題1的$dbOptionType
是A - D
,那麼Answers
它顯示的列表是A, B, C, D
。此外,上面的代碼使用$dbQuestionNo
和$TotalMarks
檢索每個問題編號和總標記。
如果一個問題有多個答案,雖然,它顯示兩組答案,並從一組1分的答案。這是因爲在數據庫中,以收到正確的答案對於具有多個答案,單個答案是這樣的一個問題:
QuestionNo Answer TotalMarks OptionType
1 B 3 A-D
2 A 5 A-D
2 C 5 A-D
3 D 2 A-D
更新2:
對於問題2,因爲它是多個答案這就是爲什麼它在數組中顯示兩組數據。 Beause事情是這樣的去除是否有一個問題多個答案正確答案是這樣:
Question 2: Answers: A, B, C, D Remove Correct Answer: A Incorrect Answers: B, C, D
Question 2: Answers: A, B, C, D Remove Correct Answer: C Incorrect Answers: A, B, D
它去除正確答案,如果一個問題有多個正確答案的方式是以上。它是:
- 顯示可能的解答
- 刪除1個正確答案
A
- 顯示不正確的答案
B, C, D
要刪除第二個正確的答案是重複的過程:
- 顯示可能的答案
- 刪除1個正確答案
C
- 顯示不正確的答案
A, C, D
(我們知道A
是不正確的,但因爲只是在時間和顯示所有可能的答案刪除一個正確的答案,它充當如果A
是在第二盤,但正確不正確在第一組)
UPDATE 3:
該錯誤是由以下事實陣列你迭代$ ques_ans與()具有鍵的間隙引起的。
var_dump($ques_ans) gives us:
array(3) {
... skipped for brevity
[2]=>
array(2) {
[0]=>
string(1) "B"
[2]=>
string(1) "D"
}
... skipped for brevity
}
沒有與關鍵1沒有元素。這是因爲我在第49行使用的array_intersect函數保留了鍵。
要快速修復代碼只是爲了使其工作沒有錯誤,我在第51行添加了array_values(): $ques_ans[$questionNo] = array_values($q_incorrect_ans); //store the array of incorrect ans
針對ques沒有作爲關鍵。
但我仍然在$keys
奇怪的差距。
這裏是代碼:
下面是代碼:
$query = "SELECT q.SessionId, s.SessionName, q.QuestionId, q.QuestionNo, q.QuestionContent, an.Answer, an.AnswerId, q.QuestionMarks, q.OptionId, o.OptionType
FROM
Question q INNER JOIN Answer an ON q.QuestionID = an.QuestionID
INNER JOIN Option_Table o ON o.OptionID = q.OptionID
INNER JOIN Session s ON s.Sessionid = q.Sessionid
WHERE s.SessionName = ?
ORDER BY q.QuestionId, an.Answer
";
// prepare query
$stmt=$mysqli->prepare($query);
// You only need to call bind_param once
$stmt->bind_param("s", $assessment);
// execute query
$stmt->execute();
// This will hold the search results
$searchQuestionNo = array();
$searchQuestionContent = array();
$totalMarks = array();
$searchAnswerId = array();
$incorrect_ans = array();
$searchMarks = array();
// Fetch the results into an array
// get result and assign variables (prefix with db)
$stmt->bind_result($dbSessionId, $dbSessionName, $dbQuestionId, $dbQuestionNo, $dbQuestionContent, $dbAnswer, $dbAnswerId, $dbQuestionMarks, $dbOptionId, $dbOptionType);
$specialOptionTypes = array('Yes or No' => array('Yes', 'No'),'True or False' => array('True', 'False'));
while ($stmt->fetch()) {
// Do this for each row:
if (array_key_exists($dbOptionType, $specialOptionTypes)) {
$options = $specialOptionTypes[$dbOptionType];
} else if (preg_match('/^([A-Z])-([A-Z])$/', $dbOptionType, $match)) {
$options = range($match[1], $match[2]);
} else {
// issue warning about unrecognized option type
$options = array();
}
$right = str_split($dbAnswer);
$wrong = array_diff($options, $right);
$searchQuestionNo[] = $dbQuestionNo;
$searchQuestionContent[] = $dbQuestionContent;
$incorrect_ans[] = $wrong;
$searchAnswerId[] = $dbAnswerId;
$totalMarks[] = $dbQuestionMarks;
$searchMarks[] = $dbQuestionMarks;
}
?>
</head>
<body>
<?php
$ques_ans = array(); //to store incorrect answers against ques no.
$q_occ_count = array_count_values($searchQuestionNo);
foreach ($searchQuestionNo as $key => $questionNo) {
if (!array_key_exists($questionNo, $ques_ans)) {
if ($q_occ_count[$questionNo] === 1) //if a ques has only one correct ans
{
$ques_ans[$questionNo] = $incorrect_ans[$key]; //store the array of incorrect ans against the ques no as key
} else //if a ques has more than 1 correct ans
{
//find the intersection of incorrect_ans arrays for this ques
$q_keys = array_keys($searchQuestionNo, $questionNo);
$q_incorrect_ans = $incorrect_ans[$q_keys[0]];
foreach ($q_keys as $q_key) {
$q_incorrect_ans = array_intersect($q_incorrect_ans, $incorrect_ans[$q_key]);
}
$ques_ans[$questionNo] = array_values($q_incorrect_ans); //store the array of incorrect ans against the ques no as key
}
}
}
var_dump($ques_ans);
?>
<table id='penaltytbl'>
<thead>
<tr>
<th class='questionth'>Question No.</th>
<th class='questionth'>Question</th>
<th class='incorrectanswerth'>Incorrect Answer</th>
<th class='answermarksth'>Marks per Answer</th>
<th class='totalmarksth'>Total Marks</th>
<th class='noofmarksth'>Marks Remaining</th>
</tr>
</thead>
<tbody>
<?php
foreach ($ques_ans as $questionNo => $inc_ans) {
$q_row_span = count($inc_ans);
$row_count = 0;
?>
<tr class="questiontd">
<td class="questionnumtd q<?php
echo $questionNo;
?>_qnum" rowspan="<?php
echo $q_row_span;
?>"><?php
echo $questionNo;
?>
<input type="hidden" name="numQuestion" value="<?php
echo $questionNo;
?>" />
<input type="hidden" name="q<?php
echo $questionNo;
?>_ans_org" class="q<?php
echo $questionNo;
?>_ans_org" value="<?php
echo $searchMarks[array_search($questionNo, $searchQuestionNo)];
?>">
<input type="hidden" name="q<?php
echo $questionNo;
?>_ans" class="q<?php
echo $questionNo;
?>_ans" value="<?php
echo $searchMarks[array_search($questionNo, $searchQuestionNo)];
?>">
</td>
<td class="questioncontenttd" rowspan="<?php
echo $q_row_span;
?>"><?php
echo $searchQuestionContent[array_search($questionNo, $searchQuestionNo)];
?> </td>
<td class="answertd"><?php
echo $inc_ans[$row_count];
?>
<input type="hidden" id="hiddenincorrect" name="incorrect[]" value="<?php
echo $inc_ans[$row_count];
?>">
</td>
<td class="answermarkstd">
<input class="individualMarks q<?php
echo $questionNo;
?>_mark" q_group="1" name="answerMarks[]" type="text" data-type="qmark" data-qnum="<?php
echo $questionNo;
?>" onkeypress="return isNumberKey(event)" maxlength="3" />
</td>
<td class="totalmarkstd" rowspan="<?php
echo $q_row_span;
?>"><?php
echo $totalMarks[array_search($questionNo, $searchQuestionNo)];
?></td>
<td class="noofmarkstd q<?php
echo $questionNo;
?>_ans_text" q_group="1" rowspan="<?php
$q_row_span;
?>"><?php
echo "<strong>" . $searchMarks[array_search($questionNo, $searchQuestionNo)] . "</strong>";
?></td>
</tr>
<?php
//remaining incorrect answers in separate row (if any) follows here
if ($row_count < $q_row_span - 1) {
for ($i = ($row_count + 1); $i < $q_row_span; $i++) {
?>
<tr>
<td class="answertd"><?php
echo $inc_ans[$i];
?>
<input type="hidden" id="hiddenincorrect" name="incorrect[]" value="<?php
echo $inc_ans[$i];
?>">
</td>
<td class="answermarkstd">
<input class="individualMarks q<?php
echo $questionNo;
?>_mark" q_group="1" name="answerMarks[]" type="text" data-type="qmark" data-qnum="<?php
echo $questionNo;
?>" onkeypress="return isNumberKey(event)" maxlength="3" />
</td>
</tr>
<?php
}
}
}
?>
</tbody>
</table>
<p>
<input type='hidden' id='num_groups' name='num_groups' value='<?php
echo $questionNo;
?>'>
<input id="submitBtn" name="submitPenalty" type="submit" value="Submit Marks" />
</p>
</form>
截圖:
你是如何找到錯誤的答案? – ATOzTOA