我在下面有一个“问题”数据库表:
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
答案 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();
}
您循环并多次执行相同的值。需要在循环内设置新的$id
或$sessid
- 或者你应该完全取消循环。
您应该在循环外部设置SQL和Prepare语句 - 它们不会更改,并且您违背了prepare语句的目的。我的猜测是你错放了你的循环,只需要绕过bind_param()
和execute()
语句