我正在进行密码和用户名登录查询,看起来像这样
$query = "SELECT id FROM users WHERE username = ? AND password = ?";
我传递了我的用户名和密码。问题是,我说用户名为'user',密码为'password'。当我在字段中键入“user”和“Password”时,它返回结果仍然是。所以这使首都变得毫无用处。难道我做错了什么?有没有更好的方法来解决这个问题?用户名的资金问题是相同的。当我想要一个精确的字符串匹配时,就像它正在进行模式匹配。我也尝试过二进制文件,希望它可能会改变它但结果相同。
$stmt = $this->db->prepare($query);
$stmt->bind_param("ss", $user, $pass);
$stmt->execute();
答案 0 :(得分:4)
简单比较操作(> =,>,=,<,< =,排序和分组)基于每个字符的“排序值”。具有相同排序值的字符被视为相同的字符。例如,如果“e”和“é”在给定的排序规则中具有相同的排序值,则它们会相等。
默认字符集和排序规则是latin1和latin1_swedish_ci,因此非二进制字符串比较默认情况下不区分大小写。这意味着如果使用col_name LIKE'a%'进行搜索,则会获得以A或a开头的所有列值。要使此搜索区分大小写,请确保其中一个操作数具有区分大小写或二进制排序规则。例如,如果要比较具有latin1字符集的列和字符串,则可以使用COLLATE运算符使任一操作数具有latin1_general_cs或latin1_bin排序规则:
您应该将表或列的排序规则更改为区分大小写或使用二进制排序规则。
答案 1 :(得分:2)
这是典型的整理问题。 默认排序规则比较不区分大小写。您应该使用二进制排序规则进行比较。
默认utf8校对
mysql> SELECT 'password' COLLATE utf8_unicode_ci = 'PASSWORD' COLLATE utf8_unicode_ci;
+-------------------------------------------------------------------------+
| 'password' COLLATE utf8_unicode_ci = 'PASSWORD' COLLATE utf8_unicode_ci |
+-------------------------------------------------------------------------+
| 1 |
+-------------------------------------------------------------------------+
1 row in set (0.00 sec)
utf8二进制排序规则
mysql> SELECT 'password' COLLATE utf8_bin = 'PASSWORD' COLLATE utf8_bin;
+-----------------------------------------------------------+
| 'password' COLLATE utf8_bin = 'PASSWORD' COLLATE utf8_bin |
+-----------------------------------------------------------+
| 0 |
+-----------------------------------------------------------+
1 row in set (0.00 sec)
mysql> SELECT 'password' COLLATE utf8_unicode_ci = 'password' COLLATE utf8_unicode_ci;
+-------------------------------------------------------------------------+
| 'password' COLLATE utf8_unicode_ci = 'password' COLLATE utf8_unicode_ci |
+-------------------------------------------------------------------------+
| 1 |
+-------------------------------------------------------------------------+
1 row in set (0.00 sec)
将您的查询更改为
$query = "SELECT id FROM users WHERE username = ? AND password COLLATE utf8_bin = ?";
点击此处了解有关整理的更多信息:
https://dev.mysql.com/doc/refman/5.5/en/charset-general.html
答案 2 :(得分:2)
您使用的是哪种排序规则? see here for information on case sensitivity in MySQL
您可能应该对用户名和密码列使用二进制排序规则。
值得注意的是:
要使此搜索区分大小写,请确保其中一个操作数具有区分大小写或二进制排序规则。
也
如果希望始终以区分大小写的方式处理列,请使用区分大小写或二进制排序规则来声明它。请参见第13.1.10节“CREATE TABLE语法”。
另外,理想情况下,您应该至少腌制和散列密码。然后在进行比较时,在登录时对用户提供的密码进行加盐和散列。存储明文密码是不好的做法,应该避免使用。