从MySQL数据库中检查重复用户

3

当注册用户时,我希望在MySQL数据库中检查是否存在重复数据。

如果该用户已存在,则显示相应的错误信息,否则进行注册。

我知道有一些类似的问题,但我发现很难将它们粘贴到我的代码中。

if ($_SERVER['REQUEST_METHOD'] == 'POST') {
    //two passwords are the same
    if($_POST['password'] == $_POST['confirmedpassword']) {

        $username = $mysqli->real_escape_string($_POST['username']);
        $password = md5($_POST['password']);

        $_SESSION['username'] = $username;
        $_SESSION['password'] = $password;

        $sql = "INSERT INTO members(username, password)"
            . "VALUES ('$username','$password')";

            //if query is successful redirect to login.php
            if ($mysqli->query($sql) === true)
                $_SESSION['message'] = 'Success';
            header("location: login.php");
        } else {
            $_SESSION['message'] = "User couldnt be added";
        }
    } else {
        $_SESSION['message'] = "Passwords dont match";
    }
}

出了什么问题?你需要先执行选择查询来检查用户是否已经存在。 - Amit Gupta
我需要它来检查重复用户。目前它没有进行检查。 - Bradley Coupland
你在哪里检查重复用户? - Amit Gupta
如果您想检查用户是否存在,是的,您需要使用jQuery/AJAX或者使用带有AJAX的Bootstrap FormValidation。 - Amit Gupta
不要使用这段代码或者你得到的答案直接上线。你会被黑客攻击,而且没有人会提醒你。 - Funk Forty Niner
显示剩余3条评论
2个回答

4

我向你的 md5 password 添加了一些 salt 以使其看起来更安全,但实际上这种解决方案也不安全。在 PHP 中加密密码建议使用 password_hash() 函数,如下所示:

$pass = password_hash($password, PASSWORD_BCRYPT);

password_hash()使用强有力的单向哈希算法创建新的密码哈希。

之后可以使用password_verify()函数进行测试:

password_verify ( $passToTest , $knownPasswordHash );

更多有关函数的信息请参见http://php.net/password-hashhttp://php.net/password-verify
另外,由于您正在使用MySQLi,请考虑使用预处理语句,或者在将数据应用于数据库之前正确过滤输入数据。更多关于预处理语句的信息请参见:http://php.net/prepared-statements
我添加了一个select statement来检查table中是否已经存在user,然后再将user添加到database中。
当使用header()改变页面位置时,请在下一行代码中加入exit()die(),如果您想立即退出并且不希望其他代码执行。
以下是添加了select语句的代码:
<?php
if ($_SERVER['REQUEST_METHOD'] == 'POST')
{
    //two passwords are the same
    if($_POST['password'] == $_POST['confirmedpassword']) 
    {
        $username = $mysqli->real_escape_string($_POST['username']);

        // You might consider using salt when storing passwords like this
        $salt = 'aNiceDay';
        $password = md5(md5($_POST['password'].$salt).$salt);

        $_SESSION['username'] = $username;
        $_SESSION['password'] = $password;

        $sql = "SELECT `username` FROM members WHERE `username` = '".$username."'";
        $result = $mysqli->query($sql);

        if(mysqli_num_rows($result) > 0)
        {
            echo 'User exists.';
            // Do something.
        }
        else
        {
            $sql = "INSERT INTO members(username, password) VALUES ('".$username."','".$password."')";

            if($mysqli->query($sql) === true)
            {
                $_SESSION['message'] = 'Success';
                header("location: login.php");
                // Important to put exit() after header so other code
                // doesn't get executed.
                exit();
            }
            else
            {
                $_SESSION['message'] = "User couldn't be added";
                echo "User couldn't be added.";
            }
        }
    }
    else
    {
        $_SESSION['message'] = "Passwords dont match";
    }
}
?>

做或不做,没有“尝试”。一个好的答案总是会解释做了什么以及为什么以这种方式完成,不仅为了OP,也为了未来访问SO的用户。 - Jay Blanchard
@JayBlanchard 我同意,我会编辑以提供更多的见解给未来的读者。虽然,昨天我正在进行类似的对话https://stackoverflow.com/#comment83630798_48303013 :) 谢谢。 - Ivan86

0

这样你就可以检查用户是否存在。

if ($_SERVER['REQUEST_METHOD'] == 'POST'){
        //two passwords are the same
        if($_POST['password'] == $_POST['confirmedpassword']) {

        $username = $mysqli->real_escape_string($_POST['username']);
        $password = md5($_POST['password']);

        $_SESSION['username'] = $username;
        $_SESSION['password'] = $password;

        //Check user
        $CheckUserIsExist = mysqli->query("SELECT uid FROM members WHERE username='$username'");
        if(mysqli_num_rows($CheckUserIsExist)==0 ){
        $sql = "INSERT INTO members(username, password)"
            . "VALUES ('$username','$password')";

            //if query is successful redirect to login.php
            if($mysqli->query($sql) === true)
                $_SESSION['message'] = 'Success';
                header("location: login.php");

    }
   } else{
      echo 'This username is already in use. Please use different username';
   }
   else{
        $_SESSION['message'] = "User couldn't be added";
   }
}
else{
    $_SESSION['message'] = "Passwords don't match";
}

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