Php mysqli_query()希望参数2是字符串,对象在

Php mysqli_query()希望参数2是字符串,对象在,php,mysqli,Php,Mysqli,上面的错误不断出现,而不是重定向到index.php 代码应该在index.php上启动管理员用户会话。 它最初基于MySQL,然后我使用MySQL <?php $a = $_POST["username"]; $b = $_POST["password"]; $conn = new mysqli("localhost", "root", "", "..."); $query = $conn->query("SELECT * FROM users WHERE usernam

上面的错误不断出现,而不是重定向到index.php

代码应该在index.php上启动管理员用户会话。 它最初基于MySQL,然后我使用MySQL

<?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
{

分配
$query
变量时,不需要调用
$conn->query
。只需分配字符串。下一行执行查询

$query = "SELECT * FROM users WHERE username='$a' AND          password='$b' AND isadmin=1";

您的代码执行查询,然后再次尝试执行结果,就像它是查询字符串一样。

您的主要错误是调用
query()
方法两次。
$conn->query
mysqli\u query()
都是一回事,当您将一个查询结果传递给另一个查询结果时,您会得到这个神秘的错误

另一个问题是,您对mysqli的连接不符合标准。请参阅以了解有关连接的更多信息。您还应该使用
mysqli_报告启用错误报告(mysqli_报告错误| mysqli_报告严格)而不是使用
或die(mysqli_error($conn))手动检查错误

您应该使用参数化的准备语句,而不是手动生成查询。它们由或提供。永远不要相信任何形式的输入!即使您的查询仅由受信任的用户执行

切勿以明文或使用MD5/SHA1存储密码仅存储使用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: ...');`
}

另外,请注意不要在SQL语句中直接使用用户输入,如
$\u POST
(即使映射到变量)!您应该改为使用,将
$\u POST
变量绑定到参数。鉴于上述代码,您存在严重的安全漏洞。有关如何防止PHP中的SQL注入的更多信息,请参阅:)谢谢,在我考虑安全性之前,我正在尝试让基本功能正常工作。我不确定哪个答案适用于我的问题,我不知道可能有那么多问题,代码非常简短明了,除非我遗漏了一些东西
$conn->query()
mysqli\u query
做同样的事情,它们是不同的编程风格,请阅读。注意它们的accept参数和返回值。@ozeol不认为准备好的语句增加了安全性,它们应该是基本功能的一部分。您在那里看到了什么,建议您需要调用
$conn->query()
,还需要调用
mysqli\u query()
?对,但是它说在哪里调用
mysqli\u query($mysqli$result)