2009-06-22 4 views
2

Problème:Randomisation -et souvenant que randomisation- questions à choix multiples en php

Je suis en train de coder un questionnaire à choix multiples pour mes collègues étudiants -et surtout pour aider mon Learning- et donc je crée un quiz basé sur le Web à choix multiples en utilisant PHP (02/05/08) et MySQL (5.0.32)

Le tableau des questions est:

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

Exemple print_r (question $) sortie pour une 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 pour récupérer les questions/réponses et assigner aux 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++; 
} 

Pour afficher les questions/réponses:

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

Ce que je voudrais faire est de réorganiser les réponses et rappelez-vous la réorganisation (en utilisant -je pense- la valeur de $questions[$i][answers][$c][correct] pour déterminer si la réponse est vraie ('1') ou fausse ('2'). Mais je pense que je me suis perdu dans le kludge, quelque part. Si quelqu'un a de l'aide à offrir, des suggestions pour qu'ils soient les bienvenus.

Comme n'importe qui serait assez aimable pour éditer les exemples de code jusqu'aux nécessités (il y en a trop, je ne suis pas sûr de l'information nécessaire).

Merci!

Répondre

1

Vos tables de données sont terribles. Vous avez besoin d'une table pour les questions et une autre table pour les réponses. Chaque entrée dans la table des réponses renvoie à une question dans la table des questions et possède un drapeau indiquant si c'est la bonne réponse.

Ainsi, la table QUESTIONS a les champs suivants:

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

Le tableau a ANSWERS les champs suivants:

  • ANSWER_ID
  • QUESTION_ID
  • ANSWER_TEXT
  • IS_CORRECT

rend votre vie infiniment plus facile et évite la raison d'être pour cette question.

+0

Cela m'est venu à l'esprit lorsque j'ai établi le plan de table. Je ne me souviens pas pourquoi j'ai pensé qu'il serait plus simple de ne pas normaliser. O.o –