如果没有答案,如何插入数据库行

时间:2013-01-29 19:07:49

标签: php jquery mysqli

我正在尝试为数据库中的每个问题插入每个答案。问题是有可能一个问题可能没有答案,所以我尝试了下面的代码,但是如果一个问题没有答案就不插入数据库行,我试图做的是如果没有答案那么显示针对该问题的No Answer列下的字符串Answer

 $answersql = "INSERT INTO Answer (QuestionId, Answer) 
    VALUES (?, ?)";
if (!$insertanswer = $mysqli->prepare($answersql)) {
    // Handle errors with prepare operation here
    echo __LINE__.': '.$mysqli->error;
}

if( $insert && $insertanswer)
{

    $c = count($_POST['numQuestion']);
    $question_ids = array();

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

... //Question INSERT goes here

        $questionId = $mysqli->insert_id;

            $question_ids[$questionNo] = $questionId;

}

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

            $quesid = (int)$question_ids[$id];   

            foreach($value as $answer) 
            {

            if($answer == '' || $answer === null){
                $answer = 'No Answer';
            }

                $insertanswer->bind_param("is", $quesid, $answer);

                $insertanswer->execute();

                if ($insertanswer->errno) {
                    // Handle query error here
                    echo __LINE__.': '.$insertanswer->error;
                    break 7;
                }
            }
        }


    //close your statements at the end


    $insertanswer->close();

}

['value']来自输入:

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

以下是Answer表的

CREATE TABLE `Answer` (
 `AnswerId` int(10) NOT NULL AUTO_INCREMENT,
 `QuestionId` int(10) NOT NULL,
 `Answer` varchar(10) DEFAULT NULL,
 PRIMARY KEY (`AnswerId`)
) ENGINE=InnoDB AUTO_INCREMENT=280 DEFAULT CHARSET=utf8

下面是一个var转储,如果我将问题1设置为答案BC,问题2设置为没有答案,问题3设置为答案B和问题4没有答案,它从var dump输出以下内容:

var_dump($question_ids);
    var_dump($results);


array(4) { 
[1]=> int(265) 
[2]=> int(266) 
[3]=> int(267) 
[4]=> int(268) 
} 
[1]=> array(2) { 
[0]=> string(1) "B" 
[1]=> string(1) "C" 
} 
[3]=> array(1) { 
[0]=> string(1) "B" 
} 

因此,它会在问题1和3中输出这些答案。但是不会在问题2和4上发布No Answer

如果所有问题都有答案,那么

question 1: B C
question 2: A
question 3: B
question 4: A C

然后var转储在var dump:

中显示
array(4) { 
[1]=> int(277) 
[2]=> int(278) 
[3]=> int(279) 
[4]=> int(280) 
} 
array(4) { 
[1]=> array(2) { 
[0]=> string(1) "B" 
[1]=> string(1) "C" } 
[2]=> array(1) { 
[0]=> string(1) "A" 
} 
[3]=> array(1) 
{ 
[0]=> string(1) "B" 
} 
[4]=> array(2) 
{ 
[0]=> string(1) "A" 
[1]=> string(1) "C" 
} }} 

正如您所看到的,每个问题都会插入相关答案。因此,如果问题没有答案,则表示不插入数据库行和状态No Answer。我的问题是如何在数据库中为每个问题都包含No Answer,而这些问题中没有选择答案?

2 个答案:

答案 0 :(得分:4)

当没有答案时,根本不要在Answer表中插入任何内容。其余的解决方案基本上是正确的。

当显示带答案的问题时,检查是否有答案(空选择结果或左连接列中为空)以显示,如果没有,则显示“无答案”。但是数据库中没有“没有答案”。

答案 1 :(得分:1)

当您的代码到达$results = $_POST['value'];时,$question_ids会填充必须包含在表格中的问题ID。

我的建议是在包含相关问题的第一个答案后立即从此数组中删除元素。这样,在foreach($results as $id => $value)循环之后,此数组将仅包含没有明确答案的问题。下一步就是在数据库中包含这些伪答案“无答案”。

您的相关代码(插入的行是// *注释):

$notAnswered = $question_ids; //* Make a copy
$results = $_POST['value'];
foreach ($results as $id => $value) {
    $answer = $value;
    $quesid = (int)$question_ids[$id];
    $pos = array_search($quesid, $notAnswered); //* Search for it
    if ($pos !== false) //* It's in the array
        array_splice($notAnswered, $pos, 1); //* Delete it from the array
    foreach ($value as $answer) {
        $insertanswer->bind_param("is", $quesid, $answer);
        $insertanswer->execute();

        if ($insertanswer->errno) {
            // Handle query error here
            echo __LINE__.': '.$insertanswer->error;
            break 7;
        }
    }
}

//* Insert 'No Answer' for each question not answered
foreach ($notAnswered as $id) {
    $insertanswer->bind_param('is', $id, 'No Answer');
    $insertanswer->execute();
    if ($insertanswer->errno) {
        // Handle query error here
        echo __LINE__.': '.$insertanswer->error;
        break 7;
    }
}

// Close your statements at the end
$insertanswer->close();

这里需要注意的一件重要事情:对于大型数组(> 100个元素),array_splice在PHP中非常慢。但我认为这不是这种情况。