PHP: проверка нечувствительности к регистру

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

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

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

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

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

Solutions Collecting From Web of "PHP: проверка нечувствительности к регистру"

Да, используйте функцию 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: пустой – ручной

Рекомендации:

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

http://php.net/manual/en/function.strtolower.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 .