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 语句来提及它们都是复合键?

下面是将值插入“问题”表的 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();
}

更新:

描述问题;

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

在create table语句中,需要声明复合主键:

create table question (
sessionid char,
questionid int,
questioncontent varchar,
primary key(sessionid, questionid));
于 2012-10-13T14:36:33.793 回答
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 回答