user3627265
user3627265

Reputation: 191

Creating a quiz using php, To store array data in a field in the database

I'm trying to create a dynamic quiz and store it in database, the inputs is composed of 1 question and 4 answers.
I made the textbox and radio buttons dynamically created using jquery. The 1 textbox is for the question and the other 4 textbox is for the answer, I have also 4 radio buttons for correct answer.

var ctr = 2;
      $("#addTextBox").click(function() {

      var newTBdiv = $(document.createElement('div'))
          .attr("id", 'QuestionTBDiv' +ctr);

          newTBdiv.css({"margin-top":"20px" });
          newTBdiv.css({"width":"500px"});
          newTBdiv.css({"padding":"5px"});
          newTBdiv.after().html('<label class="mlabel">Question</label><br/><input type="text"  name="quiztxtBox'+ctr+'" size="57" id="quiztxtBox'+ctr+'" placeholder="Question #'+ctr+'"><br/><label class="mlabel">Answer</label><br/><input type="text" name="quiztxtBox[]" size="24" id="answer[]" placeholder="Choice A">&nbsp;<input type="radio" name="correct_answer'+ctr+'" value="A">&nbsp;<input type="text" name="answer'+ctr+'" size="24" id="answer'+ctr+'" placeholder="Choice B">&nbsp<input type="radio" name="correct_answer'+ctr+'" value="B"><br/><input type="text" name="answer'+ctr+'" size="24" id="answer'+ctr+'" placeholder="Choice C">&nbsp;<input type="radio" class = "choiceC" name="correct_answer'+ctr+'" value="C">&nbsp;<input type="text" name="answer'+ctr+'"size="24" id="answer'+ctr+'" placeholder="Choice D">&nbsp;<input type="radio" name="correct_answer'+ctr+'" value="D"><br><span name="errMchoice" class="errorMsg"></span>')

          newTBdiv.appendTo("#exam_container");

          ctr++;

    });

Now the problem is, I need to store the data of questions and answer to one field only in the database.. I found out that using serialize() function will able to store the array in the field, But Im not quite sure of what I am doing. I was thinking of something like this. This is the array that I was thinking to serialize and store in the database.

$array = array(
             array(question1, answer1, answer2, answer3, answer4, correctanswer);
             array(question1, answer1, answer2, answer3, answer4, correctanswer);
);

Or is there other method to achieve this?

Upvotes: 0

Views: 1069

Answers (2)

James Lalor
James Lalor

Reputation: 1246

What you do is update you would use 2 tables to be like this:

table: Quizes

id, title, creator, etc

table: Quiz_Settings

id //(simply for managing rows and edits/updates)
"1", "2", "3" // etc

quiz_id
"55912" // or so on

type
"question", "answer"

ref_number
"1", "2" // This is basically Question 1, Question 2, Answer 1 etc.

value
"What is ...?" or "21" // The question or the answer

You would then get quiz by id = 55912, and check against quiz settings for all with "quiz_id" == 55912, and using the "question" field and "ref_number" field, you generate a table or page which has the questions, and then a field which has to be equal to "answer" "1"

In the event of MULTIPLE answers, you simply loop through each "answer" "1", if it's correct, +1, if it's incorrect, 0.

// EXAMPLE JS:

