2014-10-01 3 views
2

я собирался показать некоторые случайные вопросы, вызываемые из моей базы данных и проверить ответы, используя этот код:проверка ответа со случайными MC вопросами из базы данных

question.php:

<html> 
<body> 
<h3>Please answer all questions.</h3><br><br> 
<form action="phpinfo.php" method="post"> 
<?php 
//connect to db 
$server = mysql_connect ('localhost', 'username', 'password'); 
mysql_select_db("mc", $server); 
$question = mysql_query("SELECT * FROM `question` ORDER BY RAND() LIMIT 20;"); // 60 questions in my database 
$x = 0; 
while ($row = mysql_fetch_array($question)) 
{ 
    echo "Question: ".$row['q_do'] . '<br />'; //q_do are my questions 
    echo '<input type="radio" name="a'.$x.'" value=a />' ,"A ".$row['a'] . '<br />'; // answer a 
    echo '<input type="radio" name="a'.$x.'" value=b />' ,"B ".$row['b'] . '<br />'; // answer b 
    echo '<input type="radio" name="a'.$x.'" value=c />' ,"C ".$row['c'] . '<br />'; // answer c 
    echo '<input type="radio" name="a'.$x.'" value=d />' ,"D ".$row['d'] . '<br />'; // answer d 
    $x++; 
    }; 
mysql_close($server); 
?> 
<input type="submit" name="Submit" value="Submit" /> //go to next page 
<br> 
</form> 
</body> 
</html> 

phpinfo.php:

<html> 
<body> 
<?php 
//connect to db 
$server = mysql_connect ('localhost', 'username', 'password'); 
mysql_select_db("mc", $server); 
$question = mysql_query("SELECT * FROM `question` ;"); 
$x = 0; 
$score = 0; 
while ($row = mysql_fetch_array($question)) //do not know how to call the questions did in previous page since they are random 
{ 
    echo $row['q_do'] . '<br />'; 

    $answered = $row[$_POST['a'.$x]] ; // the answers 
    $correct = $row['corr_ans'] ; 

    if ($answered == $correct) { 
     $score++; 
     $acolor = 'green' ; 
    } 
    else { 
    $acolor = 'red' ; 
    } 
    echo 'you answered <font color=' . $acolor . '>' . $answered . '<font color=black> <br />'; 
    echo 'the correct answer was ' . $correct . '<br />' ; 
    echo '-------------------------------------- <br />' ; 
    $x++; 
} 
echo 'You had a total of ' . $score . ' out of ' . $x . ' questions right!'; 
mysql_close($server); 
?> 
</body> 
</html> 

Как я могу изменить приведенные выше коды, чтобы вся система работала? Эти коды работают там, где нет случайных, и вопросы, которые следуют по возрастанию.

+1

Введите номер вопроса в скрытый ввод. Тогда скрипт обработки формы может найти правильный вопрос. – Barmar

ответ

0

Самый простой способ, чтобы решить вашу проблему, чтобы просто добавить идентификатор вопроса атрибуту значение каждого вопроса, как это:

echo '<input type="radio" name="a'.$x.'" value="a'.$row['id'].'" />' ,"A ".$row['a'] . '<br />'; 

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

Итак, если ваше значение для одного из ответов - «b7», вы знаете, что пользователь ответил на вопрос 7 с опцией b.

Чтобы получить этот идентификатор из строки, как «b7» вы можете использовать следующее:

$questionId = filter_var($fullAnswer, FILTER_SANITIZE_NUMBER_INT); 

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

Итак, на вашем скрипте на стороне сервера вам придется изменить свой цикл, чтобы просто повторить 20 раз (потому что это то, сколько вопросов было отправлено). Это, как ваши оба файла должны выглядеть после того, как вы сделаете все необходимые изменения:

question.php:

<html> 
<body> 
<h3>Please answer all questions.</h3><br><br> 
<form action="phpinfo.php" method="post"> 
<?php 
//connect to db 
$server = mysql_connect ('localhost', 'username', 'password'); 
mysql_select_db("mc", $server); 
$question = mysql_query("SELECT * FROM `question` ORDER BY RAND() LIMIT 20;"); // 60 questions in my database 
$x = 0; 
while ($row = mysql_fetch_array($question)) 
{ 
    echo "Question: ".$row['q_do'] . '<br />'; //q_do are my questions 
    echo '<input type="radio" name="a'.$x.'" value="a'.$row['id'].'" />' ,"A ".$row['a'] . '<br />'; 
    echo '<input type="radio" name="a'.$x.'" value="b'.$row['id'].'" />' ,"B ".$row['b'] . '<br />'; 
    echo '<input type="radio" name="a'.$x.'" value="c'.$row['id'].'" />' ,"C ".$row['c'] . '<br />'; 
    echo '<input type="radio" name="a'.$x.'" value="d'.$row['id'].'" />' ,"D ".$row['d'] . '<br />'; 
    $x++; 
    }; 
mysql_close($server); 
?> 
<input type="submit" name="Submit" value="Submit" /> //go to next page 
<br> 
</form> 
</body> 
</html> 

phpinfo.php:

<html> 
<body> 
<?php 
//connect to db 
$server = mysql_connect ('localhost', 'username', 'password'); 
mysql_select_db("mc", $server); 
$x = 0; 
$score = 0; 

// Make 20 iterations to process the 20 answers 
for ($i=0; $i<=19; $i++) 
{ 
    $fullAnswer = $row[$_POST['a'.$x]] ; 

    // Find the question id 
    $questionId = filter_var($fullAnswer, FILTER_SANITIZE_NUMBER_INT); 

    // Find the answer 
    $answer = substr($fullAnswer, 0, 1); 

    // get the question for the answer of current iteration 
    $result = mysql_query("SELECT * FROM `question` WHERE id=$questionId LIMIT 1;"); 
    $question = mysql_fetch_assoc($result); 

    echo $question['q_do'] . '<br />'; 

    $correct = $question['corr_ans'] ; 

    if ($answer == $correct) { 
     $score++; 
     $acolor = 'green' ; 
    } 
    else { 
    $acolor = 'red' ; 
    } 
    echo 'you answered <font color=' . $acolor . '>' . $answer . '<font color=black> <br />'; 
    echo 'the correct answer was ' . $correct . '<br />' ; 
    echo '-------------------------------------- <br />' ; 
    $x++; 
} 
echo 'You had a total of ' . $score . ' out of ' . $x . ' questions right!'; 
mysql_close($server); 
?> 
</body> 
</html> 

Простой :)

This может работать, но я не тестировал.

Просто чтобы вы знали, использование mysql_query - плохая идея. Он обесценивается. Вместо этого вы должны использовать PDO. Посмотрите документы PHP о том, как их использовать, а затем измените всю базу данных, чтобы использовать ее в своем коде.

Удачи.

+1

Вы также можете использовать [filter_var] (http://php.net/filter_var): https://eval.in/200587 –

+0

Я изменил регулярное выражение на это. Его более простой, чем регулярное выражение, я думаю. Спасибо за предложение :) –

+1

возможно, цикл for: for ($ i = 0; $ i <= 19; $ i ++)? –

Смежные вопросы