重新判断此查询的最简单方法是什么,以便用户名不区分大小写,但密码 区分大小写?
$query = mysql_query("select * from login where password='$password' AND username='$username'", $connection) or die(mysql_error());
答案 0 :(得分:3)
执行此操作的正确方法是让数据库处理区分大小写。为此,您必须更改排序规则
字段username
或password
(取决于它们当前的排序规则)。
您所要做的就是将字段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;
您不需要更改字段的整理(建议您使用,但如果您不能这样做,那么这是另一种解决方案)。您可以在查询中强制所需的排序规则:
强制对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());