PHP: регистрация без учета регистра - PullRequest
0 голосов
/ 28 декабря 2011

На данный момент я проверяю, может ли пользователь войти в систему таким образом:

// simply logic:
if (username == usernameEntered && password == passwordEntered) {

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

Я помню, когда я возился с JavaScript, /values/i можно было бы использовать для нечувствительности к регистру. Есть ли что-то подобное для проверок PHP?

Кроме того, поскольку я здесь, есть большая разница между isset(); и empty(); применительно к cookie / $ _ GET []; запросы?

Ответы [ 3 ]

3 голосов
/ 28 декабря 2011

Да, используйте функцию strtolower .Просто нужно сделать что-то вроде этого:

if(strtolower($username) == strtolower($usernameEntered))

Что касается isset () и empty () Они действительно разные, но часто они дают одинаковый результат. isset () сообщает вам, была ли переменная вообще установлена ​​(но она все еще может не иметь значения). empty () в общем говорит, равна ли переменная чему-либо.Смотрите документацию по PHP, с которой я связан для каждого.Я бы не советовал использовать empty () для проверки файлов cookie и значений GET / POST, потому что пустые строки и 0 считаются пустыми, что, вероятно, не то, что вам нужно.Я бы использовал isset (), чтобы увидеть, установлена ​​ли переменная, а затем проверил ее на предмет данных, которые вы ищете.Часто вы хотели бы иметь дело с пустой строкой иначе, чем без значения.

Кроме того, Пекка упомянул в комментарии, что если вы находите учетную запись в базе данных на основе имени пользователя, то вы действительнонужно сделать преобразование в нижний регистр там.Если так:

SELECT * FROM users WHERE LOWER(username) = LOWER(:username)

Предполагается, что вы используете подготовленный запрос с PDO.В противном случае просто замените вашу переменную, где у меня есть :username (с правильной конкатенацией строк и т. Д., Конечно.Подобный запрос был бы действительно плохой идеей, потому что он должен был бы преобразовать каждое имя пользователя в таблице в нижний регистр для сравнения и сделать любой индекс в поле бесполезным.Гораздо лучшим способом было бы хранить строчную версию имени пользователя в базе данных, а также индекс на поле.Когда пользователь пытается войти в систему, преобразуйте введенные данные в нижний регистр, а затем выполните сравнение с ним.

3 голосов
/ 28 декабря 2011

Используйте strtolower() или strtoupper() с обеих сторон условия if.

if (strtolower(username) == strtolower(usernameEntered) && strtolower(password) == strtolower(passwordEntered))

Эти функции заменяют все верхние буквы строчными или наоборот, что позволяет выполнять проверку без учета регистра.

Также вы можете детально увидеть различия между isset() и empty(), проверив документацию PHP

PHP: isset - Manual

PHP: пусто - Руководство

Ссылки:

http://php.net/manual/en/function.strtoupper.php

http://php.net/manual/en/function.strtolower.php

0 голосов
/ 28 декабря 2011

Вы можете использовать предложение COLLATE в операторе SQL, чтобы выбрать сопоставление, используемое для сравнения при поиске имени пользователя в базе данных:

SELECT * FROM `users` WHERE `username` COLLATE utf8_general_ci = 'FoObAr'

Использование сопоставления _ci (без учета регистра) позволит вам найти значения независимо от их регистра. Убедитесь, что вы выбрали правильное сопоставление, иначе вы можете получить неожиданные результаты, так как другие символы также будут считаться равными (например, e и é). Вы также можете установить параметры сортировки для столбца напрямую, поэтому вам не нужно включать COLLATE в каждый запрос.

Что вам действительно следует сделать, так это нормализовать имен пользователей, прежде чем они попадут в базу данных, так что вы всегда сохраняете имена пользователей, например, в нижнем регистре. Затем при поиске в базе данных вы также пишете строчный термин для поиска, прежде чем вставить его в запрос. См strtolower.

Что касается isset и empty: isset сообщает вам, существует ли значение вообще, empty также сообщает вам, считается ли оно пустым . Прочтите руководство или http://kunststube.net/isset.

...