for循环基于复选框设置var

时间:2011-12-23 11:02:54

标签: php variables post loops

我有一个系统允许用户创建一个问题,其中每个可能的答案都有一个复选框。如果选中,那么答案是正确的。我将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
    );
}

我做错了吗?

3 个答案:

答案 0 :(得分:2)

浏览器未将未经检查的框传输到服务器是完全正常的。这就是为什么在PHP中你没有这些值。

您需要通过为每个复选框指定唯一名称来使其可识别。然后,您可以检查是否已传输每个唯一名称的值。只有那些转移到检查过的地方。

所以你的问题出现在数据库之前,首先需要找出哪些复选框被选中,哪些复选框没有。

一个简单的解决方案是编号字段,例如将他们的姓名从answer_1提升到answer_n(其中n是最高的数字,例如5)。

如果答案的计数是动态的,请查找可能的最高数字和/或在另一个隐藏表格字段中传输答案数量。小心你清理输入。

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

隐藏表单字段的HTML示例

$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迭代一组可能设置的表单字段的示例

希望这有用。

答案 1 :(得分:1)

解决方案构建了@hakre的例子。 HTML代码(每个复选框名称包含问题索引=&gt;“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;
}

答案 2 :(得分:0)

您也可以将表单中的问题总数传递给POST,然后检查总问题和设置的复选框数。