Ваша основная ошибка в том, что вы вызываете метод 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: ...');`
}