для цикла установки переменной на основе флажка - PullRequest
1 голос
/ 23 декабря 2011

У меня есть система, которая позволяет пользователю создать вопрос, где у каждого возможного ответа есть флажок. Если это проверено, то этот ответ является правильным. Я сохраняю answer_id в базе данных и значение ИСТИНА или ЛОЖЬ относительно того, правильно это или нет. Однако я изо всех сил пытаюсь установить неправильные ответы на 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 ]

2 голосов
/ 23 декабря 2011

Совершенно нормально, что непроверенные ящики не передаются на сервер вашим браузером. Вот почему в 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 голос
/ 23 декабря 2011

Решение построено на примере @ hakre.HTML-код (каждое имя флажка содержит вопрос index => "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 - это постоянная часть имени чекбокса, которая предшествует индексу вопроса.$correct_answers - массив правильных ответов на вопросы (истина или ложь).В цикле мы считаем правильные ответы ($correct_answers_count).Правильный ответ - когда ответ true и флажок установлен или когда false и соответствующий флажок не установлен (если вы не проверяете чекбокс, он не включается в массив 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;
}
0 голосов
/ 23 декабря 2011

Вы также можете передать общее количество вопросов из вашей формы в POST, а затем проверить общее количество вопросов и количество установленных флажков.

...