尽管ci整理,SQL假设区分大小写?

时间:2013-09-24 02:36:19

标签: php sql

在我的用户表中,我有一行username = Q。当我尝试以“q”登录时,它表示用户不存在,但是“Q”按预期工作。这是登录检查代码。

$username = $_POST["name"];
$password = $_POST["pass"];
$pahash = crypt($password, $username);
$logcheck = $db->prepare("
    SELECT *
        FROM users
        WHERE username = :username
        AND password = :pahash
");
$logcheck->execute(array(
    ':username' => $username,
    ':pahash' => $pahash));

我数据库中几乎每一列的排序规则都是“latin1_swedish_ci”,它不区分大小写。那么,为什么它似乎是区分大小写的呢?

如果重要,则用户列的类型为char(20)。

3 个答案:

答案 0 :(得分:2)

你可以这样做:

$username = $_POST["name"];
$password = $_POST["pass"];
$username = strtolower($username);
$pahash = crypt($password, $username);
$logcheck = $db->prepare("
    SELECT *
        FROM users
        WHERE LOWER(username) = :username
        AND password = :pahash
");
$logcheck->execute(array(
    ':username' => $username,
    ':pahash' => $pahash));

答案 1 :(得分:1)

使用“LIKE”而不是“=”作为用户名:

SELECT *
    FROM users
    WHERE username LIKE :username
    AND password = :pahash

答案 2 :(得分:1)

问题是crypt不区分大小写。因此,当$pahash的值从$password更改为$username时,Q的值与q的相同值不同。