mysqli_query()期望参数2为字符串,对象在

时间:2019-10-30 21:19:22

标签: php mysqli

上述错误不断出现,而不是重定向到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
{

2 个答案:

答案 0 :(得分:0)

您的主要错误是您两次调用query()方法。 $conn->querymysqli_query()都是同一件事,当您将一个结果传递给另一个结果时,您会得到这个错误。

另一个问题是您与mysqli的连接不符合标准。请参阅https://phpdelusions.net/mysqli/mysqli_connect,以了解有关连接的更多信息。您还应该使用mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT);启用错误报告,而不是使用or die(mysqli_error($conn));

手动检查错误。

您应该使用参数化的准备好的语句,而不是手动构建查询。它们由PDOMySQLi提供。永远不要相信任何输入!即使您的查询仅由受信任的用户执行,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";

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