How to post and insert values into the database co

2019-08-30 00:02发布

问题:

I want use a multi-dimensional array in this format: value[n][], where n is the question number. With this new setup, you should end up with the following checkbox fields:

<input type="checkbox" value="A" name="value[1][]">
<input type="checkbox" value="B" name="value[1][]">
<input type="checkbox" value="A" name="value[2][]">
<input type="checkbox" value="C" name="value[2][]">
<input type="checkbox" value="E" name="value[2][]">

Note that the selected value is encoded in the value attribute. The name attribute only contains the question to which the value belongs.

So what the above inputs are stating is this:

question 1: answer: A
question 1: answer: B
question 2: answer: A
question 2: answer: C
question 2: answer: E

I want to insert these details into "Question" and "Answer" database tables below:

Question Table:

SessionId    QuestionId

MUL             1
MUL             2

Answer Table:

 AnswerId (auto)  SessionId  QuestionId   Answer
 1                MUL        1            A
 2                MUL        1            B
 3                MUL        2            A
 4                MUL        2            C
 5                MUL        2            E

Now I have attempted writing the mysqli/php code below to insert these values into the database but I am receiving errors and failing badly in wanting to acheive what I want to achieve. I need help being able to correctly insert the correct values in the relevant tables.

Below is the php/mysqli code:

var_dump($_POST);  

$i = 0;
$c = count($_POST['numQuestion']);

for($i = 0;  $i < $c; $i++ ){

/*
    switch ($_POST['gridValues'][$i]){

    case "3": 
    $selected_option = "A-C";
    break;

    case "4": 
    $selected_option = "A-D";
    break;

    case "5": 
    $selected_option = "A-E";
    break;

    default:
    $selected_option = "";
    break;

    }   

    */ needed later on when I insert grid values   



$results = $_POST['value'];
foreach($results as $id => $value) {
$answer = $value;

 $questionsql = "INSERT INTO Question (SessionId, QuestionId) 
    VALUES (?, ?)";

    $sessid =  $_SESSION['id'] . ($_SESSION['initial_count'] > 1 ? $_SESSION['sessionCount'] : '');


    if (!$insert = $mysqli->prepare($questionsql)) {
      // Handle errors with prepare operation here
    }

$insert->bind_param("si", $sessid, $id);

        $insert->execute();

        if ($insert->errno) {
          // Handle query error here
        }

        $insert->close();

        $insert->insert_id;

        foreach($value as $answer) {

         $answersql = "INSERT INTO Answer (SessionId, QuestionId, Answer) 
    VALUES (?, ?, ?)";

      if (!$insertanswer = $mysqli->prepare($answersql)) {
      // Handle errors with prepare operation here
    }  

    $insertanswer->bind_param("sis" $sessid, $lastID, $answer);

        $insertanswer->execute();

        if ($insertanswer->errno) {
          // Handle query error here
        }

        $insertanswer->close();


}

}

}

The var_dump($_POST) outputs this below:

    array(3) { 
["numQuestion"]=> array(2) { 
[0]=> string(1) "1" 
[1]=> string(1) "2" 
}  
["submitDetails"]=> string(14) "Submit Details" ["value"]=> array(4) { 
["answerARow"]=> string(2) "on" 
["answerCRow"]=> string(2) "on" 
["answerBRow"]=> string(2) "on" ["answerERow"]=> string(2) "on"
 } 
}

Below are the errors I am receiving and the line of code each error is linked to:

Warning: Invalid argument supplied for foreach() in /.../ on line 252

foreach($value as $answer) {

Warning: mysqli_stmt::execute(): (23000/1062): Duplicate entry 'MUL-0' for key 'PRIMARY' in /.../ on line 242

The above error shows that no question number is being inserted as it keeps displaying it as '0'

回答1:

Your current code generates this (note the bad name attribute):

<input type="button" onclick="btnclick(this, 1);" style="display:inline-block;" class="answerBtns answers answerBtnsOff" name="value[answerF]" value="F" id="answerHRow">

Note that the name attribute is value[answerF] instead of the value[1][] as you wrote in your question.

Update your javascript and change the $newBtn line to:

    var $newBtn = $(("<input class='answerBtnsRow answers' type='button' style='display:%s;' onclick='btnclick(this, " + gQuestionIndex + ");' />").replace('%s', $this.is(':visible') ? 'inline-block' : 'none')).attr('name', "value[" + gQuestionIndex + "][]").attr('value', $this.val()).attr('class', $this.attr('class')).attr('id', $this.attr('id') + 'Row');


回答2:

So it looks like the main thing you're trying to do is to get around the inability to skin checkboxes. I have done this before. The way I did it was with using a span tied to a hidden checkbox.

I used spans because I'm not sure if a button in a form field will post a value when the form is submitted. I know that a span will not. This guarantees that only your checkbox value will be submitted, and not the "cover-up" value.

In your jsFiddle, in the updateAnswer() function, you have this code:

if (!bDisableAppend) {
    // append those values to the form
    var input = '<input type="checkbox" id="' + hid + '" name="value[' + id + ']" checked /><label for="' + hid + '">' + value + '</label>';
    _oCurrAnswerContainer.append(input);
}

In that code, you are setting the name attribute of the checkbox to something like value[answerARow]. That is where your problem is.

TBH, it's kinda hard for me to follow your code, so the solution I came up with will probably need some tweaking to add whatever kind of hidden trickery I missed in your example. But here is what I came up with:

jsFiddle

JS/jQuery:

var options = ["A", "B", "C", "D", "E", "F", "G", "H"];


// this will bind the event handler to the document element, so that even when a new element is created,
// the event will be automatically bound to it.
$(document).on("click", "span.checkbox", function() {
    $("#chk"+ $(this).attr("id")).click();
    $(this).toggleClass("unselected selected");
});


$("#btnAddQuestion").click(function() {
    var questionNum = $("#tblQuestions tbody tr").length+1;

    var cell = $(document.createElement("td")).addClass("optAns").html("Answer:<br />");

    // loop through the options and add them to the cell
    for (var i in options)    
    {
        $(cell).append(
            // the front-end overlay for the checkbox
            $(document.createElement("span"))
                .addClass("checkbox unselected")
                .attr("id", "Value"+ questionNum + options[i])
                .html(options[i])
        ).append(
            // the hidden checkbox that will post the actual value
            $(document.createElement("input"))
                .attr("type", "checkbox")
                .addClass("hidden")
                .attr("id", "chkValue"+ questionNum + options[i])
                .attr("name", "value["+ questionNum +"][]")
                .attr("value", options[i])
        );
    }

    // create a new table row, append the "option and answer" cell
    // and question number cell, and append it to the table body
    $(document.createElement("tr"))
        .append(cell)
        .append($(document.createElement("td")).addClass("questionNum").html(questionNum))
        .appendTo("#tblQuestions tbody");
});

HTML:

<div id="detailsBlock">
    <button id="btnAddQuestion">Add Question</button>
</div>
<hr />
<div id="details">
    <table id="tblQuestions">
        <thead>
            <tr>
                <th>Option and Answer</th>
                <th>Question No</th>
            </tr>
        </thead>
        <tbody>
        </tbody>
    </table>
</div>