password_verify 在真实密码上为假
password_verify is false on true password
我目前正在试验 password_hash() 和 password_verify() 方法..
所以我决定继续用它创造一点 login/register。
问题是每当我打开登录时输出是:
failed
我不知道为什么..我已经将我数据库中密码字段的长度设置为 255,但它仍然不起作用。
这是我的register.php:
<?php
require_once('db.php');
$username = mysqli_real_escape_string($db, $_GET['username']);
$password = mysqli_real_escape_string($db, $_GET['password']);
$p = password_hash($_GET['password'], PASSWORD_DEFAULT);
$stmt = $db->prepare("INSERT INTO users (username, password) VALUES (?,?)");
$stmt->bind_param('ss', $username, $p);
$stmt->execute();
$stmt->close();
$db->close();
?>
我的登录信息是这样的:
<?php
session_start();
error_reporting(0);
require_once('db.php');
function e($input) {
return htmlspecialchars($input, ENT_QUOTES, 'UTF-8');
}
$username = mysqli_real_escape_string($db, $_GET['username']);
$password = mysqli_real_escape_string($db, $_GET['password']);
$stmt = $db->prepare("SELECT username, password FROM users WHERE username = ?");
$stmt->bind_param('s', $username);
$stmt->execute();
$stmt->bind_result($username, $password);
$row = $stmt->fetch();
if (!empty($row)) {
if (password_verify($_GET['password'], $row['password'])) {
echo 'success';
}
else
{
echo 'failed';
}
}
else
{
echo "This user does not exist";
}
$stmt->close();
$db->close();
?>
我不知道如何让它工作:/
$stmt->fetch();
没有return数据。它将数据绑定到bind_result()
中定义的变量。
所以在 $stmt->fetch()
之后,您将在 $username
中拥有用户名,在 $password
中拥有密码。
所以,真正应该比较的是:
if ($stmt->fetch()) {
// here
if (password_verify($_GET['password'], $password)) {
echo 'success';
}
else
{
echo 'failed';
}
}
else
{
echo "This user does not exist";
}
我目前正在试验 password_hash() 和 password_verify() 方法..
所以我决定继续用它创造一点 login/register。
问题是每当我打开登录时输出是:
failed
我不知道为什么..我已经将我数据库中密码字段的长度设置为 255,但它仍然不起作用。
这是我的register.php:
<?php
require_once('db.php');
$username = mysqli_real_escape_string($db, $_GET['username']);
$password = mysqli_real_escape_string($db, $_GET['password']);
$p = password_hash($_GET['password'], PASSWORD_DEFAULT);
$stmt = $db->prepare("INSERT INTO users (username, password) VALUES (?,?)");
$stmt->bind_param('ss', $username, $p);
$stmt->execute();
$stmt->close();
$db->close();
?>
我的登录信息是这样的:
<?php
session_start();
error_reporting(0);
require_once('db.php');
function e($input) {
return htmlspecialchars($input, ENT_QUOTES, 'UTF-8');
}
$username = mysqli_real_escape_string($db, $_GET['username']);
$password = mysqli_real_escape_string($db, $_GET['password']);
$stmt = $db->prepare("SELECT username, password FROM users WHERE username = ?");
$stmt->bind_param('s', $username);
$stmt->execute();
$stmt->bind_result($username, $password);
$row = $stmt->fetch();
if (!empty($row)) {
if (password_verify($_GET['password'], $row['password'])) {
echo 'success';
}
else
{
echo 'failed';
}
}
else
{
echo "This user does not exist";
}
$stmt->close();
$db->close();
?>
我不知道如何让它工作:/
$stmt->fetch();
没有return数据。它将数据绑定到bind_result()
中定义的变量。
所以在 $stmt->fetch()
之后,您将在 $username
中拥有用户名,在 $password
中拥有密码。
所以,真正应该比较的是:
if ($stmt->fetch()) {
// here
if (password_verify($_GET['password'], $password)) {
echo 'success';
}
else
{
echo 'failed';
}
}
else
{
echo "This user does not exist";
}