Php MySQL中区分大小写的where子句
所以我有一个基本的网站登录表单。但我今天一直在测试这个网站,我发现如果你注册为“安迪”,你可以注册为“安迪”,也可以注册为“安迪”。 为了解决这个问题,我尝试从数据库中选择用户名,并通过===将其与$u POST['username']进行比较。但是没有用,所以我再次从代码中删除了该部分。 这是我的基本登录码,有人能帮我吗Php MySQL中区分大小写的where子句,php,database,Php,Database,所以我有一个基本的网站登录表单。但我今天一直在测试这个网站,我发现如果你注册为“安迪”,你可以注册为“安迪”,也可以注册为“安迪”。 为了解决这个问题,我尝试从数据库中选择用户名,并通过===将其与$u POST['username']进行比较。但是没有用,所以我再次从代码中删除了该部分。 这是我的基本登录码,有人能帮我吗 mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); session_start(); $DATABASE
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
session_start();
$DATABASE_HOST = 'localhost';
$DATABSE_USER = 'root';
$DATABSE_PASS = '';
$DATABSE_NAME = 'test';
$_POST['username'] = htmlspecialchars($_POST['username']);
$_POST['password'] = htmlspecialchars($_POST['password']);
$con = mysqli_connect($DATABASE_HOST, $DATABSE_USER, $DATABSE_PASS, $DATABSE_NAME);
if (mysqli_connect_errno()) {
exit('Failed to connect to database' . mysqli_connect_errno());
}
if ($stmt = $con->prepare('SELECT id, password, tokens, videos FROM accounts WHERE username = ?')) {
$stmt->bind_param('s', $_POST['username']);
$stmt->execute();
$stmt->store_result();
if ($stmt->num_rows > 0) {
$stmt->bind_result($id, $password, $tokens, $videos);
$stmt->fetch();
if (password_verify($_POST['password'], $password)) {
session_regenerate_id();
$_SESSION['loggedin'] = TRUE;
$_SESSION['name'] = $_POST['username'];
$_SESSION['id'] = $id;
$_SESSION['tokens'] = $tokens;
$_SESSION['videos'] = $videos;
header('Location: home.php');
} else {
echo 'Incorrect username or password';
}
} else {
echo 'Incorrect username or password';
}
$stmt->close();
}
基于字符集和排序规则,非二进制字符串比较不区分大小写。一种方法是使用
BINARY
将您的输入与列值进行比较,或者使用COLLATE
运算符更改排序规则,从而进行区分大小写的搜索
在您的情况下,将查询更改为:
SELECT id, password, tokens, videos FROM accounts WHERE BINARY username = 'Andy'
或者使用MySQL文档中描述的
COLLATE
:基于字符集和排序规则,非二进制字符串比较不区分大小写。一种方法是使用BINARY
将您的输入与列值进行比较,或者使用COLLATE
运算符更改排序规则,从而进行区分大小写的搜索
在您的情况下,将查询更改为:
SELECT id, password, tokens, videos FROM accounts WHERE BINARY username = 'Andy'
或者像MySQL文档中描述的那样使用
COLLATE
:基于字符集和排序规则,非二进制字符串比较不区分大小写。一种方法是使用BINARY
将您的输入与列值进行比较,或者使用COLLATE
运算符更改其中的排序规则,这将导致区分大小写的搜索。不要对密码运行htmlspecialchars()
,因为这实际上会更改密码。保持原样。你只是在处理散列,而且从来没有输出过它。还有,你不应该在数据进来时转义/编码,你应该只在你打算使用数据时才这样做,因为不同的用法需要不同的转义/编码。我删除了它。谢谢。基于字符集和排序规则,非二进制字符串比较不区分大小写。一种方法是使用BINARY
将您的输入与列值进行比较,或者使用COLLATE
运算符更改其中的排序规则,这将导致区分大小写的搜索。不要对密码运行htmlspecialchars()
,因为这实际上会更改密码。保持原样。你只是在处理散列,而且从来没有输出过它。还有,你不应该在数据进来时转义/编码,你应该只在你打算使用数据时才这样做,因为不同的用法需要不同的转义/编码。我删除了它。谢谢。这可以解决“Andy”的问题,但你能将其应用于任何用户名吗?比如用$_POST['username']替换'Andy'?我不需要从数据库中获取用户名并将其存储在变量中,这样我就可以在二进制基础上比较它们了吗?@dux是的,你可以用变量替换它,就像你在帖子中的查询一样。您不需要将字符串与php进行比较,因为我发布的查询就是为您进行比较的。这可以解决“Andy”的问题,但您可以将其应用于任何用户名吗?比如用$_POST['username']替换'Andy'?我不需要从数据库中获取用户名并将其存储在变量中,这样我就可以在二进制基础上比较它们了吗?@dux是的,你可以用变量替换它,就像你在帖子中的查询一样。您不需要将字符串与php进行比较,因为我发布的查询正在为您进行比较。