如何防止 mySQL (PHP) 中的用户名重复

Dle*_*ler -1 html php mysql sql

这是我的用户注册数据库的方式,但我的问题是:如何防止数据库拥有相同用户名的副本,或者换句话说,如果他们的用户名,我如何向用户提示“您的用户名已经存在”存在于数据库中。

 <?php

        $error = ""; // error
        $GoodJob = ""; 
        //When submit button is pressed, send data.  

        if(isset($_POST['submit'])){

            if (empty($_POST['username']) || empty($_POST['email']) || empty($_POST['password'])) {

                $error = "<br>Please insert only letters or numbers.";

            }else{

            // Define username, firstname, lastname, email and password.
            $username = $_POST['username'];
            $firstname = $_POST['firstname'];
            $lastname = $_POST['lastname'];
            $email = $_POST['email'];
            $password = $_POST['password'];

            // Define database information
            $hostnameV = "***";
            $usernameV = "***";
            $passwordV = "***"; 
            $databaseV = "***"; 



            //connection to the database
            $connection = mysql_connect($hostnameV, $usernameV, $passwordV) 
                 or die("Unable to connect to MySQL");
            echo "Connected to MySQL<br>";


            //select a database to work with
            $selected = mysql_select_db($databaseV,$connection) 
              or die("Could not select company");

            // To protect MySQL injection for Security purposes
            $username = stripslashes($username);
            $firstname = stripslashes($firstname);  
            $lastname = stripslashes($lastname); 
            $email = stripslashes($email); 
            $password = stripslashes($password); 

            $username = mysql_real_escape_string($username); 
            $firstname = mysql_real_escape_string($firstname); 
            $lastname = mysql_real_escape_string($lastname); 
            $email = mysql_real_escape_string($email); 
            $password = mysql_real_escape_string($password); 

            // SQL query to send information of registerd users
            # FORMULA: INSERT INTO table_name (column1, column2, column3,...) VALUES (value1, value2, value3,...)

            $query = mysql_query("INSERT INTO `company`.`users` (`id`, `username`, `firstname`, `lastname`, `email`, `password`) 
                                  VALUES (NULL, '$username', '$firstname', '$lastname', '$email', '$password')", $connection); 


            //close the connection
            mysql_close($connection);    

            } // end if statement
            ***
        }

        ?>

         <div id="main">
                <div id="login">
                    <h2>REGISTER</h2>
                    <form action="" method="post">
                            <input id="name" name="username" placeholder="Pick a username" type="text">
                            <input id="name" name="email" placeholder="Your email" type="text">
                            <input id="name" name="firstname" placeholder="firstname" type="text">
                            <input id="name" name="lastname" placeholder="lastname" type="text">
                            <input id="password" name="password" placeholder="Create a password" type="password"> 
                            <input name="submit" type="submit" value=" REGISTER ">
                        <span><?php echo $error; ?></span>
                    </form>
                </div>
            </div>
Run Code Online (Sandbox Code Playgroud)

Hal*_*top 5

我首先不使用 mysql_* 函数,因为它们已被弃用,并在正常工作时切换到 PDO。

要回答您的问题,您应该简单地在数据库中查询用户名,如果存在,请告诉用户。

在插入之前,使用 PDO 和准备好的语句。

$stmt = $dbh->prepare('SELECT count(*) FROM user WHERE username = ?');
$stmt->execute(array($username));
$res = $stmt->fetch(PDO::FETCH_NUM);
$exists = array_pop($res);
if ($exists > 0) {
  // tell the user it already exists.
} else {
  // carry on with your insert.
}
Run Code Online (Sandbox Code Playgroud)

正如其他人所建议的那样,还应该使用户名唯一。尽管在尝试插入重复的用户名时,我不会编写我的代码失败,但我仍然会测试它是否存在。

因此,为了更清楚地说明,参考以下有关使用异常的评论,这就是为什么我不会编写代码来在有人输入已被使用的用户名时抛出异常的原因。例外,在我看来,应该是例外。这意味着发生了一些异常的事情。有人输入已经被占用的用户名,我认为这是应用程序的正常操作,应该以正常的非异常方式处理。但是,如果有人输入了一个有效的用户名,并且在我检查它未被占用的时间和我运行插入时,其他人获取了该用户名(在那 2 毫秒的时间范围内),那将是一个例外,我会处理它。对于用户来说,那个“异常”看起来完全一样,但在我的代码中它会被当作异常处理。

所以这就是为什么我不会只编写我的代码来执行插入操作,当有人输入一个已经被占用的用户名时会抛出异常。我会检查它是否被占用,然后插入它,如果该用户名在我检查的时间和插入的时间之间被阻塞,则会引发异常。我认为这是很好的应用程序设计和异常的正确使用。其他人可以不同意,但我会这样做。例外应该是例外,而不是正常经营过程的一部分。