MySQL插入唯一值

时间:2017-05-18 22:08:28

标签: php mysql forms

我有一个MySQL表,其中有一列将AUTO_INCREMENT,另一列用于存储用户提交的数据,另一列则默认为CURRENT_TIMESTAMP

我的INSERT查询是:

$query = $db->prepare("INSERT IGNORE INTO `UserData` (`user_data`) VALUES(?)");
$query->bind_param('s', $commentdata);
$query->execute();

但是它仍然插入重复值(如果用户多次单击提交)。防止这种情况的最佳方法是什么?

3 个答案:

答案 0 :(得分:2)

MySQL不会创建重复的自动增量ID(除非你的群集配置非常糟糕),所以你所引用的重复项可能属于不同的属性 - 你只告诉我们有关user_data的信息。

如果您不想在那里重复,那么在列上添加唯一索引。您还应该添加错误处理以在出现情况时处理故障并删除“IGNORE”。

然而,您还需要考虑您的控制逻辑(这暗示您可能有csrf漏洞)和您的用户界面(为什么您允许用户两次提交相同的表单?)

答案 1 :(得分:0)

防止MySQL表中重复值的最佳方法是使表定义使用UNIQUEPRIMARY约束。请参阅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);绑定值。

这将检查以确保帖子上没有重复的评论。

请注意,我的实际示例会插入更多信息,例如用户信息,并检查以确保特定帖子上的某个用户没有重复的评论。