データベース内のユーザー名の重複を防ぐ最善の方法は、データベース列をPRIMARY KEYにするか、UNIQUEとしてマークすることです。
-- Make it a primary key
ALTER TABLE users ADD PRIMARY KEY(username);
-- or set it to be unique
ALTER TABLE users ADD UNIQUE (username);
これにより、同じユーザー名でテーブル内のレコードが重複するのを防ぐことができます。同じものを挿入しようとすると、エラーが生成されます。
次に、PHPで例外をキャッチし、理由を確認できます。重複する制約SQLエラーコードは1062です。
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!";
}
}
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!";
}
}