通过php检查mysql表中是否存在用户名?

5

我正在尝试找出如何让我的注册php代码检查注册者的用户名是否已被使用,如果已被使用,则不进行注册,并告知用户该用户名已被占用。 以下是完整的注册处理文件。

<?php
$con=mysqli_connect("localhost","root","","users");
// Check connection
if (mysqli_connect_errno())
  {
  echo "Failed to connect to MySQL: " . mysqli_connect_error();
  }

$hpassword = hash( 'sha512', $_POST['password'] );
$eusername = mysqli_real_escape_string( $con, $_POST['username'] );
$eemail = mysqli_real_escape_string( $con, $_POST['email'] );
$fusername = str_replace(' ', '', $eusername);

$sql="INSERT INTO users (username, password, email)
VALUES
('$fusername','$hpassword','$eemail')";

if (!mysqli_query($con,$sql))
  {
  die('Error: ' . mysqli_error($con));
  }
mysqli_close($con);
?> 

2
在“用户名”上设置唯一约束,然后读取mysqli_error($con),一次访问数据库。 - Dave Chen
编辑:我还想知道是否可以通知会员他们不能在用户名中使用空格。现在它被设置为删除空格,然后插入。 - Trevor Zucker
去除空格,然后与原始输入进行比较,如果不同,则存在空格! - Dave Chen
1
@TrevorZucker 你是否已经下了搜索的功夫?你所问的问题以及你在评论中提出的问题已经被回答了几次,请使用搜索功能。如何用 PHP 检查用户是否已经存在于 MySQL 中 PHP 确保唯一用户名 无法检查用户名是否存在 - Prix
@Prix 我已经在谷歌上搜索了一下,但是我找不到可行的方法。 - Trevor Zucker
显示剩余2条评论
3个回答

19
$sql=mysql_query("SELECT FROM users (username, password, email) WHERE username=$fusername");
 if(mysql_num_rows($sql)>=1)
   {
    echo"name already exists";
   }
 else
    {
   //insert query goes here
    }

您可以从数据库中检查用户是否存在,然后粘贴代码。


5
include ('database_connection.php');
if (isset($_POST['formsubmitted'])) {
    $error = array(); 
    if (empty($_POST['username'])) { 
        $error[] = 'Please Enter a name '; 
    } else {
        $username = $_POST['username']; 
    }

    if (empty($_POST['e-mail'])) {
        $error[] = 'Please Enter your Email ';
    } else {

        if (filter_var($_POST['e-mail'], FILTER_VALIDATE_EMAIL)) {
            //for email validation (refer: http://us.php.net/manual/en/function.filter-var.php)

            $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))

    { // If everything's OK...


        $query = "SELECT * FROM members  WHERE username ='$username'";
        $result = mysqli_query($dbc, $query); // here $dbc is your mysqli $link
        if (!$result) {
            echo ' Database Error Occured ';
        }

        if (mysqli_num_rows($result) == 0) { // IF no previous user is using this username.

            $query = "INSERT INTO `members` ( `username`, `email`, `password`) VALUES ( '$name', '$email', '$password')";

            $result = mysqli_query($dbc, $query);
            if (!$result) {
                echo 'Query Failed ';
            }

            if (mysqli_affected_rows($dbc) == 1) { //If the Insert Query was successfull.

                // Send an email

                // Finish the page:
                echo '<div class="success">Thank you for registering! A confirmation email has been sent to ' . $email . ' Please click on the Activation Link to Activate your account </div>';

            } else { // If it did not run OK.
                echo '<div class="errormsgbox">You could not be registered due to a system error. We apologize for any inconvenience.</div>';
            }

        } else { // The username is not available.
            echo '<div class="errormsgbox" >That username has already been registered.
</div>';
        }

    } else { //If the "error" array contains error msg , display them.... e.g....

        echo '<div class="errormsgbox"> <ul>';
        foreach ($error as $key => $values) {

            echo '  <li>' . $values . '</li>';

        }
        echo '</ul></div>';

    }

    mysqli_close($dbc); //Close the DB Connection

} // End of the main Submit conditional.

3

您可以使用Dave的方式来检查错误代码,或者您可以预先检查用户是否存在。

 $sql="SELECT FROM users (username, password, email) WHERE username=$fusername"

现在检查结果。如果获取了一行数据,则用户存在。向用户指示这一点。否则,太阳照耀着用户。给他一个cookie。


2
不要这样做。这是冒失的。 - Ignacio Vazquez-Abrams
racy是什么意思? - SoWhat
2
这意味着它涉及到竞态条件。在SELECTINSERT之间,有可能会出现另一个用户占用该用户名的情况。 - Ignacio Vazquez-Abrams
哦,确实如此。但是如果您通过ajax指示它,就没有办法让用户知道他的用户名是否可用。 - SoWhat
@IgnacioVazquez-Abrams 那你不是可以使用“事务”来防止竞态条件吗? - irosenb
显示剩余3条评论

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接