簡體   English   中英

MySQL中區分大小寫的where子句

[英]Case sensitive where clause in MySQL

所以我的網站有一個基本的登錄表單。 但是我今天一直在測試該網站,我發現如果您注冊為“Andy”,則可以以“Andy”的身份登錄,也可以以“andy”的身份登錄。 為了解決這個問題,我嘗試從數據庫中選擇用戶名並通過 === 將其與 $_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 文檔中描述的那樣使用COLLATEhttps : //dev.mysql.com/doc/refman/8.0/en/case-sensivity.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM