На данный момент я проверяю, может ли пользователь войти в систему таким образом:
// simply logic: if (username == usernameEntered && password == passwordEntered) {
В моей базе данных есть запись Aaron
в моей таблице пользователя. Но если я попытаюсь войти в систему как aaron
или AARON
и т. Д., Это лишит меня доступа. Так что, похоже, он чувствителен к регистру. Это проблема с моей базой данных или как я проверяю учетные данные для входа?
Я помню, когда я возился с JavaScript, /values/i
мог использоваться для нечувствительности к регистру. Есть ли что-то подобное для проверки PHP?
Кроме того, поскольку я здесь, есть много разницы между isset();
и empty();
когда в отношении файлов cookie / $ _ GET []; Запросы?
Да, используйте функцию 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
(с правильной конкатенацией строк и т. Д., Конечно. 🙂
РЕДАКТИРОВАТЬ: В качестве комментария к комментариям использование LOWER () в подобном запросе было бы очень плохой идеей, потому что для преобразования было бы необходимо преобразовать каждое имя пользователя в таблицу в нижний регистр для сравнения и сделать любой индекс на поле бесполезным. Лучше всего было бы хранить нижнюю регистрацию имени пользователя в базе данных, а также индекс в поле. Когда пользователь пытается войти в систему, преобразуйте то, что они ввели в нижний регистр, а затем выполните сравнение с этим.
Используйте strtolower()
или strtoupper()
в обеих сторонах условия if
.
if (strtolower(username) == strtolower(usernameEntered) && strtolower(password) == strtolower(passwordEntered))
Эти функции заменяют все верхние буквы нижними буквами или наоборот, что позволяет проверять регистр без учета регистра.
Кроме того, вы можете подробно просмотреть различия между isset()
и empty()
, проверив документацию PHP
PHP: isset – Руководство
PHP: пустой – ручной
Рекомендации:
Вы можете использовать предложение COLLATE
в инструкции SQL для выбора сортировки, которая используется для сравнения при поиске имени пользователя в базе данных:
SELECT * FROM `users` WHERE `username` COLLATE utf8_general_ci = 'FoObAr'
Использование _ci
(без _ci
регистра) сортировки позволит вам находить значения независимо от их случая. Не забудьте выбрать правильную сортировку, или вы можете получить неожиданные результаты, так как другие символы будут считаться равными (например, e и é). Вы также можете установить сопоставление в столбце напрямую, поэтому вам не нужно включать COLLATE
в каждый запрос.
Однако вам действительно нужно нормализовать имена пользователей, прежде чем они войдут в базу данных, поэтому вы всегда храните имена пользователей в нижнем регистре, например. Затем при поиске в базе данных вы также вводите строчный запрос для поиска, прежде чем подключать его к запросу. См. strtolower
.
Что касается isset
и empty
: isset
сообщает вам, существует ли вообще значение, empty
также сообщает вам, считается ли оно пустым . Прочтите руководство или http://kunststube.net/isset .