Cách tốt nhất để ngăn trùng lặp tên người dùng trong cơ sở dữ liệu là đặt cột cơ sở dữ liệu CHÍNH LÀ TỪ KHÓA CHÍNH hoặc đánh dấu nó là DUY NHẤT.
-- Make it a primary key
ALTER TABLE users ADD PRIMARY KEY(username);
-- or set it to be unique
ALTER TABLE users ADD UNIQUE (username);
Điều này sẽ ngăn các bản ghi trùng lặp trong bảng có cùng tên người dùng. Khi bạn cố gắng chèn cùng một cái thì sẽ xảy ra lỗi.
Sau đó, bạn có thể bắt ngoại lệ trong PHP và kiểm tra lý do. Mã lỗi SQL ràng buộc trùng lặp là 1062.
Dưới đây là một ví dụ về cách bắt lỗi này khi sử dụng PDO:
$error = [];
$username = 'Dharman';
$pdo = new \PDO("mysql:host=localhost;dbname=test;charset=utf8mb4", 'user', 'password', [
\PDO::ATTR_ERRMODE => \PDO::ERRMODE_EXCEPTION, // make sure the error reporting is enabled!
\PDO::ATTR_EMULATE_PREPARES => false
]);
try {
$stmt = $pdo->prepare('INSERT INTO users(username) VALUE(?)');
$stmt->execute([$username]);
} catch (\PDOException $e) {
if ($e->errorInfo[1] === 1062) {
$error[] = "This username is already taken!";
}
}
Dưới đây là một ví dụ về cách bắt lỗi này khi sử dụng mysqli:
$error = [];
$username = 'Dharman';
// make sure the error reporting is enabled!
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$mysqli = new mysqli('localhost', 'user', 'password', 'test');
$mysqli->set_charset('utf8mb4');
try {
$stmt = $mysqli->prepare('INSERT INTO users(username) VALUE(?)');
$stmt->bind_param('s', $username);
$stmt->execute();
} catch (\mysqli_sql_exception $e) {
if ($e->getCode() === 1062) {
$error[] = "This username is already taken!";
}
}