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