Php MySQL插入唯一值
我有一个MySQL表,它有一列将Php MySQL插入唯一值,php,mysql,forms,Php,Mysql,Forms,我有一个MySQL表,它有一列将自动递增,另一列存储用户提交的数据,另一列默认为当前时间戳 我的INSERT查询是: $query = $db->prepare("INSERT IGNORE INTO `UserData` (`user_data`) VALUES(?)"); $query->bind_param('s', $commentdata); $query->execute(); 但是,它仍在插入重复的值(如果用户多次单击提交)。防止出现这种情况的最佳方法是什么?防
自动递增
,另一列存储用户提交的数据,另一列默认为当前时间戳
我的INSERT
查询是:
$query = $db->prepare("INSERT IGNORE INTO `UserData` (`user_data`) VALUES(?)");
$query->bind_param('s', $commentdata);
$query->execute();
但是,它仍在插入重复的值(如果用户多次单击提交)。防止出现这种情况的最佳方法是什么?防止MySQL表中出现重复值的最佳方法是让表定义使用
UNIQUE
或PRIMARY
约束。看
如果计划使用该值执行查找,您可能还希望该值为
键。防止MySQL表中出现重复值的最佳方法是让表定义使用唯一的
或主
约束。看
如果您计划使用该值执行查找,您可能还希望该值是一个键。MySQL不会创建重复的自动增量ID(除非您有一个配置非常糟糕的集群),因此您引用的重复项可能位于不同的属性中-您只告诉了我们用户数据
如果不想在其中重复,请在列上添加唯一索引。您还应该添加错误处理,以在出现这种情况时处理失败,并删除“忽略”
但是,您还需要考虑您的控制逻辑(这暗示您可能存在csrf漏洞)和您的用户界面(为什么允许用户提交相同的表单两次?MySQL不会创建重复的自动增量ID(除非您的群集配置非常糟糕)因此,您引用的副本可能位于不同的属性中-您只告诉我们有关用户_数据的信息
如果不想在其中重复,请在列上添加唯一索引。您还应该添加错误处理,以在出现这种情况时处理失败,并删除“忽略”
但是,您还需要考虑您的控制逻辑(这暗示您可能存在csrf漏洞)和您的用户界面(为什么您允许用户提交相同的表单两次?我最后使用了以下查询:
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_参数('isis',$post_number,$comment,$post_number,$comment)代码>以绑定值
这将检查以确保帖子上没有重复的评论
请注意,我的实际示例插入了更多信息,如用户信息,我检查以确保某个用户在特定帖子上没有重复的评论。我最后使用了以下查询:
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_参数('isis',$post_number,$comment,$post_number,$comment)代码>以绑定值
这将检查以确保帖子上没有重复的评论
请注意,我的实际示例会插入更多信息,例如用户信息,我会检查以确保某个用户在特定帖子上没有重复的评论。表def是?如果让用户插入他想要的任何值,您将得到重复的错误!。您的意思是要为每次单击生成随机唯一值吗?从“用户体验”的角度来看,“最好的方法”不是使用忽略
,而是在每次插入前检查数据库中是否已经存在条目,并告诉用户是否存在。您的绑定参数
调用是错误的sss
表示有3个参数被绑定,但您在查询中只有1个参数。@Barmar:您是对的。在泛化此查询时忘记删除其他表值。而表定义是?如果让用户插入他想要的任何值,则会出现重复错误!。您的意思是要为每次单击生成随机唯一值吗?从“用户体验”的角度来看,“最好的方法”不是使用忽略
,而是在每次插入前检查数据库中是否已经存在条目,并告诉用户是否存在。您的绑定参数
调用是错误的sss
表示有3个参数被绑定,但您在查询中只有1个参数。@Barmar:您是对的。在泛化此查询时忘记删除其他表值。可能是用户双击了“提交”按钮。可能是用户双击了“提交”按钮。