Wie kann man doppelte Benutzernamen bei der Registrierung verhindern?

Lesezeit: 5 Minuten

Wie kann man doppelte Benutzernamen bei der Registrierung verhindern
Flink

Ich habe ein Anmelde-/Registrierungssystem erstellt und bin kurz davor, meinen Registrierungsteil des Codes fertigzustellen. Das einzige Problem, auf das ich stoße, ist, wie man es so macht, dass sich Benutzer nicht mit doppelten Benutzernamen registrieren können. Ich möchte, dass es funktioniert, damit meine Datenbank die Informationen nicht akzeptiert und den Benutzer über den Fehler informiert.

Mein PHP

<?php

include 'database_connection.php';
if (isset($_POST['formsubmitted'])) {
    $error = array(); //Declare An Array to store any error message
if (empty($_POST['name'])) {//if no name has been supplied
    $error[] = 'Please Enter a name '; //add to array "error"
} else {
    $name = $_POST['name']; //else assign it a variable
}

    if (empty($_POST['e-mail'])) {
        $error[] = 'Please Enter your Email ';
    } else {
        if (preg_match("/^([a-zA-Z0-9])+([a-zA-Z0-9\._-])*@([a-zA-Z0-9_-])+([a-zA-Z0-9\._-]+)+$/", $_POST['e-mail'])) {
            //regular expression for email validation
            $Email = $_POST['e-mail'];
        } else {
            $error[] = 'Your EMail Address is invalid  ';
        }
    }

    if (empty($_POST['Password'])) {
        $error[] = 'Please Enter Your Password ';
    } else {
        $Password = $_POST['Password'];
    }

    if (empty($error)) {
        //send to Database if there's no error '
    }
}

  • Verwenden Sie keine benutzerdefinierten regulären Ausdrücke zur Validierung von E-Mail-Adressen, gültige E-Mail-Adressen erlauben ein +-Zeichen im lokalen Teil. benutze filter_input(INPUT_POST, FILTER_VALIDATE_EMAIL, ….

    – on8tom

    26. Februar 2021 um 12:32 Uhr

1646943247 144 Wie kann man doppelte Benutzernamen bei der Registrierung verhindern
Dharman

Der beste Weg, um doppelte Benutzernamen in der Datenbank zu verhindern, besteht darin, die Datenbankspalte PRIMARY KEY zu machen oder sie als UNIQUE zu markieren.

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

Dadurch werden doppelte Einträge in der Tabelle mit demselben Benutzernamen verhindert. Wenn Sie versuchen, dasselbe einzufügen, wird ein Fehler generiert.

Sie können dann die Ausnahme in PHP abfangen und den Grund überprüfen. Der doppelte Constraint-SQL-Fehlercode ist 1062.

Hier ist ein Beispiel, wie Sie diesen Fehler bei der Verwendung von PDO abfangen können:

$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!";
    } else {
        throw $e; // let the exception to be processed further 
    }
}

Hier ist ein Beispiel dafür, wie Sie diesen Fehler bei der Verwendung von mysqli abfangen können:

$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!";
    } else {
        throw $e; // let the exception to be processed further 
    }
}

  • Ich denke, es ist besser, eine eindeutige Einschränkung für das Feld “Benutzername” ohne diesen Primärschlüssel für die Feld-ID festzulegen? Ich stimme jedoch Ihrer Lösung der eindeutigen Einschränkung zu.

    – Schinken Schinken

    22. Februar 2021 um 15:30 Uhr

  • Kann man trotzdem herausfinden, was die doppelte Spalte ist, da es üblich sein kann, auch E-Mail-Adressen zu verwenden. Manchmal müssen diese sowie der Benutzername eindeutig sein.

    – Nigel Ren

    27. Februar 2021 um 8:05 Uhr

  • @NigelRen Ja, die Ausnahmemeldung enthält den Namen der Spalte. Sie können Regex verwenden, um es zu erhalten, aber dies ist nicht Gegenstand dieser Antwort.

    – Dharman

    27. Februar 2021 um 9:54 Uhr

  • Die Extraktion des Spaltennamens ist, wie Sie sagen, ein weiteres Problem. Ich wollte nur klarstellen, dass dies immer noch funktioniert, wenn mehrere eindeutige Spalten definiert sind (es muss nicht die einzige eindeutige Spalte sein).

    – Nigel Ren

    27. Februar 2021 um 10:20 Uhr

