mysqli_query () ожидает, что параметр 2 будет строкой, объект задан в - PullRequest
0 голосов
/ 31 октября 2019

Вышеприведенная ошибка продолжает появляться вместо перенаправления на 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 голосов
/ 31 октября 2019

Ваша основная ошибка в том, что вы вызываете метод query() дважды. И $conn->query, и mysqli_query() - это одно и то же, и когда вы передаете результат одного другому, вы получаете эту загадочную ошибку.

Другая проблема заключается в том, что ваше соединение с MySQL не соответствует стандартам. См. https://phpdelusions.net/mysqli/mysqli_connect, чтобы узнать больше о подключении. Вы также должны включить отчеты об ошибках с помощью mysqli_report(MYSQLI_REPORT_ERROR | MYSQLI_REPORT_STRICT); вместо ручной проверки на ошибки с помощью or die(mysqli_error($conn));

Вы должны использовать параметризованные подготовленные операторы вместо того, чтобы строить запросы вручную. Они предоставляются PDO или MySQLi . Никогда не доверяйте никаким данным! Даже когда ваши запросы выполняются только доверенными пользователями, вы все равно рискуете испортить ваши данные .

Никогда не храните пароли в виде открытого текста или используя MD5 / SHA1! Храните только хэши паролей, созданные с использованием PHP password_hash(), которые затем можно проверить с помощью password_verify(). Взгляните на этот пост: Как использовать password_hash и узнать больше о bcrypt и хешировании паролей в 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: ...');`
}
0 голосов
/ 31 октября 2019

Вам не нужно вызывать $conn->query при назначении переменной $query. Просто назначьте строку. Следующая строка выполняет запрос.

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

Ваш код выполняет запрос, затем пытается выполнить результат снова, как если бы это была строка запроса.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...