我有一个MySQL表,其中有一列将AUTO_INCREMENT
,另一列用于存储用户提交的数据,另一列则默认为CURRENT_TIMESTAMP
。
我的INSERT
查询是:
$query = $db->prepare("INSERT IGNORE INTO `UserData` (`user_data`) VALUES(?)");
$query->bind_param('s', $commentdata);
$query->execute();
但是它仍然插入重复值(如果用户多次单击提交)。防止这种情况的最佳方法是什么?
答案 0 :(得分:2)
MySQL不会创建重复的自动增量ID(除非你的群集配置非常糟糕),所以你所引用的重复项可能属于不同的属性 - 你只告诉我们有关user_data的信息。
如果您不想在那里重复,那么在列上添加唯一索引。您还应该添加错误处理以在出现情况时处理故障并删除“IGNORE”。
然而,您还需要考虑您的控制逻辑(这暗示您可能有csrf漏洞)和您的用户界面(为什么您允许用户两次提交相同的表单?)
答案 1 :(得分:0)
防止MySQL表中重复值的最佳方法是使表定义使用UNIQUE
或PRIMARY
约束。请参阅the documentation for table creation syntax。
如果您打算使用该值执行查找,您可能还希望该值为KEY
。
答案 2 :(得分:0)
我最终使用了以下查询:
INSERT INTO `UserData` (`post_num`, `user_data`)
SELECT ?, ? FROM `UserData`
WHERE NOT EXISTS (
SELECT * FROM `UserData` WHERE `post_num`= ? AND `user_data`=?
) LIMIT 1
然后我$query->bind_param('isis', $post_number, $comment, $post_number, $comment);
绑定值。
这将检查以确保帖子上没有重复的评论。
请注意,我的实际示例会插入更多信息,例如用户信息,并检查以确保特定帖子上的某个用户没有重复的评论。