1

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

我在这里有一个小提琴,用户可以在其中附加行并为每一行选择答案。要使用小提琴,请按照以下步骤操作:

  1. 当您打开小提琴时,单击“添加问题”按钮两次。这将在下面附加两行。
  2. 在第一行选择按钮 A 和 B 中,这些按钮将变为绿色,在下方您将看到这些选定按钮的文本输入值。
  3. 在第二行选择按钮 A、C 和 E,这些按钮将变为绿色,在下方您将看到这些选定按钮的文本输入值。

现在我想做的是,对于每一行中的每个答案,它们都将包含它自己的“AnswerId”,并且答案将被插入到“Answer”表的“Answer”列中。

以下是 jsfiddle 答案后的表格应该是什么样子:

答案表

AnswerId (auto)    Answer
5                   AB
6                   ACE

我在上表中遇到的唯一问题是它没有在“答案”列中插入答案。

然后我想将“答案”表中的“AnswerId”存储在“问题”表中。所以我附加了 2 行,“QuestionId”是 1 和 2,下面是“问题”表的样子:

问题表

QuestionId    AnswerId
1               5
2               6

上表工作正常。

以下是我收到的错误:

  • 注意:未定义的偏移量:0 在 /web/stud/QandATable3.php 的第 172 行

我的问题是,通过查看下面的代码,如何修复上述错误,以便能够在“答案”列下插入答案?

下面是 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

您将这些值作为一个数组发布,但它们不会是,var_dump 出 $_POST 值以查看它实际返回的内容。

作为记录,该代码绝对是一团糟。我不想在这里刻薄,但您的 JS 允许对同一个问题有多个答案。PHP中的选择完全是浪费,整个部分可以替换为:

$selected_answer = $_POST['value'];

无论如何,您正在运行选择以将变量设置为后值...

于 2012-10-10T16:45:31.497 回答
1

我在客户端和服务器端都看到了问题。我将首先解决客户端问题。

您创建的输入字段的名称格式为:value[answerXRow],其中X是选定的答案字符。如果用户在多个答案中选择了相同的字符,则会有多个同名的输入字段(例如value[answerARow],根据您的说明两个字段)。此外,您的 PHP 代码无法区分哪个value是针对哪个问题,因为它们都将在同一个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 回答