这个问题已经有了答案:
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";
}
}
最佳答案
我在您的salt
md5
中添加了一些password
以使它看起来更安全,但实际上这个解决方案也不安全。要加密PHP
中的密码,建议使用如下password_hash()
函数:
$pass = password_hash($password, PASSWORD_BCRYPT);
password_hash()使用强单向哈希算法创建新的密码哈希。
然后用
password_verify()
测试它:password_verify ( $passToTest , $knownPasswordHash );
这里还有更多的功能:http://php.net/password-hash,http://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";
}
}
?>