1

以下に「質問」データベーステーブルがあります。

SessionId (PK)    QuestionId (PK)  QuestionContent

MUL                    1           What is 2+2 and 3+3?
MUL                    2           Name three things you will find in a car?
MUL                    3           What are the four seasons? 

以下は、mysqliで受け取ったエラーです。

242行目の/.../のキー「PRIMARY」の重複エントリ「RZC-1」

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

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

質問テーブルで「SessionId」と「QuestionId」の両方が主キーであると述べたのに、重複したエントリでエラーが発生するのはなぜですか。両方とも複合キーであることを示すためにSQLステートメントを実行する必要がありますか?

以下は、「Question」テーブルに値を挿入するmysqliコードです。

    var_dump($_POST);  

    $i = 0;
    $c = count($_POST['numQuestion']);

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

     $questionsql = "INSERT INTO Question (SessionId, QuestionId, QuestionContent) 
        VALUES (?, ?, ?)";

        $sessid =  $_SESSION['id'] . ($_SESSION['initial_count'] > 1 ? $_SESSION['sessionCount'] : '');


        if (!$insert = $mysqli->prepare($questionsql)) {
          // Handle errors with prepare operation here
        }

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

            $insert->execute();

            if ($insert->errno) {
              // Handle query error here
            }

            $insert->close();
}

アップデート:

DESCRIBE質問;

Field            Type          Null   Key  Default  Extra

SessionId        varchar(10)   NO     PRI  NULL
QuestionId       int(10)       NO     PRI  NULL
QuestionContent  varchar(5000) NO          NULL
4

3 に答える 3

1
$i = 0;
$c = count($_POST['numQuestion']);

for($i = 0;  $i < $c; $i++ ){
.....
$insert->bind_param("sis", $sessid, $id, $_POST['questionText'][$i]);

同じ$sessidに対して、$idは$c回の行をループに挿入しているように見えます。

于 2012-10-13T15:41:31.580 に答える
0
for($i = 0;  $i < $c; $i++ ){
    $questionsql = "INSERT INTO Question (SessionId, QuestionId, QuestionContent) 
                    VALUES (?, ?, ?)";

    $sessid =  $_SESSION['id'] . ($_SESSION['initial_count'] > 1 ? $_SESSION['sessionCount'] : '');

    if (!$insert = $mysqli->prepare($questionsql)) {
      // Handle errors with prepare operation here
    }

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

    if ($insert->errno) {
       // Handle query error here
    }

    $insert->close();
}

2つの問題:

  1. 同じ値を複数回ループして実行しています。新しい$id$sessid、ループ内に設定する必要があります。または、ループを完全に削除する必要があります。

  2. SQLとPrepareステートメントをループの外側に設定する必要があります。これらは変更されず、prepareステートメントの目的に反します。私の推測では、ループを置き忘れて、bind_param()andexecute()ステートメントをループするだけで済みます

于 2012-10-13T15:50:28.170 に答える
0

create tableステートメントで、複合主キーを宣言する必要があります。

create table question (
sessionid char,
questionid int,
questioncontent varchar,
primary key(sessionid, questionid));
于 2012-10-13T14:36:33.793 に答える