上述错误不断出现,而不是重定向到index.php
代码应在index.php上启动管理员用户会话。 它最初基于MySQL,然后我使用了MYSqli
<?php
$a = $_POST["username"];
$b = $_POST["password"];
$conn = new mysqli("localhost", "root", "", "...");
$query = $conn->query("SELECT * FROM users WHERE username='$a' AND password='$b' AND isadmin=1");
$result = mysqli_query($conn, $query) or die(mysqli_error($conn));
$num_rows = mysqli_num_rows($result);
session_start();
if ($result)
{
$_SESSION["admin"] = $_POST["username"];
header ("Location: index.php");
}
elseif (!$result)
{
$_SESSION["gatekeeper"] = $_POST["username"];
header ("Location: index.php");
}
else
{
答案 0 :(得分:0)
您的主要错误是您两次调用query()
方法。 $conn->query
和mysqli_query()
都是同一件事,当您将一个结果传递给另一个结果时,您会得到这个错误。
另一个问题是您与mysqli的连接不符合标准。请参阅https://phpdelusions.net/mysqli/mysqli_connect,以了解有关连接的更多信息。您还应该使用mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
启用错误报告,而不是使用or die(mysqli_error($conn));
您应该使用参数化的准备好的语句,而不是手动构建查询。它们由PDO或MySQLi提供。永远不要相信任何输入!即使您的查询仅由受信任的用户执行,you are still in risk of corrupting your data。
从不以明文形式或使用MD5 / SHA1存储密码!仅存储使用PHP的password_hash()
创建的密码哈希,然后可以使用password_verify()
进行验证。看一下这篇文章:How to use password_hash,并了解有关bcrypt & password hashing in PHP
我还没有解决所有问题,我将其作为练习留给您,但这应该作为正确的mysqli代码外观的指南。
<?php
session_start();
mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);
$conn = new mysqli("localhost", "root", "", "...");
$conn->set_charset('utf8mb4');
$stmt = $conn->prepare('SELECT * FROM users WHERE username=? AND password=? AND isadmin=1');
$stmt->bind_param('ss', $_POST["username"], $_POST["password"]);
$stmt->execute();
$result = $stmt->get_result();
$firstRow = $result->fetch_assoc(); // See https://phpdelusions.net/mysqli/check_value
if ($firstRow) {
$_SESSION["admin"] = $_POST["username"];
exit(header("Location: index.php")); // Always `exit()` after `header('Location: ...');`
} elseif (!$result) {
$_SESSION["gatekeeper"] = $_POST["username"];
exit(header("Location: index.php")); // Always `exit()` after `header('Location: ...');`
}
答案 1 :(得分:-2)
分配$conn->query
变量时无需调用$query
。只需分配字符串即可。下一行执行查询。
$query = "SELECT * FROM users WHERE username='$a' AND password='$b' AND isadmin=1";
您的代码执行查询,然后尝试再次执行结果,就好像它是查询字符串一样。