为什么我收到重复密钥警告

时间:2012-10-13 14:04:11

标签: php sql database mysqli

我在下面有一个“问题”数据库表:

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):重复条目'RZC-2'   对于第242行/../中的关键'PRIMARY'

     

警告:mysqli_stmt :: execute():( 23000/1062):重复条目'RZC-3'   对于第242行/../中的关键'PRIMARY'

为什么我在重复条目上收到错误,因为我已经声明在问题表中,“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();
}

更新:

DESCRIBE问题;

Field            Type          Null   Key  Default  Extra

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

3 个答案:

答案 0 :(得分: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次行。

答案 1 :(得分:0)

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

create table question (
sessionid char,
questionid int,
questioncontent varchar,
primary key(sessionid, questionid));

答案 2 :(得分: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()execute()语句