tags:

views:

550

answers:

1

Problem:

I'm trying to code a multiple choice quiz for my fellow students -and primarily to aid my own learning- and so I'm creating a multiple choice web-based quiz using PHP (5.2.08) and MySQL (5.0.32)

The questions table is:

+----------+--------------+------+-----+---------+----------------+
| 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    |                | 
+----------+--------------+------+-----+---------+----------------+

Sample print_r($questions) output for one question:

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 to retrieve the questions/answers and assign to variables:

  $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++;
 }

To display the questions/answers:

<?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"&gt;

<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>

What I'd like to do is to reorder the answers and remember the reorder (using -I think- the value of $questions[$i][answers][$c][correct] to determine if the answer's true ('1') or false ('2'). But I think I got lost in the kludge, somewhere. If anyone has any help to offer, suggestions to make they'd be most welcome.

As would anyone being kind enough to edit the code examples down to the necessities (there's way too much, I'm just not sure what's necessary information).

Thanks!

+1  A: 

Your data tables are awful. You need one table for questions and another table for answers. Each entry in the answers table refers back to a question in the questions table and has a flag indicating whether it is the correct answer.

So, the QUESTIONS table has the following fields:

  • QUESTION_ID
  • QUESTION_TEXT
  • QUESTION_TYPE -- Like MC, TF, FIB ...

The ANSWERS table has the following fields:

  • ANSWER_ID
  • QUESTION_ID
  • ANSWER_TEXT
  • IS_CORRECT

Makes your life infinitely easier and obviates the raison d'etre for this question.

Sinan Ünür
That occurred to me when I set out the table plan. I can't remember why I thought it would be simpler not to normalize. O.o
David Thomas