Версия для печати темы
Нажмите сюда для просмотра этой темы в оригинальном формате
Форум программистов > PHP: Общие вопросы > защита от множественного выбора


Автор: godvinn 30.10.2008, 18:15
Здравствуйте. Помогите с следующей задачей:

есть следующая форма 
Код

         <form action="....."  method="post">>

     // здесь идет цикл  для вывода с БД вопроса и ответов к ниму 
    
        <input type="hidden" name="questionID" value="<?php echo $row['questionID'];?>" />
        <?php  echo $row['question'];?> // вопрос
         //ответы
        <input type="checkbox" name="test[]" value="<?php echo $row['id']; "."?>.1" />
        <input type="checkbox" name="test[]" value="<?php echo $row['id']; "."?>.2" />
        <input type="checkbox" name="test[]" value="<?php echo $row['id']; "."?>.3" />
        <input type="checkbox" name="test[]" value="<?php echo $row['id']; "."?>.4" />
        <input type='submit' value='Ответить' />
            
         </form>


правильные ответы хранятся в БД, все вопросы выводятся на одной странице не по одному.

*допустим к вопросу правильные ответы 2,3 , а пользователь выставил все 4 галочки  ,
как этот вопрос не воспринимать как правильный а воспринимать только на правильные ответы. 

то есть суть задачи в том: как избежать "наклацывания" *?





Автор: bars80080 30.10.2008, 18:23
как? обработку соответствующую задать. если есть ещё кроме правильных - писать неправильно

Автор: godvinn 30.10.2008, 18:29
ну я делаю следующим образом:

у меня есть 

Код

    function resultTotalCount($test)
    {        
        (int)$totalTRUE = 0;
        (int)$totalFalse = 0;
        (int)$total = 0;
        for($i = 0; isset($test[$i]); $i++)
        {
            $array = explode('.', $test[$i]);
            $id_question = $array[0];
            $id_answer = $array[1];
            $arrayDB = $this->resultTrueDB($id_question); //правильные ответы с бд
            $stringSearh = strpbrk($arrayDB, $id_answer);
            if ($stringSearh == true)
                {
                 $totalTRUE = $totalTRUE + 1; // если ответ совпадает добавляю +1 к счетчику
                }
            else
                {
                    $totalFalse = $totalFalse + 1; // если ответ не совпадает добавляю +1 к счетчику неправильных ответов
                }
         }
                
    }


сделал два счётчика на правильные ответы и неправильные ответы. 
а вот как дальше не знаю?

Автор: baldina 30.10.2008, 18:30
каждому ответу присваивается значение - степень двойки. значения чекбоксов, отмеченных пользователем складываются.
в базе хранятся суммы. полученное значение сравнивается с хранимым в базе.
пример:

ответ 1 - значение 1
ответ 2 - значение 2
ответ 3 - значение 4
ответ 4 - значение 8

из них правильные, например, 2 и 3. сумма - 6
способ позволяет не только быстро проверить правильность ответа, но и проанализировать, что именно правильно/неправильно

Добавлено @ 18:38
что-то типа 

Код

$sum = 0;
for($i = 0; $i<$n; ++$i)
 $sum += $test[$i];

if ($sum != $correct_result_from_base) 
  echo 'Answer is not correct';

$count = 0;
for (for($i = 0; $i<$n; ++$i)
  if (($sum & 1 << $i) & $correct_result_from_base)
    ++$count;

echo "Number of correct answers is $count";



Автор: godvinn 30.10.2008, 18:41
baldina - да способ действительно хорош но.... если пользователь выбирает с 2 правильных ответов 1 - вопрос считается неправильным? или ты имеешь ввиду только половину брать от суммы? и если пользователь выберет все 4 варианта то сумма прийдет с формы в полном обьеме*? 

Автор: baldina 30.10.2008, 18:47
что в этом случае - знаешь ты, а не я smile smile
это же зависит от конкретных вопросов и ответов.
есть вопросы, где перечислены разные способы одного и того же, для таких частичный ответ - правильный, но в зависимости от близости к идеальному сумма может меняться.
а есть вопросы, где надо однозначно знать перечень, тут либо точно, либо никак.

Автор: godvinn 30.10.2008, 19:06
Цитата(godvinn @  30.10.2008,  18:41 Найти цитируемый пост)
и если пользователь выберет все 4 варианта то сумма прийдет с формы в полном обьеме*? 

???  объясни по подробней на этот вопрос ..***

Автор: bars80080 30.10.2008, 19:10
godvinn, ну ведь это самое оптимальное решение. в БД можно даже сразу хранить контрольную сумму. для 2 и 3 правильных ответов - она 6, нужно просто высчитать сумму принятых чекбоксов и сравнить с контрольной

Автор: godvinn 30.10.2008, 19:14
bars80080  не ну а если выбирается все 4 галочки в чекбоксах то сума прийдет 6? и естественно она будет совпадать с сумой с БД. правильно же ?* 

Автор: baldina 30.10.2008, 19:18
1+2+4+8=15 имхо ;)

Powered by Invision Power Board (http://www.invisionboard.com)
© Invision Power Services (http://www.invisionpower.com)