我正在将用户添加到我的数据库中,并尝试使用password_hash和他们提交的密码。添加后,用户需要能够登录。我正在尝试使用verify_password验证密码,但该密码始终返回false。
我已经能够使用password_hash添加用户,但是无法使用password_verify方法登录添加的用户。奇怪的是,如果我在phpmyadmin中添加了一个MD5用户,则可以使用md5($ password)毫无问题地将他们登录。如果我通过代码将用户添加为md5,即使密码匹配,也无法使用此方法登录。
我一直在搜索,似乎无法弄清楚我在做什么。
这是为了测试我是否可以登录用户。我知道MD5不是一个好方法。如果我手动添加用户并在phpmyadmin中使用MD5方法,则此代码有效:
if(md5($password) === $hashed) {
// log in user code
}
添加密码时,我将其加密为:
$password = md5($_POST['password']);
然后将其添加到数组中并将其插入数据库中。再次,这只是一个测试。
当我尝试使用password_hash函数(这是我想做的)时,password_verify无法正常工作。这就是我想要做的。
插入功能:
function insertAgent($conn) {
$firstname = testdata($_POST['firstname']);
$middlename = testdata($_POST['middlename']);
$lastname = testdata($_POST['lastname']);
$phone = testdata($_POST['phone']);
$email = testdata($_POST['email']);
$position = testdata($_POST['position']);
$agency = testdata($_POST['agency']);
$password = password_hash($_POST['password'], PASSWORD_DEFAULT);
$agentArray[] = array(
'AgentId' => '',
'AgtFirstName' => $firstname,
'AgtMiddleInitial' => $middlename,
'AgtLastName' => $lastname,
'AgtBusPhone' => $phone,
'AgtEmail' => $email,
'AgtPosition' => $position,
'AgencyId' => $agency,
'password' => $password
);
foreach ($agentArray as $array) {
$query = "INSERT INTO agents";
$result = $conn->query($query);
$query .= " (`".implode("`, `", array_keys($agentArray[0]))."`) VALUES";
foreach ($agentArray as $array) {
$query .= " ('".implode("', '", $array)."'),";
}
$query = substr($query,0,-1); // remove last comma
$result = mysqli_query($conn, $query) or die(mysql_error());
登录:
if(!empty($_POST["login"])) {
$useremail = trim($_POST['useremail']);
$password = trim($_POST['password']);
$pass_query = mysqli_query($conn, "SELECT password FROM agents WHERE AgtEmail='$useremail'");
$pass = mysqli_fetch_assoc($pass_query);
$hashed = $pass['password'];
if(password_verify($password, $hashed)) {
$result = mysqli_query($conn, "SELECT * FROM agents WHERE AgtEmail='" . $useremail . "'");
$row = mysqli_fetch_assoc($result);
if(is_array($row)) {
$_SESSION["AgentId"] = $row['AgentId'];
}
} else {
$message = "<p class='errorForm'>Invalid Email or Password</p>";
}
}
数据库中的散列版本($散列)与用户的md5版本匹配,但除非我手动添加,否则它将导致错误。