我试图让我的新登录系统开始工作,我创建了一个简单的密码,并使用下一个代码将散列传递到我的 MySQL 表
makepass.php
<?php
$password = "testpass";
$hash = password_hash($password, PASSWORD_DEFAULT);
echo $hash;
?>
dologin.php
<?php
error_reporting(E_ALL);
ini_set('display_errors', 1);
include('includes/functions.php');
session_start();
if(isset($_POST['login'])) {
if(isset($_POST['username'])) {
if(isset($_POST['password'])) {
$username = $_POST['username'];
$dbconn = mysqli_query($query, "SELECT * FROM cm_users WHERE Username = '$username'") or die(mysqli_error($query));
foreach ($dbconn as $user) {
if (password_verify($_POST['password'], $user['Password'])) {
$_SESSION['user'] = $user['Username'];
} else {
echo 'Invalid password!';
}
}
} else {
echo 'Invalid username!';
}
}
}
?>
所以我尝试使用“testpass”登录,哇哦:密码无效!
有什么想法吗? Afaik 它应该没问题,我没有看到任何语法或其他问题。
最佳答案
你不应该为此使用 foreach
,但首先要查询,获取数组(你没有使用)然后将其与行的进行比较密码。
旁注:将 ("xxx", "xxx", "xxx", "xxx")
替换为您自己的凭据。但是,使用 $query
不是您应该用作连接变量的词,因为它很容易混淆。
(甚至我在写答案时也很困惑)。使用 $connection
或 $conn
并且我已经在此处更改了它们,因此请改用它。
$conn = new mysqli("xxx", "xxx", "xxx", "xxx");
if ($conn->connect_error) {
die('Connect Error (' . $conn->connect_errno . ') '
. $conn->connect_error);
}
if(isset($_POST['login'])) {
$username = $_POST['username']; // you could use a conditional !empty() here
$password = $_POST['password']; // here also
$query = "SELECT * FROM cm_users WHERE Username = '".$conn->real_escape_string($username)."';";
$result = $conn->query($query);
// error checking on the query
if (!$result) {
echo "<p>There was an error in query: $query</p>";
echo $conn->error;
}
$row_hash = $result->fetch_array();
if (password_verify($password, $row_hash['Password'])) {
echo "Welcome!";
}
else{
echo "Invalid";
}
}
- 一旦成功,您就可以在之后添加其他好东西。
旁注:绝对确保您的 POST 数组保存值并且不包含空格。如果有,使用 trim()
。
即:
$username = trim($_POST['username']);
$password = trim($_POST['password']);
同时检查您的查询是否有错误:
和错误报告:
关于php - 登录效果不佳,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34459222/