1646943248 814 Wie kann man doppelte Benutzernamen bei der Registrierung verhindern
Walid Naceri

Sie können es so machen, wenn der Benutzer zum Beispiel den Benutzernamen postet und auf Senden klickt, können Sie diesen Code schreiben oder ihn mit Ihrer Änderung zu Ihrem Code hinzufügen:

<?php

// 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');

$username = $_POST['username'];
$stmt = $conn->prepare("SELECT * FROM table_name where username=?");
$stmt->execute([$username]);
$result = $stmt->get_result();
$user = $result->fetch_assoc();
if ($user) {
    echo "user exists";
} else {
    echo "user does not exists";
}

  • vielen Dank für +rep für mich, und ich freue mich, dass diese Antwort für Sie funktioniert hat. Ich möchte Ihnen nur etwas sagen, wenn Sie die Spalte des Benutzers erstellen, können Sie sie eindeutig machen, zum Beispiel Tabellenbenutzer erstellen ( Benutzername varchar (350) nicht null eindeutig), viel Glück 🙂

    – Walid Naceri

    19. Juli 2013 um 15:54 Uhr

  • Bitte verwenden Sie nicht den angegebenen Code. Es ist weithin offen für SQL-Injection

    – Nico Haase

    19. Februar 2021 um 21:19 Uhr

  • Es ist nicht nur offen für SQL-Injection, der Code funktioniert auch nicht, wenn sich zwei oder mehr Benutzer gleichzeitig mit demselben Benutzernamen registrieren. Die beste Lösung besteht darin, einen UNIQUE-Index zu verwenden oder diesen Code in eine Transaktion einzuschließen.

    – Code4R7

    20. Februar 2021 um 21:06 Uhr

1646943248 947 Wie kann man doppelte Benutzernamen bei der Registrierung verhindern
essols

Es gibt zwei Dinge, die Sie tun sollten.

  1. Machen Sie den Benutzernamen zu einem Primärschlüssel in der Datenbanktabelle. Das geht ganz einfach mit phpmyadmin.

  2. Vor dem Einfügen validieren.

Für den zweiten Schritt ist hier ein Algorithmus. Sie können es auf Ihre eigene Weise mit pdo, mysqli oder sogar mysql implementieren (obwohl es derzeit nicht empfohlen wird).

Algorithmus am Ende Ihres Codes (dh wenn keine Fehler vorhanden sind) …

Wählen Sie Datensätze aus, die mit dem im Beitrag angegebenen USERNAME übereinstimmen.

Wenn es existiert, geben Sie einen Fehler aus.

Wenn es nicht vorhanden ist, fügen Sie es ein.

1646943249 462 Wie kann man doppelte Benutzernamen bei der Registrierung verhindern
Null

Ich habe eine PDO- und Klassenmethode verwendet, die möglicherweise von Nutzen ist.

//function for checking if the user already exists in the database
public function userExists($username)
{

    //prepared statements for added security
    $query = $this->db->prepare("SELECT COUNT(`id`) FROM `users` WHERE `username`= ?");
    $query->bindValue(1, $username);

    try {
        //execute the query
        $query->execute();
        $rows = $query->fetchColumn();

        //if a row is returned...user already exists
        if ($rows == 1) {
            return true;
        } else {
            return false;
        }
        //catch the exception
    } catch (PDOException $e) {
        die($e->getMessage());
    }
}

Beachten Sie auch die vorbereiteten Erklärungen – definitiv der Weg nach vorn

988890cookie-checkWie kann man doppelte Benutzernamen bei der Registrierung verhindern?

This website is using cookies to improve the user-friendliness. You agree by using the website further.

Privacy policy