-8

我正在尝试为数据库中的每个问题插入每个答案。问题是问题可能没有答案,所以我尝试了下面的代码,但如果问题没有答案,它不会插入数据库行,我想做的是,如果没有答案,则显示该问题列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');

下面是表的 SHOW CREATE TABLE 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 dump,如果我将问题 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 中输出这组答案。但不会No Answer针对问题 2 和 4 发布。

如果所有问题都有这样的答案L

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

然后 var dump 在 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" 
} }} 

正如您所看到的,每个问题都插入了相关答案。所以问题是如果问题没有答案,它不会插入 db row 和 state No Answer。我的问题是如何为No Answer数据库中没有在这些问题中选择答案的每个问题包含一个?

4

2 回答 2

4

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

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

于 2013-02-05T02:57:18.990 回答
1

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

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

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

$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 中非常慢。但我不认为这里是这种情况。

于 2013-02-05T02:44:28.603 回答