<script>
                var num_fields = <?=($num_fields > 0 ? $num_fields : 0)?>;
                var num_multi_fields = <?=($num_multi_fields > 0 ? $num_multi_fields : 0)?>;
                var cf = new Array();
                var cv = new Array();
                <?for($i=1;$i<=$num_fields;$i++) { ?>cf[<?=$i?>] = "<?=${'cf'.$i}?>"; cv[<?=$i?>] = "<?=${'cv'.$i}?>";<? } ?>

                var cmf = new Array();
                <?for($i=1;$i<=$num_multi_fields;$i++) { ?>
                    cmf[<?=$i?>] = "<?=${"cmf".$i}?>";
                    var cmv<?=$i?> = new Array();
                    <?$k = 0; for($j=1;$j<=${"cmf".$i."vt"};$j++) {?>
                        cmv<?=$i?>[<?=$k?>] = "<?=${"cmf".$i."v".$j}?>";
                    <? $k++; } ?>
                <?}  ?>

                $(document).ready(function() {
                    $("#num_fields").val(num_fields);
                    for(i=1;i<=num_fields;i++) {
                        $("#custom_fields").append(
                            '<div id="custom_'+i+'"><br/><label for="custom_field_'+i+'" class="custom-label">Custom Field '+i+': </label>&nbsp;'
                            + '<button type="button" class="btn btn-xs btn-danger delete_custom_o">Delete</button><br />'
                            + '<table width="100%"><tr><td>Field Name:</td><td>Field Value:</td></tr><tr>'
                            + '<td><input type="text" class="form-control custom_field" value="'+cf[i]+'" name="custom_field_'+i+'"/></td>'
                            + '<td><input type="text" class="form-control custom_value" value="'+cv[i]+'" name="custom_value_'+i+'"/></td></tr></table></div>'
                        );
                    };
                    $(".delete_custom_o").click(function() {
                        $(this).parent().remove();
                        var i = 0;
                        $("#custom_fields>div").each(function() {
                            i++;
                            $(this).find('label').text("Custom Field " +i+":");
                            $(this).find('.custom_field').attr("name", "custom_field_"+i);
                            $(this).find('.custom_value').attr("name", "custom_value_"+i);
                        });
                        num_fields--;
                        $("#num_fields").val(num_fields);
                    });
                });

                $("#add_field").click(function() {
                    num_fields++;
                    $("#num_fields").val(num_fields);
                    $("#custom_fields").append(
                        '<div id="custom_'+num_fields+'"><br/><label for="custom_field_'+num_fields+'">Custom Field '+num_fields+':</label>&nbsp;'
                        + '<button type="button" class="btn btn-xs btn-danger delete_custom_n">Delete</button><br />'
                        + '<table width="100%"><tr><td>Field Name:</td><td>Field Value:</td></tr><tr>'
                        + '<td><input type="text" class="form-control custom_field" name="custom_field_'+num_fields+'"/></td>'
                        + '<td><input type="text" class="form-control custom_value" name="custom_value_'+num_fields+'"/></td></tr></table></div>'
                    );
                });
                $('#custom_fields').on("click", ".delete_custom_n", function(){
                    $(this).parent().remove();
                    var i = 0;
                    $("#custom_fields>div").each(function() {
                        i++;
                        $(this).find('label').text("Custom Field " +i+":");
                        $(this).find('.custom_field').attr("name", "custom_field_"+i);
                        $(this).find('.custom_value').attr("name", "custom_value_"+i);
                    });
                    num_fields--;
                    $("#num_fields").val(num_fields);
                });

                $("#add_multi_field").click(function() {
                    num_multi_fields++;
                    $("#num_multi_fields").val(num_multi_fields);
                    $("#custom_multi_fields").append(
                        '<div id="custom_'+num_multi_fields+'" style="border-bottom: 1px solid #ddd; padding-bottom: 5px;"><br/>'
                        + '<label for="custom_field_'+num_multi_fields+'">Custom Field '+num_multi_fields+':</label>&nbsp;'
                        + '<button type="button" class="btn btn-xs em-bg-blue add_custom_n" data-id="'+num_multi_fields+'" data-target="#custom_table_'+num_multi_fields+'">Add</button>&nbsp;'
                        + '<button type="button" class="btn btn-xs btn-danger delete_custom_n">Delete</button><br />'
                        + '<div style="max-height:100px; overflow-y:auto; padding-left: 10px; padding-right: 10px;"><table width="100%" id="custom_table_'+num_multi_fields+'"><tr><td>Field Name:</td><td>Field Value:</td></tr><tr>'
                        + '<td><input type="text" class="form-control custom_field" name="custom_multi_field_'+num_multi_fields+'"/></td>'
                        + '<td><input type="text" class="form-control custom_value" name="custom_multi_value_'+num_multi_fields+'[]"/></td></tr>'
                        + '<tr><td><center><button type="button" class="btn btn-xs btn-danger delete_field">Remove</button></center></td>'
                        + '<td><input type="text" class="form-control custom_value" name="custom_multi_value_'+num_multi_fields+'[]"/></td></tr></table></div></div>'
                    );
                });
                $('#custom_multi_fields').on("click", ".add_custom_n", function(){
                    target = $(this).attr('data-target');
                    id = $(this).attr('data-id');
                    $(target).find('tbody')
                        .append($('<tr>')
                            .append($('<td>').html('<center><button type="button" class="btn btn-xs btn-danger delete_field">Remove</button></center>'))
                            .append($('<td>')
                                .append($('<input>').attr('type', 'text').attr('class', 'form-control custom_value').attr('name', 'custom_multi_value_'+id+'[]'))
                            )
                        );
                });
                $('#custom_multi_fields').on("click", ".delete_field", function(){
                    $(this).parent().parent().parent().remove(); 
                });
                $('#custom_multi_fields').on("click", ".delete_custom_n", function(){
                    $(this).parent().remove();
                    var i = 0;
                    $("#custom_multi_fields>div").each(function() {
                        i++;
                        $(this).find('label').attr('for','custom_field_'+i).text("Custom Field " +i+":");
                        $(this).attr('id','custom_'+i);
                        $(this).find('button.add_custom_n').attr('data-target', '#custom_table_'+i).attr('data-id', i);
                        $(this).find('table').attr("id","custom_table_"+i);
                        $(this).find('.custom_field').attr("name","custom_multi_field_"+i);
                        $(this).find('.custom_value').attr("name","custom_multi_value_"+i+"[]");
                    });
                    num_multi_fields--;
                    $("#num_multi_fields").val(num_multi_fields);
                });

                $(document).ready(function() {
                    $("#num_multi_fields").val(num_multi_fields);
                    for(i=1;i<=num_multi_fields;i++) {
                        var curr_array = window['cmv' + i];
                        string = "";
                        for(j=1;j<curr_array.length;j++) {
                            string += '<tr><td><center><button type="button" class="btn btn-xs btn-danger delete_field">Remove</button></center></td>'
                                + '<td><input type="text" class="form-control custom_value" value="'+curr_array[j]+'" name="custom_multi_value_'+i+'[]"/></td></tr>'
                        }
                        $("#custom_multi_fields").append(
                            '<div id="custom_'+i+'" style="border-bottom: 1px solid #ddd; padding-bottom: 5px;"><br/>'
                            + '<label for="custom_field_'+i+'">Custom Field '+i+':</label>&nbsp;'
                            + '<button type="button" class="btn btn-xs em-bg-blue add_custom_n" data-id="'+i+'" data-target="#custom_table_'+i+'">Add</button>&nbsp;'
                            + '<button type="button" class="btn btn-xs btn-danger delete_custom_n">Delete</button><br />'
                            + '<div style="max-height:100px; overflow-y:auto; padding-left: 10px; padding-right: 10px;"><table width="100%" id="custom_table_'+i+'"><tr><td>Field Name:</td><td>Field Value:</td></tr></tr>'
                            + '<td><input type="text" class="form-control custom_field" value="'+cmf[i]+'" name="custom_multi_field_'+i+'"/></td>'
                            + '<td><input type="text" class="form-control custom_value" value="'+curr_array[0]+'" name="custom_multi_value_'+i+'[]"/></td></tr>'
                            + ""+string+""
                            + '</table></div></div>'
                        );
                    };
                    $(".delete_custom_o").click(function() {
                        $(this).parent().remove();
                        var i = 0;
                        $("#custom_multi_fields>div").each(function() {
                            i++;
                            $(this).find('label').attr('for','custom_field_'+i).text("Custom Field " +i+":");
                            $(this).attr('id','custom_'+i);
                            $(this).find('button.add_custom_n').attr('data-target', '#custom_table_'+i).attr('data-id', i);
                            $(this).find('table').attr("id","custom_table_"+i);
                            $(this).find('.custom_field').attr("name","custom_multi_field_"+i);
                            $(this).find('.custom_value').attr("name","custom_multi_value_"+i+"[]");
                        });
                        num_multi_fields--;
                        $("#num_multi_fields").val(num_multi_fields);
                    });
                    $(".delete_field").click(function() {
                        $(this).parent().parent().parent().remove(); 
                    });
                });

            </script>

The Example HTML: Custom Field = 1 to 1 relationship (1 question 1 answer) - Multi Field = 1 to many relationship (1 question multiple answers)

<div class="row">
                <div class="col-lg-6">
                    <button type="button" class="btn em-bg-blue" id="add_field">Add Custom Field</button><br />
                    <div id="custom_fields" style="max-height: 500px; overflow-y: auto;"></div>
                </div>
                <div class="col-lg-6">
                    <button type="button" class="btn em-bg-blue" id="add_multi_field">Add Multi Field</button><br />
                    <div id="custom_multi_fields" style="max-height: 500px; overflow-y: auto;"></div>
                </div>
            </div>

Upvotes: 1

Alec
Alec

Reputation: 2752

Serialization is an alright method. Have a look at the jQuery library, or try to write a very simple PHP file that will serialize for you.

Upvotes: 0

Related Questions