Php mysqli_query()希望参数2是字符串,对象在
上面的错误不断出现,而不是重定向到index.php 代码应该在index.php上启动管理员用户会话。 它最初基于MySQL,然后我使用MySQLPhp 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
<?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)
?