php - 检查 MySQL 数据库中的重复用户

标签 php mysql

<分区>

我想在注册用户时检查 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";
    }
}

最佳答案

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

$pass = password_hash($password, PASSWORD_BCRYPT);

password_hash() creates a new password hash using a strong one-way hashing algorithm.

然后用 password_verify() 测试它:

password_verify ( $passToTest , $knownPasswordHash );

更多功能在这里:http://php.net/password-hash , http://php.net/password-verify .

此外,由于您正在使用 MySQLi,请考虑使用准备好的语句,或者至少在将输入数据应用到数据库之前对其进行适当的过滤。 更多关于准备好的陈述:http://php.net/prepared-statements .

我添加了一个 select 语句 来检查 user 在添加 user 之前是否已经存在于 table 中> 到数据库

当使用 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";
    }
}
?>

关于php - 检查 MySQL 数据库中的重复用户,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47831685/

相关文章:

mysql - 一个查询中的多个条件的多个 COUNT() (MySQL)

mysql - 多个 mysql 选择查询

php - 如何在 Laravel 中加载任何内容之前设置 session 变量?

php - 从 Mysql 获取逗号分隔的字符串

javascript - 回显的数据不在正确的行中

MySQL InnoDB 优化

php - MySQL 查询可以工作,但不能在 PHP 中使用

javascript - 将有效的 Javascript Google map 代码添加到 WordPress

php - 如何在我的数据库中将类别 ID 格式化为字符串

php - 从 2 个表中选择列,然后在新表的 2 列中输出