sql >> Base de Datos >  >> RDS >> Mysql

¿Cómo evitar nombres de usuario duplicados cuando las personas se registran?

La mejor manera de evitar nombres de usuario duplicados en la base de datos es hacer que la columna de la base de datos sea PRIMARY KEY o marcarla como ÚNICA.

-- Make it a primary key
ALTER TABLE users ADD PRIMARY KEY(username);
-- or set it to be unique
ALTER TABLE users ADD UNIQUE (username);

Esto evitará registros duplicados en la tabla con el mismo nombre de usuario. Cuando intente insertar el mismo, se generará un error.

Luego puede detectar la excepción en PHP y verificar el motivo. El código de error SQL de la restricción duplicada es 1062.

Aquí hay un ejemplo de cómo detectar este error al usar 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!";
    }
}

Aquí hay un ejemplo de cómo detectar este error al usar 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!";
    }
}