-8

データベースに各質問の各回答を挿入しようとしています。問題は、質問に回答がない可能性があることです。そのため、以下のコードを試しましたが、質問に回答がない場合は db 行を挿入しません。私がしようとしていたのは、回答がない場合は、その質問の列の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 ダンプです。ここで、質問 1 を回答BありC、質問 2 を回答なし、質問 3 を回答Bあり、質問 4 を回答なしに設定すると、var ダンプから次のように出力されます。

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 ダンプはこれを var ダンプに表示します。

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行と状態を挿入しないことNo Answerです。私の質問はNo Answer、これらの質問で回答が選択されていないデータベースに for each の質問を含める方法です。

4

2 に答える 2

4

Answer答えがないときは、テーブルに何も挿入しないでください。残りのソリューションは基本的に正しいです。

回答付きの質問を表示する場合、表示する回答 (空の選択結果または左結合列の null) があるかどうかを確認し、ない場合は「回答なし」を表示します。しかし、データベースには「無回答」はありません。

于 2013-02-05T02:57:18.990 に答える
1

コードが に到達すると$results = $_POST['value'];$question_ids表に含める必要がある質問の ID が取り込まれます。

私の提案は、関連する質問への最初の回答を含めた直後に、この配列から要素を削除することです。このようにして、foreach($results as $id => $value)ループの後、この配列には明示的な回答のない質問のみが含まれます。次のステップは、これらの疑似回答「No answer」を DB に含めることです。

関連するコード (挿入された行は //* コメントされています):

$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();

ここで注意すべき重要な点が 1 つあります。array_splice は、大きな配列 (>100 要素) の場合、PHP で非常に遅くなります。しかし、ここではそうではないと思います。

于 2013-02-05T02:44:28.603 に答える