显示随机q及其随机ans

时间:2014-02-02 19:03:34

标签: php mysql

***我正在使用php和mysql制作一个测验应用程序,我必须显示随机问题..但我已经为答案定义了静态索引。我的程序通过刷新窗口显示随机问题,但答案索引不根据问题刷新,因为它们是静态的

       <?php 
$con=mysql_connect('localhost','root','test123');
mysql_select_db("quiz",$con);
?>
<html> 
<body> 
<form method="get" action="result.php">
<?php
$query="select m_question,a,b,c,d,e from mcq ORDER BY RAND()";
$result=mysql_query($query);
$rows=mysql_num_rows($result);
$a=1;
for($j=0;$j<$rows;$j++)
{
echo "<br> $a." .mysql_result($result,$j,'m_question')."<br>" ;
echo "<input type = radio name=$a  value='a'>" .mysql_result($result,$j,'a');
echo "<input type = radio name=$a  value='b'>" .mysql_result($result,$j,'b');
echo "<input type = radio name=$a  value='c'>" .mysql_result($result,$j,'c');
echo "<input type = radio name=$a  value='d'>" .mysql_result($result,$j,'d');
echo "<input type = radio name=$a  value='e'>" .mysql_result($result,$j,'e');
$a++;
}
?>
<br>
<br>
<input type = "submit"  value ="submit result">
</body>
    </html> 

这是我的结果文件,我在比较结果。一个问题是“b”选项,第二个是“a”等等......

 <?php 
    $result=0;
    if ($_GET[1]=='b')
    {$result++;}
    if ($_GET[2]=='a')
    {$result++;}
    if ($_GET[3]=='b')
    {$result++;}
    if ($_GET[4]=='b')
    {$result++;}
              echo "your score::".$result;
          ?>

1 个答案:

答案 0 :(得分:1)

我不确定答案的静态索引是什么意思,但你应该记住,你的数据库架构应该始终反映存储的数据,你可以回答任何问题。通过查看可用数据,您可能会遇到的问题。由于我根据您的代码完全不知道您拥有的内容(例如,您没有指定您的架构),因此我们假设我们从头开始 - 而且您可以将你的所得与我的想法进行比较。

架构

首先,您有两组数据:问题和答案。由于这是一个测验应用程序,我假设测验的格式是“多项选择”;也就是说,每个问题都有两个或更多可能的答案,其中只有一个是正确的。

这意味着我们应该将问题和答案分成两个表格;我们打电话给他们&#39; questions&#39;和&#39; answers&#39;分别

问题

