13

我一直在制作登录/注册系统,并且即将完成我的代码注册部分。我遇到的唯一问题是如何使用户无法使用重复的用户名注册。我希望它能够工作,这样我的数据库就不会接受这些信息,它会告诉用户这个错误。

我的 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 '
    }
}
4

4 回答 4

18

防止数据库中重复用户名的最佳方法是使数据库列 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!";
    } else {
        throw $e; // let the exception to be processed further 
    }
}

以下是使用 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!";
    } else {
        throw $e; // let the exception to be processed further 
    }
}
于 2021-02-19T21:10:18.867 回答
5

例如,当用户发布用户名并单击提交时,您可以这样做,您可以编写此代码或将其添加到您的代码中进行修改:

<?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";
}
于 2013-07-19T00:57:15.510 回答
4

你应该做两件事。

  1. 使用户名成为数据库表中的主键。这很容易使用 phpmyadmin 完成。

  2. 在插入之前进行验证。

对于第二步,这里有一个算法。您可以使用 pdo、mysqli 甚至 mysql 以自己的方式实现它(尽管现在不推荐)。

代码末尾的算法(即,如果没有错误)...

选择与帖子中提供的 USERNAME 匹配的记录。

如果存在,则给出错误。

如果它不存在,请插入它。

于 2013-07-19T00:59:24.640 回答
1

我用了一个PDO和类方法,可能会有一些用处。

//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());
    }
}

也要注意准备好的陈述——绝对是前进的方向

于 2013-07-19T01:13:26.710 回答