Почему этот запрос MySQL выполняется с учетом регистра?

По какой-то причине этот запрос выполняется с учетом регистра:

$stmt = $db->prepare("SELECT * FROM people WHERE email = :email LIMIT 1");

Он просто возвращает, нашел ли он пользователя:

$stmt->bindParam(':email', $email);
$stmt->execute();
$row = $stmt->fetch();
if($row['email'] == $email)
{
return "<span style='color: red;'>User found.</span><br>";
} else {
return "<span style='color: red;'>User not found.</span><br>";
}

(Кстати, это всего лишь постановка. Будет хэширование пароля, как только я увижу, что это работает должным образом).

Он не находит пользователя проблем, если я использую тот же случай, что и запись в базе данных.

Вот моя таблица, так что вы можете видеть, что она определена как ci:

Просмотр базы данных в phpmyadmin

Представление таблицы в phpmyadmin

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

Так что сейчас он проверяет только введенную электронную почту, просто чтобы убедиться, что запрос работает, и мы получаем результаты из базы данных, позже мы проверим пароль и добавим фактическую функциональность входа в систему.

Вот данные в базе данных:

Данные в таблице

Теперь, если я ввожу свое имя пользователя как «chris» и запускаю функцию, он возвращает «User Found», так что я знаю, что запрос был успешным. Однако, если я укажу «Крис», он вернет «Пользователь не найден», поэтому я знаю, что это не удалось.

Нашел проблему, хотя. Опубликовано как ответ.

3

Решение

Вопрос с:

if($row['email'] == $email)

Сравнение строк «==» чувствительно к регистру. Лучший способ сделать это — использовать:

if(!empty($row['email']))

Если $ row [’email’] не пусто, то запрос вернул результат и был успешным, иначе запрос не удался, что было бы вызвано использованием адреса электронной почты, который не совпадает ни с одним в базе данных.

2

Другие решения

Чтобы сделать сравнение строк нечувствительным, требуется один из трех подходов

  1. Используйте ниже (это повлияет на производительность)

    $stmt = $db->prepare("SELECT * FROM people WHERE LOWER(email) = LOWER(:email) LIMIT 1");
    
  2. Другой способ заключается в использовании сопоставления

  3. И способ, которым я пользуюсь, заключается в том, что для начала я сохраняю электронную почту в нижнем регистре и преобразую строку поиска в нижнюю перед выполнением поиска.

0