我正在尝试做一个简单的登录事情,如果你打电话的话。我正在使用MySQLi,到目前为止它看起来不错。
<?php
ob_start();
$myusername = @$_POST['username'];
$mypassword = @$_POST['password'];
if (isset($_POST['logged'])) {
$link->escape_string($myusername);
$link->escape_string($mypassword);
$stmt = $link->prepare("SELECT * FROM members WHERE username=?") or die ($link->error);
$stmt->bind_param('s', $myusername);
$stmt->execute() or die($stmt->error);
$stmt->store_result();
$count = $stmt->num_rows();
if (!empty($myusername) && !empty($mypassword)) {
if($count == 1) {
$rs = $link->query("SELECT * FROM members WHERE username='$myusername'");
$row = $rs->fetch_array(MYSQLI_ASSOC);
if (password_verify($mypassword, $row['password'])) {
$_SESSION['username'] = $myusername;
$_SESSION['first_name'] = $row['first_name'];
$_SESSION['last_name'] = $row['last_name'];
$_SESSION['email'] = $row['email'];
$_SESSION['loggedIn'] = true;
header("Location: login.php");
}
else {
echo "<p style=\"color: red\">Wrong Password</p>";
}
}
else {
echo "<p style=\"color: red\">Wrong Username</p>";
}
}
else {
echo "<p style=\"color: red\">Fill in all fields</p>";
}
}
?>
它在localhost上运行良好,但遗憾的是在我的域上不起作用,因为无论何时按下登录按钮,表单都会消失,而我什么都没有留下。我联系了域名提供商,他们告诉我这可能是我的代码中的内容。我非常确定我的代码是好的,因为它可以在localhost服务器上运行。
为了节省麻烦,我想也许我可以使用替代方案。但我记得我正在使用crypt()
将密码存储到数据库中,我相信这些密码是随机生成的。有没有其他方法可以查看用户键入的加密版本是否与数据库中的内容匹配?
答案 0 :(得分:9)
password_verify
可用于PHP&gt; = 5.5.0,因此您的托管可能没有所需的PHP版本。
请参阅:http://docs.php.net/manual/en/function.password-verify.php
您可以尝试这样的事情:
crypt($row['password'], $mypassword) == $mypassword
答案 1 :(得分:8)
password_hash
及其随附的password_verify
在PHP中可用&gt; = 5.5
但是有一个兼容性库/ backport使它们可用于PHP&gt; = 5.3.10 https://github.com/ircmaxell/password_compat