0

以下に、質問と回答を挿入するphpコードがあります。

<?php
var_dump($_POST);

// Prepare your statements ahead of time
$questionsql = 'INSERT INTO Question (SessionId, QuestionId, QuestionContent) VALUES (?, ?, ?)';
if (!$insert = $mysqli->prepare($questionsql)) {
    // Handle errors with prepare operation here
    echo __LINE__ . ': ' . $mysqli->error;
}

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

//make sure both prepared statements succeeded before proceeding
if ($insert && $insertanswer) {
    $sessid = $_SESSION['id'] . ($_SESSION['initial_count'] > 1 ? $_SESSION['sessionCount'] : '');
    $c = count($_POST['numQuestion']);

    for ($i = 0; $i < $c; $i++) {
        switch ($_POST['gridValues'][$i]) {
            case '3':
                $selected_option = 'A-C';
                break;

            case '4':
                $selected_option = 'A-D';
                break;

            case '5':
                $selected_option = 'A-E';
                break;

            default:
                $selected_option = '';
                break;
        }

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

            $insert->bind_param('sis', $sessid, $id, $_POST['questionText'][$i]);

            $insert->execute();

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

            $lastID = $insert->insert_id;

            foreach ($value as $answer) {
                $insertanswer->bind_param('sis', $sessid, $lastID, $answer);

                $insertanswer->execute();

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

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

問題はそれが私にこのエラーを与えているけれどもです:

警告:mysqli_stmt :: execute():( 23000/1062):92行目の/.../のキー「PRIMARY」のエントリ「RXT-1」が重複しています97:キー「PRIMARY」のエントリ「RXT-1」が重複しています

これで、「SessionId」と「QuestionId」の複合キーができましたが、以下がテーブルに表示されているため、問題はこれではないと思います。

質問表:

SessionId(PK)  QuestionId(PK)  QuestionContent
RZC            1               What is 2+2 and 3+3?
RZC            2               What is 2+2 and 3+3?

私が信じている問題は、質問1の同じ質問が両方のテーブル行に表示されていることです。質問2は別の質問にする必要があります(5+5と6+6とは何ですか?)

だから私の質問は、なぜそれが両方の行に同じ質問を表示するのか、そしてそれを修正するためにコードを変更するにはどうすればよいのかということです。

以下は、var_dump($ _ POST)が表示しているものです。この問題に関連するものは["numQuestion"] and ["questionText"]です。

array(8) {
    ["numberAnswer"]=> array(2) {
        [0]=> string(1) "2"
        [1]=> string(1) "3"
    }
    ["numQuestion"]=> array(2) {
        [0]=> string(1) "1"
        [1]=> string(1) "2"
    }
    ["questionText"]=> array(2) {
        [0]=> string(20) "What is 2+2 and 3+3?"
        [1]=> string(41) "Which three items will you find in a car?"
    }
    ["gridValues"]=> array(2) {
        [0]=> string(1) "4"
        [1]=> string(2) "10"
    }
    ["reply"]=> array(2) {
        [0]=> string(8) "multiple"
        [1]=> string(8) "multiple"
    }
    ["textWeight"]=> array(2) {
        [0]=> string(1) "5"
        [1]=> string(1) "5"
    }
    ["submitDetails"]=> string(14) "Submit Details" 
    ["value"]=> array(2) {
        [1]=> array(2) {
            [0]=> string(1) "A"
            [1]=> string(1) "C"
        }
        [2]=> array(3) {
            [0]=> string(1) "A"
            [1]=> string(1) "B"
            [2]=> string(1) "D"
        } 
    } 
}
4

1 に答える 1

0

最初に質問を挿入し、その後すべての回答を挿入する場合は、質問クエリを回答挿入ループ内に配置しないでください。そうしないと、見つかったすべての回答に対して実行されますが、変更されません。

悪い:

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

        $insert->bind_param('sis', $sessid, $id, $_POST['questionText'][$i]);

        $insert->execute();

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

より良い:

    $insert->bind_param('sis', $sessid, $id, $_POST['questionText'][$i]);

    $insert->execute();

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

    $results = $_POST['value'];
    foreach ($results as $id => $value) {
        $answer = $value;
于 2012-10-14T23:01:40.770 に答える