0

次の形式の多次元配列を使用したいと思います:value [n] []、ここでnは質問番号です。この新しい設定では、次のチェックボックスフィールドが表示されます。

<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][]">

選択した値はvalue属性にエンコードされていることに注意してください。name属性には、値が属する質問のみが含まれます。

したがって、上記の入力が述べているのはこれです:

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

これらの詳細を以下の「質問」および「回答」データベーステーブルに挿入したいと思います。

質問表:

SessionId    QuestionId

MUL             1
MUL             2

回答表:

 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

これらの値をデータベースに挿入するために、以下のmysqli / phpコードを書き込もうとしましたが、エラーが発生し、達成したいことを達成したくありませんでした。関連するテーブルに正しい値を正しく挿入できるようにするためのサポートが必要です。

以下はphp/mysqliコードです。

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();


}

}

}

以下のvar_dump($_POST)出力:

    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"
 } 
}

以下は、私が受け取っているエラーと、各エラーがリンクされているコード行です。

警告:252行目の/.../のforeach()に無効な引数が指定されました

foreach($value as $answer) {

警告:mysqli_stmt :: execute():( 23000/1062):242行目の/.../のキー「PRIMARY」のエントリ「MUL-0」が重複しています

上記のエラーは、質問番号が「0」として表示され続けるため、質問番号が挿入されていないことを示しています。

4

2 に答える 2

0

現在のコードはこれを生成します(不正な名前の属性に注意してください):

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

name属性は、質問で書いたvalue[answerF]ものの代わりであることに注意してください。value[1][]

JavaScriptを更新し、$newBtn行を次のように変更します。

    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');
于 2012-10-12T20:50:07.110 に答える
0

したがって、あなたがしようとしている主なことは、チェックボックスをスキンできないことを回避することです。私は前にこれをやったことがあります。私がやった方法は、非表示のチェックボックスに関連付けられたスパンを使用することでした。

フォームが送信されたときにフォームフィールドのボタンが値を投稿するかどうかわからないため、スパンを使用しました。スパンがそうではないことを私は知っています。これにより、「隠蔽」値ではなく、チェックボックス値のみが送信されることが保証されます。

jsFiddle のupdateAnswer()関数には、次のコードがあります。

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);
}

そのコードでnameは、チェックボックスの属性を のようなものに設定していますvalue[answerARow]。それがあなたの問題です。

TBH、あなたのコードに従うのはちょっと難しいので、私が思いついた解決策には、あなたの例で見逃したあらゆる種類の隠されたトリックを追加するために、おそらく微調整が必​​要になるでしょう. しかし、ここに私が思いついたものがあります:

jsフィドル

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>
于 2012-10-12T20:37:31.063 に答える