Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/php/249.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/database/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Php MySQL中区分大小写的where子句_Php_Database - Fatal编程技术网

Php MySQL中区分大小写的where子句

Php MySQL中区分大小写的where子句,php,database,Php,Database,所以我有一个基本的网站登录表单。但我今天一直在测试这个网站,我发现如果你注册为“安迪”,你可以注册为“安迪”,也可以注册为“安迪”。 为了解决这个问题,我尝试从数据库中选择用户名,并通过===将其与$u POST['username']进行比较。但是没有用,所以我再次从代码中删除了该部分。 这是我的基本登录码,有人能帮我吗 mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); session_start(); $DATABASE

所以我有一个基本的网站登录表单。但我今天一直在测试这个网站,我发现如果你注册为“安迪”,你可以注册为“安迪”,也可以注册为“安迪”。 为了解决这个问题,我尝试从数据库中选择用户名,并通过===将其与$u POST['username']进行比较。但是没有用,所以我再次从代码中删除了该部分。 这是我的基本登录码,有人能帮我吗

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进行比较,因为我发布的查询正在为您进行比较。