我有一个系统允许用户创建一个问题,其中每个可能的答案都有一个复选框。如果选中,那么答案是正确的。我将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 :(得分: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,然后检查总问题和设置的复选框数。