1

I'm making online test/quiz for students and using PHP and MySQL. Currently I have a form, where I can add the questions and answers into the database.

However, I have trouble with submitting correct answers into the database by selecting multiple checkboxes. I want to store all correct answers in the table called correct_answer(id, question_id, answer_id) and insert all selected id's from the table called answers(id,answer_id, answer).

How can I insert only selected checkboxes values and skip somehow unchecked checkboxes?

My HTML part:

<form id="add_question_form" method="post">
  <label>Question: *</label>
  <input id="question" type="text" name="question" class="form_default" placeholder="Type your question here" required>
  <div class="inputs">
    <label>Answer #1: *</label>
    <input type="text" id="answer" name="dynamic[]" class="form_default" placeholder="answer" required/>
    <input type="checkbox" name="selected_item[]" id="checkbox" value="<?php echo $answer_id;?>">
    <label>correct</label>
    <br>
    <label>Answer #2: *</label>
    <input type="text" id="answer" name="dynamic[]" class="form_default" placeholder="answer" required/>
    <input type="checkbox" name="selected_item[]" id="checkbox" value="<?php echo $answer_id;?>" />
    <label>correct</label>
    <br>
  </div>
  <input id="submit" type="submit" name="add_question" value="Submit" class="button">
</form>

PHP code:

if (isset($_POST['add_question'])) { // Checks if the form has been submitted
	if (isset($_POST['selected_item']) && !empty($_POST['selected_item'])) {
		$counter++; // each time adds 1 after user posts the question

$optionArray = $_POST['dynamic']; // submits multiple answers to the database

  for ($j = 0; $j < count($optionArray); $j++) {
						
	$answer = mysql_real_escape_string($_POST['dynamic'][$j]); // returns multiple answers
					
	$check_answer = "SELECT id, answer FROM answers WHERE answer = '$answer'";
	$check_answer = mysql_query($check_answer); //checks if answer is exist in the database
					
	while ($row = mysql_fetch_assoc($check_answer)) { // fetch a result rows as an associative array
		$answer_id = $row['id']; // answer id from database
	}
					
	if (mysql_num_rows($check_answer) > 0) { 
		$q = "INSERT INTO correct_answer (question_id, answer_id) VALUES ('$counter','$answer_id')";
		$q = mysql_query($q); 
	}
  }
}
}

For instance:

  1. I'm adding question and three answers "a","b" and "c". Selecting "a" and "c" as correct answer.

  2. All answers have been successfully added to MySQL "answers" table:

1 - a

2 - b

3 - c

  1. But, instead of adding id ="1" and "3" into "correct_answer" table (as "a" and "c" have these ids numbers), it adds ids of first two answers "1" and "2".. Therefore, it wrongly matching the correct answer and setting up "a" and "b" as correct answer.

Can anyone help me please? I want to insert multiple correct answers, but only if they are selected..

Thanks in advance, any help will be appreciated!

1 Answer 1

1

You can use an IF statement if the checkbox is checked or not.

for ($j = 0; $j < count($_POST['selected_item']); $j++) {

  if(!empty($_POST['selected_item'][$j])){ /* CHECK IF CHECKBOX IS SELECTED */  

    answer = mysql_real_escape_string($_POST['dynamic'][$j]); // returns multiple answers
    $check_answer = "SELECT id, answer FROM answers WHERE answer = '$answer'";
    $check_answer = mysql_query($check_answer); //checks if answer is exist in the database

    while ($row = mysql_fetch_assoc($check_answer)) { // fetch a result rows as an associative array
      $answer_id = $row['id']; // answer id from database
    }

    if (mysql_num_rows($check_answer) > 0) { 
      $q = "INSERT INTO correct_answer (question_id, answer_id) VALUES ('$counter','$answer_id')";
      $q = mysql_query($q); 
    }
  } /* END OF IF $answer is not empty */

} /* END OF FOR LOOP */

Advice:

Use a counter in your form and put it inside the array before submitting it. Example:

$counter = 0;

 <input type="text" id="answer" name="dynamic[<?php $counter; ?>]" class="form_default" placeholder="answer" value="<?= isset($_POST['dynamic'][0]) ? $_POST['dynamic'][0] : '' ?>" required/>
    <input type="checkbox" name="selected_item[<?php echo $counter; ?>]" id="chechbox" value="<?php echo $answer_id;?>">

Then increment it (assuming that you also run the form in a loop)

$counter = $counter + 1;

It doesn't run on a loop and the form is fix:

You can manually put the array number inside the textbox and checkbox.

After submission:

And when submitted, count the submitted checkbox using count() function of PHP.

$counter = count($_POST["selected_item"]);

Then run your loop using the $counter (refer back to my first given sample code).

Note:

  • The checkbox and it's corresponding textbox must have the same array number, or else, the answer will not match with the checkbox.

A much more simple example:

Answer # 1
<input type="checkbox" name="selected_item[0]"><input type="text" name="dynamic[0]"> <!-- Notice that they are both in 0 array -->

Answer # 2
<input type="checkbox" name="selected_item[1]"><input type="text" name="dynamic[1]"> <!-- Next question array should be incremented from the previous answer -->

And after submission, count the selected_item and then loop it that checks the selected checkboxes.

for($x=0; $x<=count($_POST['selected_item']); $x++){
  if(!empty($_POST['selected_item'][$x])){
    /**** PLACE HERE YOUR INSERT QUERY ****/
  }
}
Sign up to request clarification or add additional context in comments.

4 Comments

Your code is making sense and I was really sure it will work! When I'm adding if(!empty($_POST['selected_item'][$j])) { it doesn't read this part of the code at all, which means checkbox isn't selected, but in fact I ticked correct answers and pressed submit button. Do you know any other way to check or skip the empty boxes which haven't been selected? Thanks!
@AleksandrLevcenko - it works if you can add counter in the array of your form. Like my second code example. Well, like this...again.. <input type="checkbox" name="selected_item[$yourcounter]" id="checkbox" value="$yourvalue"> I'll update my answer.
now it works, but it adds all the answers even though some of them I didn't tick as correct answer.. How can I post only checked textboxes input values to the database?
@AleksandrLevcenko did you use my recommendations? Checkbox should have the same array number with the corresponding textbox by assigning a $counter variable or assigning manually an array number. And the insert query will only run if the checkbox is ticked.

Your Answer

By clicking “Post Your Answer”, you agree to our terms of service and acknowledge you have read our privacy policy.

Start asking to get answers

Find the answer to your question by asking.

Ask question

Explore related questions

See similar questions with these tags.