0

出力にデータが正しく挿入されません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れるリストは です。また、上記のコードは、およびを使用して、各質問番号と合計点数を取得します。AnswersA, 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>

スクリーンショット:

ここに画像の説明を入力

4

1 に答える 1

1

問題は、合計点を取得する方法にあります。インデックスとしてアクセス$totalMarks$questionNoていますが、その質問には実際の配列インデックスを使用する必要があります。

作業コード:

<td class="totalmarkstd" rowspan="<?php echo $q_row_span?>">
    <?php echo $totalMarks[array_search($questionNo, $searchQuestionNo)]?>
</td>

更新 1:

$ques_ans[$questionNo] = array_values($q_incorrect_ans);    //store the array of incorrect ans against the ques no as key

更新 2:

array_values を使用します。

foreach($ques_ans as $questionNo => $inc_ans)
{
    $inc_ans = array_values($inc_ans);

更新された phpFiddle: http://phpfiddle.org/main/code/get-rps

于 2013-01-13T12:59:52.447 に答える