2016-03-22 19 views
0

私は1つの質問に対して多くの回答を持つことができるクイズを設定中です。チェックボックスは配列を使用して格納され、ab_nameカラム(正解が格納されている)を使用しているanswers_bankテーブルに対してチェックされています。チェックボックスクイズ複数選択

私がしたいのは、チェックされている回答がanswers_bankテーブルにある場合、「正しい」とエコーされます。そうでない場合は、誤ったチェックボックスがエコーされます。

私が試したやり方はうまくいきません。各反復中に配列内の個々の答えを比較し、他の答え(それが等しくないため)を正しく返しません。この画像は、私が午前問題を説明しなければならない。ここで

enter image description here

は、私が設定しているコードの抜粋です:イメージの最初の部分に示すように

は、チェックボックスの質問を返します。

foreach ($qresults as $aresults) { 
    $selected = $aresults["ab_name"]; 
    $ab_id = $aresults["ab_id"]; 
    ?> 

    <input type="checkbox" name="checkbox[]" 
      value="<?php echo $aresults["ab_name"]; ?>"> <?php echo $aresults["ab_name"]; ?> <br> 

    <?php 
} 
?> 

の答えが正しいかどうか

かどうかを確認するために目指します私はこれを行うことができます
foreach ($results as $row) { 

$qb_id = $row['qb_id']; 
$q_answer = $_POST["q$qb_id"]; 

$sql = "SELECT * FROM answers_bank WHERE ab_qb_id = :qb_id AND ab_correct = :correct"; 
$stmt = $db->prepare($sql); 
$stmt->bindValue(':qb_id', $qb_id); 
$stmt->bindValue(':correct', "correct"); 
$stmt->execute(); 
$qresults = $stmt->fetchAll(); 
foreach ($qresults as $cresults) { 
    if (is_array($q_answer)) { 
     foreach ($q_answer as $checkbox) { 

      if ($checkbox == $cresults["ab_name"]) { 
       echo "You said : " . $checkbox . " ... which is the correct answer!</br>"; 

      } else if ($checkbox != $cresults["ab_name"]) { 
       echo "You said : " . $checkbox . " ... which is incorrect</br>"; 
      } 

     } 
    } 
} 

}

任意の他のソリューションや修正?どうもありがとう!

+0

私はいくつかのコードが不足していると感じていますが、明らかに答えを確認するコードは複数回呼び出されています。 – Epodax

+0

@Epodax db内の各回答に対してどのようにチェックするかを示すコードを追加しました – StackMeUp123

+0

あなたはあまりにも多くのループを使用しています。ループの1つを削除する必要があります。これが起こっている理由は、最初にデータベースの結果をループしており、そこにある各ループが正解であるため、POSTデータをループして「あなたが言った」ようにエコーします。 – Epodax

答えて

2

すべての正しい答えを最初に保存してください。したがって、フォームとフォームの両方の応答をループバックする必要はありません。代わりに、フォームの応答をループし、選択した値が正しい応答の配列に含まれているかどうかを確認するだけです。

foreach ($results as $row) { 

$qb_id = $row['qb_id']; 
$q_answer = $_POST["q$qb_id"]; 

$sql = "SELECT * FROM answers_bank WHERE ab_qb_id = :qb_id AND ab_correct = :correct"; 
$stmt = $db->prepare($sql); 
$stmt->bindValue(':qb_id', $qb_id); 
$stmt->bindValue(':correct', "correct"); 
$stmt->execute(); 
$qresults = $stmt->fetchAll(); 

$correct_answers = array(); 
foreach ($qresults as $cresults) { 
    array_push($correct_answers, $cresults["ab_name"]); 
} 

if (is_array($q_answer)) { 
    foreach ($q_answer as $checkbox) { 
     if (in_array($checkbox, $correct_answers)) { 
      echo "You said : " . $checkbox . " ... which is the correct answer!</br>"; 
     } else { 
      echo "You said : " . $checkbox . " ... which is incorrect</br>"; 
     } 

    } 
} 
+0

これまでのアプローチとほぼ同じアプローチを試みました。私はforeachループを間違って使っていました。これは夢のように今、あなたに感謝します! – StackMeUp123