***我正在使用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;
?>
答案 0 :(得分:1)
我不确定答案的静态索引是什么意思,但你应该记住,你的数据库架构应该始终反映存储的数据,你可以回答任何问题。通过查看可用数据,您可能会遇到的问题。由于我根据您的代码完全不知道您拥有的内容(例如,您没有指定您的架构),因此我们假设我们从头开始 - 而且您可以将你的所得与我的想法进行比较。
首先,您有两组数据:问题和答案。由于这是一个测验应用程序,我假设测验的格式是“多项选择”;也就是说,每个问题都有两个或更多可能的答案,其中只有一个是正确的。
这意味着我们应该将问题和答案分成两个表格;我们打电话给他们&#39; questions
&#39;和&#39; answers
&#39;分别
在&#39; questions
&#39;表,我们需要一些东西:
到目前为止,我们的架构看起来像这样(主键以粗体显示):
注意:&#39; q_id
&#39; (或者您为主键命名的任何内容)也应标记为&#39; AUTO_INCREMENT
&#39;。当您将每个问题输入数据库时,您将保留该字段&#39; null&#39;并自动为其分配下一个可用的号码。
现在为&#39; answers
&#39;表,我们需要一些不同的东西。我们需要单独识别每个答案(能够指出他们可以选择的每个答案),答案所属的问题,并且我们还必须能够确定哪一个是正确的答案。
我们可以通过提供“回复ID”来实现此目的。主键,外键&#39;引用&#39; q_id
&#39; &#39; questions
&#39;中的列table,因为它是该表的主键,因此唯一地标识每一行(每个问题)。那么我们所需要的只是答案本身,以及它是否是正确的答案。最终结果是这样的:
questions.q_id
)这也允许问题没有正确答案或多个正确答案。您必须处理您的数据,以确保它符合测验。如果您只想为每个问题限制一个正确答案,则可以添加“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 *或作为主键。如果您认为它造成了瓶颈,请在其上添加索引。
为了帮助您查看此架构,请进行简单的测验:
这里有两组问题需要担心:抓住问题,抓住答案。我想首先指出,在您的代码示例中,您将使用旧的,过时的&#39; mysql&#39;一组功能(&#39; mysql_query
&#39;,&#39; mysql_result
&#39;等等。
非常不鼓励这样做,您应该学会使用较新的'Mysqli'库或更抽象的'PDO'库。我将使用Mysqli。
您可以运行查询的第一种方法是选择所有问题,然后立即所有答案,将它们放入数据结构(您自己的类,或只是一个嵌套数组),然后随机化它们显示的顺序。这是一些代码显示这一点。评论值得一读:
<?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"
}
}
}
}
我还有更多要写的内容,但是我要去参加一个超级碗派对,所以我稍后会用更多信息编辑这篇文章。