![](/img/trans.png)
[英]Case sensitive LIKE and WHERE clause matching in MySQL using CodeIgniter
[英]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 文檔中描述的那樣使用COLLATE
: https : //dev.mysql.com/doc/refman/8.0/en/case-sensivity.html
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.