错误:键'r_id'的条目重复'1'

时间:2013-04-07 10:41:40

标签: php mysql duplicates

这是表结构

CREATE TABLE IF NOT EXISTS `result` (
`res_id` int(11) NOT NULL AUTO_INCREMENT,
`s_id` int(10) NOT NULL,
`i_id` int(6) NOT NULL,
`r_status` text NOT NULL,
`r_score` decimal(6,0) NOT NULL,
PRIMARY KEY (`res_id`)
) ENGINE=InnoDB  DEFAULT CHARSET=latin1 AUTO_INCREMENT=2 ;

我已经搜索了一个解决方案,并尝试过不同的场合,从头开始构建表,删除并重新导入,检查索引。正如您所看到的,我已将id重命名为res_id,但是当我在浏览器上运行它时,错误仍然显示为r_id。

如果它有所不同,当id未设置为自动递增时,会弹出相同的错误。

以下是我要插入数据库的页面的代码段。

//retrieve existing r_id
$sql_res = "SELECT res_id FROM result ORDER BY res_id DESC LIMIT 1";
$query_res = mysql_query($sql_res) or die("MySQL Error: " . mysql_error());
$data_res = mysql_fetch_assoc($query_res);
$resid_count = $data_res['res_id']+1;
//echo "<br>Result: " . $resid_count;

// insert result to table
$sql_result = "INSERT INTO result (res_id, r_score, s_id, i_id) VALUES ('" . $resid_count . "', '" . $correct . "',  '" . $id . "',  '" . $ins_id . "')";
mysql_query($sql_result) or die ("Error: " . mysql_error());
编辑:我改变了你们建议的代码。从INSERT中取出res_id。它仍然表示 r_id 的重复输入。我继续进行试验和错误,并创建了另一个具有相同结构的表'得分'来替换'结果'。想知道相同的表名是否给它带来问题(可能多次运行该页导致这个?)。与得分表相同的结果。

非常感谢任何帮助。我被困在这里,不能继续我的项目。感谢。

Atikah

3 个答案:

答案 0 :(得分:2)

由于res_idAUTO_INCREMENT,我建议您替换插入查询:

$sql_result = "INSERT INTO result (r_score, s_id, i_id) VALUES ('". $correct . "',  '" . $id . "',  '" . $ins_id . "')";

答案 1 :(得分:1)

试试这个

   $sql_result = "INSERT INTO result ( r_score, s_id, i_id) VALUES ( '" . $correct . "',  '" . $id . "',  '" . $ins_id . "')";

res_id将自动插入,无需插入

EDIT。

如果您只想插入,那么您不需要这些线条,只需删除它们,因为您正在使用它们来了解最后一个res_id。因为res_id就像我在auto_increment之前所说的那样。它会自动增加

   $sql_res = "SELECT res_id FROM result ORDER BY res_id DESC LIMIT 1";
   $query_res = mysql_query($sql_res) or die("MySQL Error: " . mysql_error());
   $data_res = mysql_fetch_assoc($query_res);
   $resid_count = $data_res['res_id']+1;

答案 2 :(得分:0)

确保在使用数字(int)的SQL中不使用撇号。这可能会带来麻烦。并且res_id根本不应该涉及,因为这是自动增量列的重点(你没有用PHP代码搜索数据库中的下一个id,DB负责这个)

您的代码可以翻译成两行:

$sql_result = "INSERT INTO result (r_score, s_id, i_id) VALUES (" . $correct . ",  " . $id . ",  " . $ins_id . ")";
mysql_query($sql_result) or die ("Error: " . mysql_error());

OR (引号内的变量给出实际值)

$sql_result = "INSERT INTO result (r_score, s_id, i_id) VALUES ($correct, $id, $ins_id)";
mysql_query($sql_result) or die ("Error: " . mysql_error());

当然 - 不要使用mysql_ * - 函数,因为它们已被弃用。使用PDO或Mysqli代替参数,这样可以安全地避免SQL注入。您获得的代码很容易受到SQL注入。