为什么此查询 MySQL 查询 运行 区分大小写?

Why is this query MySQL query running case-sensitive?

出于某种原因,此查询 运行 区分大小写:

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

它只是 returns 它是否找到了用户:

$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>";   
}

(顺便说一下,这只是暂存。一旦我看到它正常工作,就会进行密码散列)。

如果我使用与数据库条目相同的大小写,它发现用户没有问题。

这是我的 table,所以你可以看到它都已定义 ci:

这实际上是我在对 php 了解不多时建立的现有站点,因此我完全重写了很多内容,并设置了正确的密码散列和 https。在我编写新函数之前一切正常,数据库中没有任何变化...

所以现在它只检查输入的电子邮件,只是为了查看查询是否正常运行以及我们是否从数据库中获取结果,稍后我们将检查密码并添加实际的登录功能。

这是数据库中的数据:

现在,如果我将我的用户名填写为 "chris",并且将 运行 函数填写为 returns "User Found",那么我就知道查询成功了。如果我填成"Chris",然而,它是returns "User not found.",所以我知道它是不成功的。

虽然发现了问题。作为答案发布。

问题在于:

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

字符串的“==”比较区分大小写。更好的方法是使用:

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

如果$row['email']不为空,则查询返回结果成功,否则查询失败,可能是使用了与数据库。

要使字符串比较不区分大小写,需要三种方法之一

  1. 使用较低的(这会影响性能)

    $stmt = $db->prepare("SELECT * FROM people WHERE LOWER(email) = LOWER(:email) LIMIT 1");
    
  2. 另一种方法是使用整理

  3. 我使用的一种方法是,我首先将电子邮件存储为小写字母,然后在进行搜索之前将搜索字符串转换为小写字母。