2011-12-23 20 views
1

我有一個系統,允許用戶創建一個問題,其中每個可能的答案都有一個複選框。如果這是檢查,那麼答案是正確的。我將answer_id保存在數據庫中,並將TRUE或FALSE值保存到數據庫中是否正確。但是,我努力設置不正確的答案爲FALSE,因爲未設置的複選框似乎沒有進入POST。循環設置基於複選框的變種

$count = count($_POST['answer']); 
$answers = array(); 
for($i = 0; $i < $count; $i ++) { 
    if(isset($_POST['correct'][$i])) { 
     $correct = "true"; 
    } else { 
     $correct = "false"; 
    } 
    $answers[] = array(
     'answer' => $_POST['answer'][$i], 
     'correct' => $correct 
    ); 
} 

我做錯了什麼?

回答

0

您也可以將問題的總數也從表單傳遞到POST,然後檢查總問題和複選框的數量。

2

未經檢查的框未被瀏覽器傳輸到服務器是完全正常的。這就是爲什麼在PHP中你沒有這些值。

您需要通過爲每個複選框指定一個唯一的名稱來使其可識別。然後您可以檢查每個唯一名稱的值是否被傳輸。只有那些轉移的地方檢查。

所以你的問題是在數據庫之前,你首先需要找出哪些複選框被選中,哪些不是。

一個簡單的解決方案是數字字段,例如,給他們的姓名從​​到answer_n(其中n是最高的數字,例如5)。

如果答案的數量是動態的,可以查找可能的最大數字和/或在另一個隱藏表單字段中傳輸答案的數量。小心你消毒輸入。一個隱藏的表單字段

$name = 'answer'; 
$count = isset($_POST["$name_count"]) ? max(0, $_POST["$name_count"]) : 0; 
$answers = array(); 
for ($i = 0; $i++ < $count;) 
{ 
    $answer = isset($_POST["$name_$i"]) ? $_POST["$name_$i"] : NULL; 
    $correct = /* don't know how you do that, just do it ;) */; 
    $answers[] = compact('answer', 'correct'); 
} 

PHP實施例的

<form method="post"> 
    <input type="hidden" name="answer_count" value="3" /> 
    ... 
</form> 

HTML示例遍歷一組可能設置表單字段

希望這是有益的。

1

通過@ hakre的示例構建解決方案。 HTML代碼(每個複選框名稱包含問題指數=> 「answer0」, 「ANSWER1」,..., 「answerN」):

<form method="post"> 
    <input type="checkbox" name="answer0" value="1" /> 2+0=2? 
    <input type="checkbox" name="answer1" value="1" /> 2+1=8? 
    <input type="checkbox" name="answer2" value="1" /> 2+2=7? 
    <input type="checkbox" name="answer3" value="1" /> 2+3=5? 
    <button>submit</button> 
</form> 

PHP代碼。 $name是在問題索引之前的checbox名稱的不變部分。 $correct_answers是正確問題答案的數組(真或假)。 在循環中,我們計算正確答案($correct_answers_count)。正確的答案是當答案是true並且複選框已設置,或者當它是false並且沒有設置相應的複選框(當您不檢查checbox時,它不包括在提交給服務器的POST數組中)。

$name = 'answer'; 
$correct_answers = (true, false, false, true); 
$answers_count = sizeof($correct_answers); 
$correct_answers_count = 0; 
for ($i = 0; $i++; $i < $answers_count) 
{ 
    $correct_answers_count += (isset($_POST[$name.(string)$i]) && $correct_answers[$i]) || (!isset($_POST[$name.(string)$i]) && !$correct_answers[$i]) ? 1 : 0; 
}