为什么这个 MySQL 查询对大小写敏感?

3
由于某种原因,此查询区分大小写:
$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:

Database view in phpmyadmin

Table view in phpmyadmin

这实际上是我在不了解php时构建的现有网站,所以我正在完全重写很多内容,并设置适当的密码哈希和https。 在编写新功能之前,这一切都运作良好,数据库中没有任何更改...
因此,现在它只检查输入的电子邮件,仅仅是为了查看查询是否正常运行,以及我们是否从数据库中获取结果,随后我们将检查密码并添加实际的登录功能。
这是数据库中的数据:

Data in table

现在,如果我将我的用户名填写为"chris"并运行函数,它会返回"用户已找到",因此我知道查询成功。但是,如果我填写为"Chris",则返回"未找到用户",因此我知道查询失败。
不过,我已经找到了问题所在,并已发布为答案。

1
我不明白为什么有人会在没有使用密码哈希的情况下实现身份验证部分。这只是增加了额外的负载,以处理纯文本。然后再进行哈希身份验证,这是多余的。从一开始就使用哈希值进行工作。 - Daryl Gill
不清楚,你想要实现什么? - aimme
1
@aimme 这里有点需要 mysql 标签。因为当 OP 对他/她所需的进行扩展时,它可能在 MySQL 后端中。 - Daryl Gill
@user1376143 你为什么说查询是区分大小写的?我们能看到表格里面的一些数据吗?还有一些你用来处理结果的输入吗? - Daryl Gill
@DarylGill 好的伙计。尝试缩小并具体化了... 不管怎样,你喜欢就行 :) - aimme
2个回答

2
问题出在:
if($row['email'] == $email)

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

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

如果 $row['email'] 不为空,则查询返回了结果并且成功,否则查询失败,这可能是因为使用了一个在数据库中不存在的电子邮件地址。

1
这看起来是正确的。数据库不会返回“错误”的答案,因此在这里不需要进行相等比较。 - Michael - sqlbot

0

要使字符串比较不区分大小写,有三种方法可供选择

  1. 使用小写(这会影响性能)

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

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


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接