如何在人们注册时防止重复的用户名? PHP / MySQL的

时间:2013-07-19 00:50:16

标签: php mysql duplicates

我一直在制作登录/注册系统,我正在接近完成我的注册部分代码。我遇到的唯一问题是如何使用它,以便用户无法注册重复的用户名。我希望它能够工作,以便我的数据库不会接受这些信息,它会告诉用户有关错误的信息。任何帮助表示赞赏。

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

7 个答案:

答案 0 :(得分: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!";
    }
}

以下是使用 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!";
    }
}

答案 1 :(得分:7)

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

<?php
$connect = mysql_connect('whatever','whatever','whatever');
$database = mysql_select_db('your dbname');
$username = $_POST['username'];
if(isset($username)){
$mysql_get_users = mysql_query("SELECT * FROM table_name where username='$username'");

$get_rows = mysql_affected_rows($connect);

if($get_rows >=1){
echo "user exists";
die();
}

else{
echo "user do not exists";
}



}
?>

答案 2 :(得分:1)

我认为你正在寻找的是这样的东西:

if (isset($_POST['user']))
{
    $user = $_POST['user'];

    if (mysql_num_rows(yourFunctionForQueryingMySQL("SELECT * FROM tablename WHERE user='$user'")))
            echo "Name is taken";
    else echo "Name available";
}

答案 3 :(得分:1)

你应该做两件事。

  1. 使用户名成为数据库表中的主键。这可以使用phpmyadmin轻松完成。

  2. 在插入之前验证。

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

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

      

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

         

    如果存在,请发出错误。

         

    如果不存在,请将其插入。

    希望有所帮助。

答案 4 :(得分:0)

如果用户名已存在,您必须(可以)制定禁止注册的条件。

    $sql="SELECT username FROM tablename WHERE username='".$username."'";//looking through existing usernames
    $resul=mysql_query($sql);
    $num = mysql_num_rows($resul);

    if ($num !=0){ //If there is already such username...

    die("There is user with that username.");  // ...kill the script!
} else //continue with the script

答案 5 :(得分:0)

我使用了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());
}
 }//end function userExists

注意准备好的陈述 - 绝对是前进的方式

答案 6 :(得分:0)

你可以这样做:

<?php

 //---put this code before "if (empty($error))"------

 $username = $_POST['username'];
 //---if your table user is "table_user" and fieldname username is "username"
 $query = 'SELECT username FROM table_user WHERE username = "' . $username . '" LIMIT 1';
 $result  = mysql_query($query)
 $totalNumRowResult = mysql_num_rows($result);

 if($totalNumRowResult > 0) {
  $error[] = 'User exist';
 }

?>

希望有所帮助。