出力にデータが正しく挿入されませんTotal Marks
。質問 1 の合計点数が不足しているようです。これは、各質問の点数が次のようになっているためです。
Question 1: 3
Question 2: 5
Question 3: 2
テーブルに間違った回答が含まれているため、テーブルはhttp://phpfiddle.org/main/code/7j1-we2を見つけたこのフィドルのようになります。結果を見ると、質問1と2の両方に質問が含まれていることがわかります2 つのマークがあり、その問題 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
ただし、質問に複数の回答がある場合は、2 セットの回答が表示され、セットから 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 は複数回答であるため、配列に 2 つのデータ セットが表示されます。質問に複数の回答がある場合、正解を削除する方法は次のとおりです。
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
2 番目の正解を削除するには、次のプロセスを繰り返します。
- 可能な回答の表示
- 1 つの正解を削除します
C
- 不正解の表示
A, C, D
(不正解であることはわかっA
ていますが、一度に 1 つの正解しか削除せず、考えられるすべての解答を表示するためA
、2 番目のセットでは不正解であるが最初のセットでは正解であるかのように動作します)
更新 3:
このエラーは、 for() で $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 関数がキーを保持しているためです。
$ques_ans[$questionNo] = array_values($q_incorrect_ans); //store the array of incorrect ans
エラーなしで動作するようにコードをすばやく修正するために、ques no as key に対して、51 行目に array_values() を追加しまし
た。
しかし、私はまだ奇妙なギャップを得$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>
スクリーンショット: