这个问题已经有了答案:
check if row exists with 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";
    }
}

最佳答案

我在您的saltmd5中添加了一些password以使它看起来更安全,但实际上这个解决方案也不安全。要加密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添加到user之前,我添加了一个table来检查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";
    }
}
?>

09-30 22:32
查看更多