在注册时,检查用户名是否存在 - 大写问题

时间:2010-11-30 01:21:30

标签: php mysql case-sensitive

我的家庭账户注册系统如此进行:

  1. 完整的注册表格
  2. 检查用户名是否已存在 - 拒绝/传递
  3. 将数据复制到临时用户表,发送确认电子邮件
  4. 在确认电子邮件中使用链接时,将数据从临时用户表复制到活动用户表
  5. 前几天,用户通过电子邮件向我说他收到错误消息“无法创建用户。”

    我不记得曾经听过这个,所以我挖掘了我的注册码,如果将临时数据插入活动用户表的查询失败,则会弹出错误。

    它失败了,因为他的用户名在表中有一个唯一索引,已经存在于活动用户表中......但是他已经通过了最初的现有用户名检查......?

    原来他试图注册的名字是“用户”,但已经有一个“用户” - 所以不区分大小写正在发挥作用。

    用户名是否存在?查询字符串:

    SELECT username FROM user_basic_data WHERE username='$cleanTempUsername'
    

    确认,现在插入活动表字符串:

    INSERT INTO user_basic_data (username, ...) VALUES ('$activeUsername', ...)
    

    因此,当我运行select语句(“User”!=“user”)时,区分大小写显然适用,但在运行插入时不适用。

    大写对很多用户来说很重要,那么我最不耐烦的是什么呢?

3 个答案:

答案 0 :(得分:0)

最佳举措可能是对表格使用区分大小写的排序规则。

也许尝试latin1_binutf8_bin

答案 1 :(得分:0)

如果您想要区分大小写的用户名,请使用varbinary数据类型...

create table users
(
user_id int unsigned not null auto_increment primary key,
username varbinary(32) unique not null,
...
)
engine=innodb;

insert into users (username) values ('foo'),('Foo'),('FOO');

答案 2 :(得分:0)

无论输入如何,您都可以使用php strtolower()或mysql LOWER()来使输入成为小写名称。这样他们可以使用他们想要的任何情况,但数据库总是处理小写的用户名。当然,这意味着您只能拥有一个名为“user”的用户名,但它确实解决了不区分大小写的问题,并允许用户只需一次更改即可为他们的用户名输入他们想要的任何案例。只是不要使用密码。