PHP SQL防止重复的用户名:捕获异常与选择查询

时间:2013-07-01 19:52:03

标签: php mysql database duplicates

为防止重复的用户名被输入数据库并通知用户,插入或选择查询之前使用异常捕获更标准/首选吗?

  1. 异常捕获:如果我尝试插入用户输入并且用户名已存在,那么SQL数据库将抛出主键约束违例异常。如果发生这种情况我会抓住它并做任何事情。

  2. 选择查询:如果它返回任何与用户名匹配的元组,那么我就不会打扰插入了。然后我可以显示错误消息。

  3. 我想在这里使用Exceptions的主要优点是查询和行数较少(速度更快?)。但是,我不认为这是一个例外情况,因为重复可能经常发生。

4 个答案:

答案 0 :(得分:4)

至少,您应该使用选项1 - 处理主键约束违规 - 如果可能,因为数据库是最后一个入口点。如果检查代码中的重复项(尽管非常不可能),仍然可以进行复制,因为在返回初始SELECT和发回INSERT语句之间存在延迟,而另一个用户可能在该时间窗口中执行了相同的插入。

但是,首先运行select以查看记录是否存在可能更有效,而不是盲目地让插入每次都运行。

所以我会推荐两者。

答案 1 :(得分:2)

如果您使用Exception catching方法,即尝试插入,请记住Exception counter auto_increment column {{1}} {{1}}会增加的一件事让我们举个例子已成功插入一条记录且其 ID为1 然后您尝试插入与Exception相同的信息,然后尝试插入具有不同数据的其他数据将插入但是ID为no 。这个时间将是3而不是2,因为当异常发生时1增加所以请记住,如果你玩Exception案例,当异常发生时你会丢失这些id no.s。如果id计数器不是你的关注那么继续这个选项。

但我更喜欢先选择然后插入

希望它有意义

答案 2 :(得分:0)

除非,您的数据库查询层提供了多个Exception类(对于每个SQL状态 - 如果是关系数据库),您不应该使用Exception捕获;在这种情况下,您需要依赖例外的消息 - 它可能会随着时间而改变。

答案 3 :(得分:0)

我认为实际上并没有这样做的“标准”。要么查询,要么插入,要么转到INSERT / exception。

如果正确应用,两者都可以正常工作。

我通常更喜欢让数据库执行此任务。更改表格,使您想要唯一的字段实际上是唯一索引。如果要插入数据并且它是重复的,您将收到一个错误,可用于确定下一步该做什么。或者,如果您想要执行另一个表操作(如果需要),可以使用ON DUPLICATE KEY(如果在您选择的RDBMS上可用)。

这样可以避免在数据库端出现问题(如果不仅是应用程序写入这些表)。即使您先查询,也应该执行此操作以获得可靠的表格。