при регистрации проверьте, существует ли проблема с регистрацией имени пользователя

Моя домашняя система регистрации учетной записи работает следующим образом:

  1. заполнить регистрационную форму
  2. проверить, существует ли уже имя пользователя - отклонить/пропустить
  3. скопировать данные во временную пользовательскую таблицу, отправить электронное письмо с подтверждением
  4. при использовании ссылки в электронном письме с подтверждением скопируйте данные из временной таблицы в активную пользовательскую таблицу

На днях пользователь написал мне по электронной почте, чтобы сказать, что он получает сообщение об ошибке «Не удалось создать пользователя».

Я не мог припомнить, чтобы когда-либо слышал это, поэтому я копался в своем регистрационном коде, и эта ошибка выскакивает, если запрос на вставку временных данных в активную пользовательскую таблицу терпит неудачу.

Это не удалось, потому что его имя пользователя, имеющее уникальный индекс в таблице, уже существовало в таблице активных пользователей... но он прошел первоначальную проверку существующего имени пользователя...?

Оказалось, что имя, которое он пытался зарегистрировать, было «Пользователь», но «пользователь» уже был, так что в игру вступает нечувствительность к регистру.

Имя пользователя существует? Строка запроса:

SELECT username FROM user_basic_data WHERE username='$cleanTempUsername'

Подтверждено, теперь вставьте в строку активной таблицы:

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

Таким образом, чувствительность к регистру, по-видимому, применяется, когда я запускаю оператор выбора ("Пользователь" != "пользователь"), но не применяется, когда я запускаю вставку.

Использование заглавных букв важно для многих пользователей, так что же я могу сделать с наименьшим сопротивлением?


person Drew    schedule 30.11.2010    source источник


Ответы (3)


если вы хотите, чтобы имена пользователей чувствительны к регистру, используйте тип данных 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');
person Jon Black    schedule 30.11.2010

Вы можете сделать php strtolower() или mysql LOWER(), чтобы ввести имя в нижнем регистре независимо от ввода. Таким образом, они могут использовать любой регистр, но база данных всегда имеет дело с именами пользователей в нижнем регистре. Конечно, это означает, что у вас может быть только одно имя пользователя с именем «пользователь», но это решает проблему нечувствительности к регистру и позволяет пользователям вводить любой регистр, который они хотят для своего имени пользователя, всего одним изменением. Только не делайте этого с паролем.

person Bob Baddeley    schedule 30.11.2010

Лучшим шагом, вероятно, будет использование сортировки с учетом регистра для ваших таблиц.

Возможно, попробуйте latin1_bin или utf8_bin.

person Niet the Dark Absol    schedule 30.11.2010
comment
Повлияет ли изменение сортировки на мои данные? Или это что-то вроде неуверенности, проверки и проверки? - person Drew; 30.11.2010
comment
Он должен автоматически преобразовывать данные в новую сортировку, не изменяя ее. Единственный раз, когда вы столкнетесь с проблемами, это если вы переключитесь с регистро-чувствительного на -нечувствительное. - person Niet the Dark Absol; 30.11.2010