Рандомизация - и запоминание этой случайности - вопросы с множественным выбором в php - PullRequest
2 голосов
/ 22 июня 2009

Проблема:

Я пытаюсь закодировать тест с несколькими вариантами ответов для моих сокурсников - и в первую очередь, чтобы помочь моему собственному обучению - и поэтому я создаю тест с несколькими вариантами ответов на основе веб-интерфейса с использованием PHP (5.2.08) и MySQL (5.0) 0,32)

Таблица вопросов:

+----------+--------------+------+-----+---------+----------------+
| Field    | Type         | Null | Key | Default | Extra          |
+----------+--------------+------+-----+---------+----------------+
| id       | int(6)       | NO   | PRI | NULL    | auto_increment | 
| question | varchar(200) | NO   |     | NULL    |                | 
| correct  | varchar(80)  | NO   |     | NULL    |                | 
| wrong1   | varchar(80)  | NO   |     | NULL    |                | 
| wrong2   | varchar(80)  | NO   |     | NULL    |                | 
| wrong3   | varchar(80)  | NO   |     | NULL    |                | 
+----------+--------------+------+-----+---------+----------------+

Пример вывода print_r ($ questions) для одного вопроса:

Array
(
    [0] => Array
        (
            [id] => 1
            [question] => What is the correct pipeline pressure for Nitrous Oxide (<abbr title="Nitrous Oxide.">N<span class="chem-notation">2</span>O</abbr>)?
            [answers] => Array
                (
                    [0] => Array
                        (
                            [correct] => 1
                            [answer] => 60<abbr title="Pounds per square inch">PSI</abbr>.
                        )
                    [1] => Array
                        (
                            [correct] => 0
                            [answer] => 45<abbr title="Pounds per square inch">PSI</abbr>.
                        )
                    [2] => Array
                        (
                            [correct] => 0
                            [answer] => 30<abbr title="Pounds per square inch">PSI</abbr>.
                        )
                    [3] => Array
                        (
                            [correct] => 0
                            [answer] => 15<abbr title="Pounds per square inch">PSI</abbr>.
                        )
                )
        )

PHP для получения вопросов / ответов и назначения переменных:

  $results = $results2 = mysql_query("
    SELECT questions.id AS id,
     questions.question AS q,
     questions.correct AS c,
     questions.wrong1 AS w1,
     questions.wrong2 AS w2,
     questions.wrong3 AS w3
    FROM questions
    ORDER BY questions.id
    LIMIT 40")
    or die("Oops, unable to access database at this time." . mysql_error());

 while ($row = mysql_fetch_array($results)) {
  if (!isset($i)) {
   $i = 0;
  }
  else {
   $i = $i;
  } 

  $answers[$i]  = array(
                  0=>array (correct => 1, answer => $row['c']),
                  1=>array (correct => 0, answer => $row['w1']),
                  2=>array (correct => 0, answer => $row['w2']),
                  3=>array (correct => 0, answer => $row['w3'])
                  );

  $questions[$i] = array(id=>$row['id'],
                   question=>$row['q'],
                   answers=>$answers[$i]);

  $correctAnswer[$i]    = array($row['c']);
            $i++;
 }

Для отображения вопросов / ответов:

<?php

require_once 'incs/dbcnx.php';
require_once 'incs/questions.php';

echo "<?xml version=\"1.0\" encoding=\"utf-8\"?>"?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Strict//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-strict.dtd">

<html xmlns="http://www.w3.org/1999/xhtml" xml:lang="en" lang="en">

<head>
    <title>Multiple choice questions for ODP students.</title>
    <link rel="stylesheet" type="text/css" href="css/stylesheet.css" />

</head>

<body>

<?php

$submitted  = $_POST['submit'];
$quesions   = $_SESSION['questions'];
$correctAnswers = $_SESSION['correctAnswer'];

if (isset($submitted) && $submitted == "1") {

    // display the results.

echo "<form>";
    for ($i=0;$i<sizeof($questions);$i++) {

        echo "\t\t<fieldset>\n\n";

        echo "\t\t<label>\n\t\t\t<span class=\"qNum\">Q" . $questions[$i][id] . ": </span>\n\t\t\t";
        echo $questions[$i][question] . "\n\t\t</label>\n";

            $submittedName = (string) "question" . $questions[$i][id];

        for ($c=0;$c<sizeof($questions[$i][answers]);$c++) {

            if ($_POST["$submittedName"] == $c) {
                if ($questions[$c][answers][$c][correct] == 1) {
                    echo "\n\t\t<span class=\"correct\"><span class=\"hint\">✓</span>";
                    echo "<input checked type=\"radio\" name=\"question" . $questions[$i][id] . "\"";
                    echo " value=\"$c\" />";
                }
                else {
                    echo "\n\t\t<span class=\"submitted\"><span class=\"hint\">✗</span>";
                    echo "<input type=\"radio\" name=\"question" . $questions[$i][id] . "\"";
                    echo " value=\"$c\" />";
                }
            }
            elseif ($questions[$c][answers][$c][correct] == 1) {
                echo "\n\t\t<span class=\"thisOne\">";
                echo "<input type=\"radio\" name=\"question" . $questions[$i][id] . "\"";
                echo " value=\"$c\" />";
            }
            else {
                echo "\n\t\t<span class=\"optionLine\">";
                echo "<input disabled type=\"radio\" name=\"question" . $questions[$i][id] . "\"";
                echo " value=\"$c\" />";
            }

            echo $questions[$i][answers][$c][answer] . "</span>";
        }
        echo "\n\n\t\t</fieldset>\n\n";
    }

echo "</form>";

}

else {
    // show the form
?>
    <form enctype="form/multipart" action="<?php echo $_SERVER['PHP_SELF']; ?>" method="post">

<?php

    for ($i=0;$i<sizeof($questions);$i++) {

        echo "\t\t<fieldset>\n\n";

        echo "\t\t<label>\n\t\t\t<span class=\"qNum\">Q" . $questions[$i][id] . ": </span>\n\t\t\t";
        echo $questions[$i][question] . "\n\t\t</label>\n";


        for ($c=0;$c<sizeof($questions[$i][answers]);$c++) {
            echo "\n\t\t<span class=\"optionLine\">";
            echo "<input type=\"radio\" name=\"question" . $questions[$i][id] . "\"";
            echo " value=\"$c\" />";
            echo $questions[$i][answers][$c][answer] . "</span>";
        }
        echo "\n\n\t\t</fieldset>\n\n";
    }



?>

    <fieldset>

        <input type="reset" value="clear" />
        <input type="submit" value="submit" />
        <input type="hidden" name="submit" value="1" />

    </fieldset>

    </form>
<?php

}
?>

<div id="variables">
</div>
</body>

</html>

То, что я хотел бы сделать, это переупорядочить ответы и запомнить переупорядочение (используя -I-думаю, значение $questions[$i][answers][$c][correct], чтобы определить, является ли ответ верным ('1') или ложным ('2'). Но я думаю, что я заблудился где-то в кладже. Если у кого-нибудь есть какая-либо помощь, предложения, чтобы сделать их, были бы очень рады.

Как и любой человек, любезно отредактировавший примеры кода до необходимого (слишком много, я просто не уверен, что это за необходимая информация).

Спасибо!

1 Ответ

1 голос
/ 22 июня 2009

Ваши таблицы данных ужасны. Вам нужна одна таблица для вопросов и другая таблица для ответов. Каждая запись в таблице ответов ссылается на вопрос в таблице вопросов и имеет флаг, указывающий, является ли это правильным ответом.

Итак, таблица QUESTIONS имеет следующие поля:

  • QUESTION_ID
  • QUESTION_TEXT
  • QUESTION_TYPE - Как MC, TF, FIB ...

Таблица ANSWERS имеет следующие поля:

  • ANSWER_ID
  • QUESTION_ID
  • ANSWER_TEXT
  • IS_CORRECT

Делает вашу жизнь бесконечно легче и устраняет смысл для этого вопроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...