Jump to content

Counting up correct answers in a quiz - help please.


gerrydewar

Recommended Posts

Hello everyone,

Hope someone can help me out with my code here. I'm creating a multiple choice quiz and i have so far managed to generate random questions from my database and have them display on screen in a nice neat way. Each answer has a radio button so the user can select an answer. So as you can see from my script below i display the form before the submit button is pressed. As soon as the submit is pressed i would like the total number of correct answers to be shown. This is the bit of my script that is confusing me. I currently get an error message telling me that it doesn't like my 'mysql_fetch_array' just below the $score = 0 line. I think i'm quite close to solving this problem. Does anyone have any ideas?

<body>
<?php

if($_SERVER['REQUEST_METHOD'] == 'POST'){

$score = 0;
while($row = mysql_fetch_array($result,MYSQL_NUM)){

$answer = $row[2];

if ($guess == $answer) {
$score++;
}else{
$score = $score;
}
}
echo '<p><b> you scored $score</b></p>';

}else{//Display the form.

?>

<form name ="systemstest" action="<?php echo $_SERVER['PHP_SELF'];?>" method="post">
<div align="center"><input type="submit" value="check score" name="submitted"></div>
<?php

//Connect to db.
require_once ('../mysql_connect.php');

//Select 5 random questions from database
$query = "SELECT question_id, question, answer, choice1, choice2, choice3 FROM questions WHERE subject_id = 1 ORDER BY RAND() LIMIT 5";
$result = @mysql_query ($query); //Run query

if($result) {
echo '<table align="left" cellspacing="10" cellpadding="10">';

while ($row=mysql_fetch_array($result,MYSQL_NUM)){

$id = $row[0];
$questions = $row[1];
$answer = $row[2];
$opt1 = $row[3];
$opt2 = $row[4];
$opt3 = $row[5];

echo "<tr><td align=\"left\"><li>$questions</td></tr>
<tr> <td align=\"left\"><input type=\"radio\" name=\"guess\"value=\"$opt1\"/>$opt1</td></tr>
<tr> <td align=\"left\"><input type=\"radio\" name=\"guess\"value=\"$opt2\"/>$opt2</td></tr>
<tr> <td align=\"left\"><input type=\"radio\" name=\"guess\"value=\"$opt3\"/>$opt3</td></tr>
\n";
}
echo '</table>';
//echo '<table>';

}else{
echo'<p>Test failed</p>';
}

mysql_close();
}
?>
</form>
</body>
Link to comment
Share on other sites

When you press submit, your script is started again, so you have to do all of the preliminary database stuff again.

Also instead of
[code]<?php if($_SERVER['REQUEST_METHOD'] == 'POST') ?>[/code]
you probably want to use
[code]<?php if (isset($_POST['submitted'])) ?>[/code]


Ken
Link to comment
Share on other sites

I cut some fat... See my other remarks at the end...
[code]
<body>
  <?php

    if($_SERVER['REQUEST_METHOD'] == 'POST'){
    $score = 0;
    while($row = mysql_fetch_array($result,MYSQL_NUM)){
    $answer = $row[2];
        if ($guess == $answer) {
        $score++;
        }
        }
    }
    echo '<p><b> you scored '.$score.'</b></p>';

    }
<snip>
[/code]
I don't use PHP_SELF so I don't really know the answer for sure, but I don't know if you can cycle through a result twice... I would have made the answers post hidden with the responces in the form... That seems easier to me...
Link to comment
Share on other sites

