如何在“答案”表中插入答案

时间:2012-10-10 16:35:49

标签: php mysqli

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

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

  1. 当您打开小提琴时,请单击“添加问题”按钮 两次。这将在下面添加两行。
  2. 在第一行选择按钮A和B中,这些按钮将变为绿色 在下面,您将看到所选文本输入值 的按钮。
  3. 在第二行选择按钮A,C和E中,这些按钮将会转动 绿色,在下面你会看到这些的文本输入值 选定的按钮。
  4. 现在我要做的是,对于每一行中的每个答案,它们将包含它自己的“AnswerId”,答案将被插入“答案”表中的“答案”栏。

    以下是jsfiddle答案后的表格:

    答案表

    AnswerId (auto)    Answer
    5                   AB
    6                   ACE
    

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

    然后我想从“问题”表中的“答案”表中存储“AnswerId”。因此,我添加了2行,“QuestionId”为1和2,以下是“问题”表的外观:

    问题表

    QuestionId    AnswerId
    1               5
    2               6
    

    上表工作正常。

    以下是我收到的错误:

    • 注意:第172行/web/stud/QandATable3.php中未定义的偏移量: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);
    

2 个答案:

答案 0 :(得分:1)

你正在把这些值当作一个数组发布而不是,var_dump out $ _POST值来看看它实际返回的是什么。

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

$selected_answer = $_POST['value'];

您正在运行一个选择以将变量设置为post值...

答案 1 :(得分: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
    // ...
}