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

时间:2015-10-02 01:46:59

标签: php mysql case-sensitive

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

$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”,并运行该函数,则返回“User Found”,因此我知道查询成功。但是,如果我将其填入“Chris”,它会返回“User not found。”,所以我知道它不成功。

但是发现了这个问题。张贴作为答案。

2 个答案:

答案 0 :(得分:2)

问题在于:

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

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

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

如果$ row ['email']不为空,则查询返回结果并成功,否则查询失败,这可能是由于使用与数据库中的任何内容都不匹配的电子邮件地址引起的。

答案 1 :(得分:0)

要使字符串比较案例不敏感,需要三种方法之一

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

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

  3. 我使用的方法是将电子邮件存储为小写,然后在搜索之前将搜索字符串转换为较低的字符串。