1

JSfiddle: http://jsfiddle.net/ybZvv/57/

ここには、ユーザーが行を追加して各行の回答を選択できるフィドルがあります。フィドルを使用するには、次の手順に従ってください。

  1. フィドルを開いたときに、[質問を追加] ボタンを 2 回クリックします。これにより、下に 2 つの行が追加されます。
  2. 最初の行の選択ボタン A と B では、これらのボタンが緑色に変わり、選択したボタンのテキスト入力値が下に表示されます。
  3. 2 行目の選択ボタン A、C、および E では、これらのボタンが緑色に変わり、選択したボタンのテキスト入力値が下に表示されます。

ここでやりたいことは、各行の各回答に対して、独自の「AnswerId」が含まれ、回答が「回答」テーブルの「回答」列に挿入されることです。

以下は、jsfiddle の回答に従ってテーブルがどのように見えるかです。

回答表

AnswerId (auto)    Answer
5                   AB
6                   ACE

上記の表で得られる唯一の問題は、「回答」列の下に回答が挿入されていないことです。

次に、「Answer」テーブルの「AnswerId」を「Question」テーブルに格納します。したがって、2 つの行を追加したため、「QuestionId」は 1 と 2 であり、「Question」テーブルは次のようになります。

質問表

QuestionId    AnswerId
1               5
2               6

上記の表は正常に動作しています。

以下は私が受け取っているエラーです:

  • Notice: 未定義のオフセット: /web/stud/QandATable3.php の 172 行目で 0

私の質問は、以下のコードを見て、「回答」列の下に回答を挿入できるように上記のエラーをどのように修正できるかということです。

以下はphp/mysqliコードです(エラーが発生している行をコメントしました):

    $i = 0;
    $c = count($_POST['gridValues']); //Counts each appended row which works

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

 $selected_answer = $_POST['value'];


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

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

        $insertanswer->bind_param("s", $selected_answer);

            $insertanswer->execute();

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

            $insertanswer->close();

            $lastID = $mysqli->insert_id;

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


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

    $insert->bind_param("ii", $_POST['numQuestion'][$i],  $lastID);

            $insert->execute();

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

            $insert->close();

    }

    ?>

以下は、各行に問題番号を正常に追加するコードです。

var qnum = 1;

var $qid = $("<td class='qid'></td>").text(qnum);

          $('.num_questions').each( function() {

    var $this = $(this);

     var $questionNumber = $("<input type='hidden' class='num_questionsRow'>").attr('name',$this.attr('name')+"[]")
                   .attr('value',$this.val());

     $qid.append($questionNumber);                             

    ++qnum;    
    $(".questionNum").text(qnum);
    $(".num_questions").val(qnum);

 $tr.append($qid);
4

2 に答える 2

1

配列として投稿されているような値を取得していますが、そうではありません。 $_POST 値を var_dump して、実際に返されているものを確認します。

記録のために、そのコードは完全に混乱しています。ここで意地悪をするつもりはありませんが、JS では同じ質問に対して複数の回答が許可されています。PHP の select は完全に無駄であり、そのセクション全体を次のように置き換えることができます。

$selected_answer = $_POST['value'];

とにかく変数を投稿値に設定するために選択を実行しています...

于 2012-10-10T16:45:31.497 に答える
1

クライアント側とサーバー側の両方で問題が発生しています。まず、クライアント側の問題に対処します。

作成する入力フィールドには、次の形式の名前が付いています。value[answerXRow]ここXで、 は選択した回答文字です。ユーザーが複数の回答で同じ文字を選択すると、同じ名前の複数の入力フィールドが表示されます (たとえばvalue[answerARow]、指示に基づく 2 つのフィールド)。さらに、それらはすべて同じ配列valueで送信されるため、どちらがどの質問に対するものであるかをPHP コードで区別する方法はありません。value

私の提案は、この形式で多次元配列を使用することです: value[n][]、ここnで質問番号です。この新しいセットアップでは、次の入力フィールドになるはずです。

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

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

$_POST['value']サーバー側では、配列を反復処理する必要があります。

// $questionNumber is simply n in value[n][]
// $answers is an array of value attributes from <input>s for this question

foreach ($_POST['value'] as $questionNumber => $answers) {
    // combine all the answers into a single string (e.g. ACE)
    $selected_answer = implode('', $answers);

    // continue onto inserting rows into the Answer and Questions tables
    // ...
}
于 2012-10-10T17:23:55.380 に答える