2013-01-13 76 views
0

我的輸出不會插入用於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的$dbOptionTypeA - 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> 

截圖:

enter image description here

+0

你是如何找到錯誤的答案? – ATOzTOA

回答

1

的問題是與您檢索的總的方法分數。您正在以$questionNo作爲索引訪問$totalMarks,但應該使用該問題的實際數組索引。

工作代碼:

<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

+0

該數組只是關於如何檢索結果的一個設置。我將向您展示顯示陣列如何形成的代碼,給我5分鐘 – user1964964

+0

更新的答案,應該工作。 – ATOzTOA

+0

已更新的問題顯示如何檢索數據 – user1964964