如何使SQL查询区分大小写?

时间:2017-04-04 02:00:11

标签: php mysql sql pdo

这是我的PHP代码,我试图创建登录系统工作得很好,但是如果用户在数据库中有密码='abcd',如果他们输入'ABCD',他们仍然可以登录我不想要。我希望我的SQL查询区分大小写。

class Login extends Connection {
    private $userName;
    Private $password;

    public function userLogin($userName, $password) {

        $this -> userName = $userName;
        $this -> password = $password;

        $sql = "SELECT * FROM user WHERE user_name = :userName AND user_password = :password";

        $stmt = $this -> conn -> prepare($sql);
        $stmt -> execute(array(
            ':userName' => $this -> userName,
            ':password' => $this -> password
        ));

        if($stmt -> rowCount() == 1) {
            $_SESSION['userName'] = $userName;
            header("location:../index.php");
        }
        else {
            $_SESSION['loginMessage'] = "signin unsucessful";
        }
    }
}

我也试过像

这样的东西
$sql = "SELECT * FROM user WHERE user_name = :userName AND user_password COLLATE SQL_Latin1_General_CP1_CS_AS = :password";

我试过

$sql = "SELECT * FROM user WHERE user_name = :userName AND BINARY user_password = :password";

但他们都没有工作。

4 个答案:

答案 0 :(得分:2)

这绝对是想要解决的问题。以纯文本保存密码是非常非常糟糕的主意。该怎么办? Salthash密码。

为什么呢? Never store plain passwords!

如何? Hashing and salting in PHP

答案 1 :(得分:0)

请不要存储普通密码。

但是,回答你的问题,可能数据库正在使用不区分大小写的排序规则。

您必须在数据库上设置排序规则或设置要在查询中使用的排序规则。

答案 2 :(得分:0)

同意salting密码,但这应该适用于MySQL中的区分大小写的比较。

select case when cast('test' as binary) = cast('TEST' as binary) then 1 else 0 end

答案 3 :(得分:-2)

SELECT * FROM user WHERE user_name COLLATE latin1_general_cs = :userName AND user_password COLLATE latin1_general_cs = :password