在&#39; questions&#39;表,我们需要一些东西:

  1. 每个问题的唯一数字标识符。这需要在将来建立任何关系,以便我们可以轻松指出任何特定问题(确保问题中的文本字符串可能已经是唯一的,但是当您想要快速指向表中的特定项目时,计算机在比较和搜索数字方面要比在比较和搜索文本时快得多。这将是我们的主要关键。
  2. 问题本身。这很明显。
  3. 到目前为止,我们的架构看起来像这样(主键以粗体显示):

    • 问题
      • q_id
      • 问题

    注意:&#39; q_id&#39; (或者您为主键命名的任何内容)也应标记为&#39; AUTO_INCREMENT&#39;。当您将每个问题输入数据库时​​,您将保留该字段&#39; null&#39;并自动为其分配下一个可用的号码。

    答案

    现在为&#39; answers&#39;表,我们需要一些不同的东西。我们需要单独识别每个答案(能够指出他们可以选择的每个答案),答案所属的问题,并且我们还必须能够确定哪一个是正确的答案。

    我们可以通过提供“回复ID”来实现此目的。主键,外键&#39;引用&#39; q_id&#39; &#39; questions&#39;中的列table,因为它是该表的主键,因此唯一地标识每一行(每个问题)。那么我们所需要的只是答案本身,以及它是否是正确的答案。最终结果是这样的:

    • 答案
      • A_ID
      • q_id(外键:questions.q_id
      • 答案
      • 正确(枚举:&#39;是&#39;,&#39; no&#39;)

    这也允许问题没有正确答案或多个正确答案。您必须处理您的数据,以确保它符合测验。如果您只想为每个问题限制一个正确答案,则可以添加“UNIQUE&#39;索引包含&#39; q_id&#39;和&#39; correct&#39;。在MySQL中,它看起来像:

    UNIQUE INDEX (q_id, correct),
    

    这将包含在您的CREATE TABLE语句中,或者包含在单独的ALTER TABLE语句中。

    注意:&#39; q_id&#39;在&#39; answers&#39;应该不*使用AUTO_INCREMENT *或作为主键。如果您认为它造成了瓶颈,请在其上添加索引。

    示例数据集

    为了帮助您查看此架构,请进行简单的测验:

    • 问题
      • 1,&#34;一英里多少英寸?&#34;;
      • 2,&#34;为什么人们呼吸空气?&#34;;
      • 3,&#34;为什么Monty Python很受欢迎?&#34 ;;
    • 答案
      • 1,1,&#34; 63,360&#34;,&#39; yes&#39;;
      • 2,1,&#34; 5,280&#34;,&#39; no&#39;;
      • 3,1,&#34;超过一百万&#34;,&#39; no&#39;;
      • 4,1,&#34;几百&#34;,&#39; no&#39;;
      • 5,2,&#34;所以他们不会死&#34;,&#39;是&#39;;
      • 6,2,&#34;因为它很酷&#34;,&#39; no&#39;;
      • 7,2,&#34;因为它有礼貌&#34;,&#39; no&#39;;
      • 8,2,&#34;所以他们可以嘲笑那些没有&#39;,&#39; no&#39;;
      • 9,3,&#34;因为人们觉得很有趣&#34;,&#39;是&#39;;
      • 10,3,&#34;因为它是&#34;,&#39; no&#39;;
      • 11,3,&#34;由于法语&#34;,&#39; no&#39;;
      • 12,3,&#34;它很受欢迎?&#34;,&#39; no&#39;;

    在PHP中查询

    这里有两组问题需要担心:抓住问题,抓住答案。我想首先指出,在您的代码示例中,您将使用旧的,过时的&#39; mysql&#39;一组功能(&#39; mysql_query&#39;,&#39; mysql_result&#39;等等。

    非常不鼓励这样做,您应该学会使用较新的'Mysqli'库或更抽象的'PDO'库。我将使用Mysqli。

    方法1:一次性完成。

    您可以运行查询的第一种方法是选择所有问题,然后立即所有答案,将它们放入数据结构(您自己的类,或只是一个嵌套数组),然后随机化它们显示的顺序。这是一些代码显示这一点。评论值得一读:

    <?php
    
    //Connect to MySQL:
    $con = new mysqli("localhost", "tynach", "505.2.0", "quiz");
    
    //Grab the question list:
    $get_questions = $con->prepare("SELECT q_id, question FROM questions");
    $get_questions->execute();
    $get_questions->bind_result($q_id, $question);
    
    $questions = array();
    
    while ($get_questions->fetch()) {
        // We use $q_id twice because if you scramble the array, the first one
        // changes. However, we still might want to keep track of the original
        // question ID number.
    
        // The reason we use it in that first spot to begin with is so that we
        // know for sure that we can associate the answers to the correct
        // questions.
        $questions[$q_id] = array($q_id, $question, array());
    }
    
    // Grab the answer list:
    $get_answers = $con->prepare("SELECT a_id, q_id, answer, correct FROM answers");
    $get_answers->execute();
    $get_answers->bind_result($a_id, $q_id, $answer, $correct);
    
    while ($get_answers->fetch()) {
        $questions[$q_id][2][$a_id] = array($a_id, $answer, $correct);
    }
    
    // Scramble the array, and print it out:
    shuffle($questions);
    var_dump($questions);
    
    ?>
    

    输出到:

    array(3) {
      [0]=>
      array(3) {
        [0]=>
        int(1)
        [1]=>
        string(30) "How many inches are in a mile?"
        [2]=>
        array(4) {
          [1]=>
          array(3) {
            [0]=>
            int(1)
            [1]=>
            string(6) "63,360"
            [2]=>
            string(3) "yes"
          }
          [2]=>
          array(3) {
            [0]=>
            int(2)
            [1]=>
            string(5) "5,280"
            [2]=>
            string(2) "no"
          }
          [3]=>
          array(3) {
            [0]=>
            int(3)
            [1]=>
            string(14) "Over a million"
            [2]=>
            string(2) "no"
          }
          [4]=>
          array(3) {
            [0]=>
            int(4)
            [1]=>
            string(15) "Several Hundred"
            [2]=>
            string(2) "no"
          }
        }
      }
      [1]=>
      array(3) {
        [0]=>
        int(2)
        [1]=>
        string(26) "Why do people breathe air?"
        [2]=>
        array(4) {
          [5]=>
          array(3) {
            [0]=>
            int(5)
            [1]=>
            string(17) "So they don't die"
            [2]=>
            string(3) "yes"
          }
          [6]=>
          array(3) {
            [0]=>
            int(6)
            [1]=>
            string(17) "Because it's cool"
            [2]=>
            string(2) "no"
          }
          [7]=>
          array(3) {
            [0]=>
            int(7)
            [1]=>
            string(19) "Because it's polite"
            [2]=>
            string(2) "no"
          }
          [8]=>
          array(3) {
            [0]=>
            int(8)
            [1]=>
            string(37) "So they can laugh at people who don't"
            [2]=>
            string(2) "no"
          }
        }
      }
      [2]=>
      array(3) {
        [0]=>
        int(3)
        [1]=>
        string(28) "Why is Monty Python popular?"
        [2]=>
        array(4) {
          [9]=>
          array(3) {
            [0]=>
            int(9)
            [1]=>
            string(28) "Because people find it funny"
            [2]=>
            string(3) "yes"
          }
          [10]=>
          array(3) {
            [0]=>
            int(10)
            [1]=>
            string(13) "Because it is"
            [2]=>
            string(2) "no"
          }
          [11]=>
          array(3) {
            [0]=>
            int(11)
            [1]=>
            string(21) "Because of the French"
            [2]=>
            string(2) "no"
          }
          [12]=>
          array(3) {
            [0]=>
            int(12)
            [1]=>
            string(13) "It's popular?"
            [2]=>
            string(2) "no"
          }
        }
      }
    }
    

    我还有更多要写的内容,但是我要去参加一个超级碗派对,所以我稍后会用更多信息编辑这篇文章。