2015-10-02 60 views
3

出于某种原因,这个查询运行区分大小写:为什么这个查询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>"; 
} 

(顺便说一句,这是所有刚刚上演。只要我看到这个工作正常,就会有密码哈希)。

它发现用户没有问题,如果我使用相同的情况下,该数据库条目。

这里是我的表,所以你可以看到它的所有定义的词:

Database view in phpmyadmin

Table view in phpmyadmin

这实际上是我建的时候我不知道很多关于PHP现有的网站,所以我完全重写了很多,并设置了正确的密码哈希和https。这是所有工作正常之前,我写了新的功能,并没有在数据库已更改......

所以现在只检查输入的电子邮件地址,只是为了看看如果查询工作,并且我们从得到结果数据库,稍后我们将检查密码并添加实际的登录功能。

这里是在数据库中的数据:

Data in table

现在,如果我填写我的用户名是“克里斯”,并运行该功能,则返回“用户发现”,所以我知道查询那是成功的。但是,如果我填写为“Chris”,则返回“未找到用户”,所以我知道这是不成功的。

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

+1

我不明白为什么任何人都会执行认证部分而不使用密码散列开始。它只是增加一个额外的有效载荷,以纯文本工作。然后开始验证散列,这是多余的。使用偏移量为 –

+0

的哈希值不清晰。你想达到什么目的? – aimme

+1

@aimme mysql标签是这里需要的。当OP扩展他/她需要的内容时,它可能位于MySQL后端 –

回答

2

的问题是:

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

字符串的 “==” 比较是区分大小写。一个更好的办法来做到这一点是使用:

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

如果$行[“电子邮件”]不为空,则该查询返回的结果,是成功的,否则查询失败,这所致使用与数据库中任何不匹配的电子邮件地址。

+1

这似乎是正确的。数据库不会返回一个“错误的”答案,所以这里不要求相等比较。 –

0

为了使字符串比较的情况下inssensitive需要以下三种方法

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

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

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