[!--quoteo(post=353019:date=Mar 8 2006, 09:42 PM:name=keeB)--][div class=\'quotetop\']QUOTE(keeB @ Mar 8 2006, 09:42 PM) [snapback]353019[/snapback][/div][div class=\'quotemain\'][!--quotec--]
Just looking code over, what's the MYSQL_NUM for?

also, can you give the error, please?
[/quote]

I use the MYSQL_NUM for the array as my database info gets stuck into an array. The error i am getting is

Warning: mysql_fetch_array():supplied argument is not a valid MySQL result resource in c:\.....on line ....
Link to comment
Share on other sites

[!--quoteo(post=353020:date=Mar 8 2006, 09:42 PM:name=kenrbnsn)--][div class=\'quotetop\']QUOTE(kenrbnsn @ Mar 8 2006, 09:42 PM) [snapback]353020[/snapback][/div][div class=\'quotemain\'][!--quotec--]
When you press submit, your script is started again, so you have to do all of the preliminary database stuff again.

Also instead of
[code]<?php if($_SERVER['REQUEST_METHOD'] == 'POST') ?>[/code]
you probably want to use
[code]<?php if (isset($_POST['submitted'])) ?>[/code]
Ken
[/quote]

I'll give that a go. How much of the preliminary database stuff? Just

//Connect to db.
require_once ('../mysql_connect.php');

or anymore?
Link to comment
Share on other sites

[!--quoteo(post=353108:date=Mar 9 2006, 02:07 AM:name=AV1611)--][div class=\'quotetop\']QUOTE(AV1611 @ Mar 9 2006, 02:07 AM) [snapback]353108[/snapback][/div][div class=\'quotemain\'][!--quotec--]
Again, if you put the answer in <input type=hidden> along with the responces, you wouldn't need to run through it again...
[/quote]

Here is what i have now. It gives an answer of 0 all the time so far. All i want to be able to do is compare the selected radio button value with the correct answer. If it is correct then add one to total. How hard can that be? Bloody hard in my case!!!!

<body>

<form name ="systemstest" action="<?php echo $_SERVER['PHP_SELF'];?>" method="post">
<div align="center"><input type="submit" value="check score" name="submitted"></div>
<?php

//Connect to db.
require_once ('../mysql_connect.php');

//Select 5 random questions from database
$query = "SELECT question_id, question, answer, choice1, choice2, choice3 FROM questions WHERE subject_id = 1 ORDER BY RAND() LIMIT 5";
$result = @mysql_query ($query); //Run query

if(!isset($_POST['submitted'])){ //display the form

if($result) {
echo '<table align="left" cellspacing="10" cellpadding="10">';

while ($row=mysql_fetch_array($result,MYSQL_NUM)){

$id = $row[0];
$questions = $row[1];
$answer = $row[2];
$opt1 = $row[3];
$opt2 = $row[4];
$opt3 = $row[5];

echo "<tr><td align=\"left\"><li>$questions</td></tr>
<tr> <td align=\"left\"><input type=\"radio\" name=\"$id\" value=\"$opt1\"/>$opt1</td></tr>
<tr> <td align=\"left\"><input type=\"radio\" name=\"$id\" value=\"$opt2\"/>$opt2</td></tr>
<tr> <td align=\"left\"><input type=\"radio\" name=\"$id\" value=\"$opt3\"/>$opt3</td></tr>
<tr> <td align=\"left\"><input type=\"hidden\"name=\"rightanswer\" value=\"$answer\"/></td></tr>
\n";
}
echo '</table>';
echo '</form>';

}else{
echo'<p>Test failed</p>';
}
}else{
$score=0;

if($_POST['$id']==$_POST['rightanswer']){
$score++;
}

echo 'you scored '.$score.'';

mysql_close();
}
?>
</body>
</html>
Link to comment
Share on other sites

Are you trying to make the names of the radiobuttons the same as your the contents of your varible "$ID"? If so, your script is wrong. Try this instead:

[code]<?php
echo '<tr><td align="left"><li>' . $questions . '</td></tr>
<tr> <td align="left"><input type="radio" name="choice[' . $id . ']" value="' . $opt1 .'"/>' . $opt1 . '</td></tr>
<tr> <td align="left"><input type="radio" name="choice[' . $id . ']" value="' . $opt2 .'"/>' . $opt2 . '</td></tr>
<tr> <td align="left"><input type="radio" name="choice[' . $id . ']" value="' . $opt3 .'"/>' . $opt3 . '</td></tr>
<tr> <td align="left"><input type="hidden" name="rightanswer[' . $id . ']" value="' . $answer . '"/></td></tr>' . "\n";
}?>[/code]

Then in your processing code:
[code]<?php
$score = 0;

foreach($_POST['choice'] as $id => $ans)
     if($_POST['rightanswer'][$id] == $ans) $score++;

?>[/code]

The way you have it scripted all of your radio buttons were named "$id" so if you had more than one question only the last choices would be returned. The same with the right answer.

Ken
Link to comment
Share on other sites

This thread is more than a year old. Please don't revive it unless you have something important to add.

Join the conversation

You can post now and register later. If you have an account, sign in now to post with your account.

Guest
Reply to this topic...

×   Pasted as rich text.   Restore formatting

  Only 75 emoji are allowed.

×   Your link has been automatically embedded.   Display as a link instead

×   Your previous content has been restored.   Clear editor

×   You cannot paste images directly. Upload or insert images from URL.

×
×
  • Create New...

Important Information

We have placed cookies on your device to help make this website better. You can adjust your cookie settings, otherwise we'll assume you're okay to continue.