区分大小写的密码查询但不是用户名

时间:2015-05-21 14:24:20

标签: php mysql

重新判断此查询的最简单方法是什么,以便用户名区分大小写,但密码 区分大小写?

$query = mysql_query("select * from login where password='$password' AND username='$username'", $connection) or die(mysql_error());

3 个答案:

答案 0 :(得分:3)

执行此操作的正确方法是让数据库处理区分大小写。为此,您必须更改排序规则 字段usernamepassword(取决于它们当前的排序规则)。

您所要做的就是将字段username的排序规则更改为名称以_ci结尾的排序规则(代表case insensitive)和字段排序{ {1}}到名称以password结尾的排序规则(来自_cs)。

排序规则的实际名称取决于表格的字符集。

例如,这是使用case sensitive作为字符集的表的定义:

latin1

如果您更改了排序规则,则不必再担心值的区分大小写,并且您不需要更改查询。

使用上表

的示例代码
CREATE TABLE `users` (
  `id` int(11) unsigned NOT NULL AUTO_INCREMENT,
  `username` varchar(32) CHARACTER SET latin1 COLLATE latin1_general_ci DEFAULT NULL,
  `password` varchar(32) CHARACTER SET latin1 COLLATE latin1_general_cs DEFAULT NULL,
  PRIMARY KEY (`id`)
) ENGINE=InnoDB DEFAULT CHARSET=latin1;

使用@ spencer7593

的优秀建议替代解决方案

您不需要更改字段的整理(建议您使用,但如果您不能这样做,那么这是另一种解决方案)。您可以在查询中强制所需的排序规则:

强制对mysql> INSERT INTO `users` (`username`, `password`) -> VALUES ('John Doe', 'passwd1'), ('john doe', 'PASSWD1'); Query OK, 2 rows affected (0.00 sec) mysql> SELECT * FROM `users` WHERE `username` = 'JOHN DOE'; +----+----------+----------+ | id | username | password | +----+----------+----------+ | 1 | John Doe | passwd1 | | 2 | john doe | PASSWD1 | +----+----------+----------+ 2 rows in set (0.00 sec) mysql> SELECT * FROM `users` WHERE `password` = 'passwd1'; +----+----------+----------+ | id | username | password | +----+----------+----------+ | 1 | John Doe | passwd1 | +----+----------+----------+ 1 row in set (0.00 sec)

进行区分大小写的比较
username

强制对mysql> SELECT * FROM `users` WHERE `username` COLLATE latin1_general_cs = 'john doe'; +----+----------+----------+ | id | username | password | +----+----------+----------+ | 2 | john doe | PASSWD1 | +----+----------+----------+ 1 row in set (0.00 sec)

进行不区分大小写的比较
password

答案 1 :(得分:1)

只是规范化案例。

$query = mysql_query(
    "
        SELECT *
        FROM login
        WHERE
            password='$password'
            AND LOWER(username)=LOWER('$username')
    ",
    $connection
) or die(mysql_error());

答案 2 :(得分:-1)

很简单,您可以使用.capacity(),例如:

LIKE

或者你可以像这样进行部分匹配,但这不是你需要的:

$query = mysql_query("select * from login where password='$password' AND username LIKE '$username'", $connection) or die(mysql_error());