当前位置: 首页 > 知识库问答 >
问题:

如何防止用户名重复在mySQL(PHP)[重复]

陈扬
2023-03-14

这是我的用户注册数据库的方式,但我的问题是:如何防止数据库具有相同用户名的副本,或者换句话说,如果用户名存在于数据库。

 <?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>

共有2个答案

扶绍辉
2023-03-14

您可以设置一个验证来检查用户名是否存在。

    <?php
    function checkUserExist($username){
    $checkExist = "SELECT username from userTable WHERE username ='" . $username . "'" or die(mysql_error());
    mysql_query($checkExist);
       if($checkExist > 0){//That means username is existed from the table
          return true;
       }else{//username isn't exist
          return false;
       }
    }

    if(checkUserExist($username)){//function return true
       echo "username is already exist, please change.";
    }else{
       //Insert the user info into db
    }

这是一个通过使用mysql_query函数检查用户名的例子,你也可以使用PDO来实现它,干杯!

勾炳
2023-03-14

我首先不使用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.
}

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

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

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

 类似资料:
  • 是的,在你告诉我将用户名列设置为主键之前,所以不允许重复。我已经在为我的user_id使用主键,它是自动增量的。我希望能够在PHP中进行检查,看看用户名是否已经被取走,并将json_encode发送回我的应用程序。顺便说一句,数据库是托管在线,所以不是真的localhost! 这是我现在使用的,不起作用: 当我运行这个的托管链接时,我得到,但它应该是false:

  • 我一直在做一个登录/注册系统,我正在接近完成我的注册部分代码。我遇到的唯一问题是如何使它使用户不能用重复的用户名注册。我想让它工作,使我的数据库不会接受信息,它会告诉用户有关错误。 我的PHP

  • 问题内容: 我想提出一种标准做法,以防止任何表在重要的地方重复。在大多数情况下,重复项是变量的组合而不是一个。我的主键只是每个字段的唯一ID,因此我无法使用它们。我一直在做的是先查询表,然后查询所要组合的行数是否为0,然后进行插入。但是,我已经读过,应该有可能在多个字段上设置唯一键以强制唯一性。INSERT IGNORE听起来很可能,但是,我需要在多个列上忽略它。 例如,对于字段关注者和关注对象,

  • 问题内容: 如何防止在php mysql中输入重复记录?在插入表之前验证输入。 我目前正在为我的网站建立一个用户注册部分,但是如果在数据库中发现重复的用户名或电子邮件地址,我想向他们显示一个错误。 编辑 这是我到目前为止要插入的行…我将如何在这里实现这两个答案: 我猜我可以在if … else语句中实现所有功能吗? 问题答案: 我使用了sql语句以及if else语句。 然后 显示错误消息,以防止

  • 问题内容: 我正在用来创建用户并处理身份验证。 当我尝试通过方法通过简单登录创建新用户时,如果已经使用了电子邮件地址,firebase不会创建该用户。但是,在创建用户并将其用作密钥之后,我还用于将创建的用户保存到我的Firebase中。尝试写入数据库时​​,即使用户名不是唯一的,firebase也会保存记录,因为简单登录只需要电子邮件和密码。因此,当用户名不用作用户对象的密钥时,如何验证其唯一性?

  • 我想防止重复的值进入数据库表从一个使用PHP的表单。 具有名为clients的表的数据库: 一个名为form的简单表单。html 名为frm_脚本的表单处理脚本。php 到目前为止,我的frm_脚本。php文件,上面的作品和一个独特的记录显示客户添加。然而,对于重复记录,它抛出“错误查询数据库”。 如何更新以下frm_script.php脚本? 如果在输入名/姓组合时发现重复行,则应显示消息“Cl