Обучение/Помощь новичкам | Подскажите где я допустил ошибку???
Не работает авторизация
В бд запись идет при реги, пароль хешируется а при авторизации пишит "ошибка авторизации"
login.php
________
посл. ред. 16.10.2025 в 10:47; всего 2 раз(а); by So4nOFF
В бд запись идет при реги, пароль хешируется а при авторизации пишит "ошибка авторизации"
login.php
php
<?php
require_once __DIR__ . '/includes/functions.php';
$error = '';
if (is_logged_in()) {
redirect(SITE_URL . '/profile/');
}
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$username = trim($_POST['username'] ?? '');
$password = $_POST['password'] ?? '';
if (empty($username) || empty($password)) {
$error = "Введите логин и пароль.";
} else {
$stmt = execute_query("SELECT id, username, password, is_admin, avatar, short_link FROM users WHERE username = ?", [$username], 's');
if ($stmt && $stmt->num_rows === 1) {
$user = $stmt->get_result()->fetch_assoc();
if (verify_password($password, $user['password'])) {
$_SESSION['user_id'] = $user['id'];
$_SESSION['username'] = $user['username'];
$_SESSION['is_admin'] = (bool)$user['is_admin'];
$_SESSION['avatar'] = $user['avatar'];
$_SESSION['short_link'] = $user['short_link'];
execute_query("UPDATE users SET last_login = NOW() WHERE id = ?", [$user['id']], 'i');
redirect(SITE_URL . '/profile/');
}
} else {
$error = "Ошибка авторизации!";
}
$stmt->close();
}
}
$pageTitle = "АВТОРИЗАЦИЯ";
require_once __DIR__ . '/includes/templates/header.php';
?>
<section class="auth-form-container card">
<h2>АВТОРИЗАЦИЯ</h2>
<?php if ($error): ?>
<p class="error-message"><?php echo sanitize_output($error); ?></p>
<?php endif; ?>
<form action="login.php" method="POST">
<div class="form-group">
<input type="text" id="username" name="username" class="form-control" placeholder="Введите Логин" required autocomplete="username" value="<?php echo sanitize_output($_POST['username'] ?? ''); ?>">
</div>
<div class="form-group">
<input type="password" id="password" name="password" class="form-control" placeholder="Введите Пароль" required autocomplete="current-password">
</div>
<button type="submit" class="btn btn-primary">Войти</button>
<p class="mt-2"><a href="<?php echo SITE_URL; ?>/recover.php">Забыли пароль?</a></p>
<p class="mt-2">Нет аккаунта? <a href="<?php echo SITE_URL; ?>/register.php">Зарегистрироваться</a></p>
</form>
</section>
<?php require_once __DIR__ . '/includes/templates/footer.php'; ?>
________
посл. ред. 16.10.2025 в 10:47; всего 2 раз(а); by So4nOFF
register.php
php
<?php
require_once __DIR__ . '/includes/functions.php';
$error = '';
if (is_logged_in()) {
redirect(SITE_URL . '/profile/');
}
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$username = trim($_POST['username'] ?? '');
$email = trim($_POST['email'] ?? '');
$password = $_POST['password'] ?? '';
$password_confirm = $_POST['password_confirm'] ?? '';
if (empty($username) || empty($email) || empty($password) || empty($password_confirm)) {
$error = "Все поля обязательны для заполнения.";
} elseif (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
$error = "Некорректный формат email.";
} elseif (strlen($username) < 3 || strlen($username) > 50) {
$error = "Логин должен быть от 3 до 50 символов.";
} elseif (!preg_match('/^[a-zA-Z0-9_]+$/', $username)) {
$error = "Логин может содержать только латинские буквы, цифры и нижнее подчеркивание.";
} elseif (strlen($password) < 6) {
$error = "Пароль должен быть не менее 6 символов.";
} elseif ($password !== $password_confirm) {
$error = "Пароли не совпадают.";
} else {
$existing_user = fetch_one("SELECT id FROM users WHERE username = ? OR email = ?", [$username, $email], 'ss');
if ($existing_user) {
$error = "Пользователь с таким логином или email уже существует.";
} else {
$hashed_password = hash_password($password);
$short_link = generate_unique_short_link($username);
$stmt = execute_query(
"INSERT INTO users (username, email, password, short_link) VALUES (?, ?, ?, ?)",
[$username, $email, $hashed_password, $short_link], 'ssss'
);
if ($stmt && $stmt->affected_rows === 1) {
redirect(SITE_URL . '/login.php');
unset($_POST);
} else {
$error = "Ошибка регистрации!";
}
$stmt->close();
}
}
}
$pageTitle = "РЕГИСТРАЦИЯ";
require_once __DIR__ . '/includes/templates/header.php';
?>
<section class="auth-form-container card">
<h2>РЕГИСТРАЦИЯ</h2>
<?php if ($error): ?>
<p class="error-message"><?php echo sanitize_output($error); ?></p>
<?php endif; ?>
<form action="register.php" method="POST">
<div class="form-group">
<input type="text" id="username" name="username" value="<?php echo sanitize_output($_POST['username'] ?? ''); ?>" class="form-control" placeholder="Введите Логин" required autocomplete="username">
</div>
<div class="form-group">
<input type="email" id="email" name="email" value="<?php echo sanitize_output($_POST['email'] ?? ''); ?>" class="form-control" placeholder="Введите Email" required autocomplete="email">
</div>
<div class="form-group">
<input type="password" id="password" name="password" class="form-control" placeholder="Введите Пароль" required autocomplete="new-password">
</div>
<div class="form-group">
<input type="password" id="password_confirm" name="password_confirm" class="form-control" placeholder="Повторите Пароль" required autocomplete="new-password">
</div>
<button type="submit" class="btn btn-primary">Регистрация</button>
<p class="mt-2">Уже есть аккаунт? <a href="<?php echo SITE_URL; ?>/login.php">Войти</a></p>
</form>
</section>
<?php require_once __DIR__ . '/includes/templates/footer.php'; ?>
functions.php
php
/**
* Хеширование пароля с использованием PASSWORD_BCRYPT.
* @param string $password Пароль в чистом виде.
* @return string Хешированный пароль.
*/
if (!function_exists('hash_password')) {
function hash_password($password) {
return password_hash($password, PASSWORD_BCRYPT);
}
}
/**
* Проверка пароля.
* @param string $password Пароль в чистом виде, введенный пользователем.
* @param string $hashed_password Хешированный пароль из базы данных.
* @return bool True, если пароли совпадают, false в противном случае.
*/
if (!function_exists('verify_password')) {
function verify_password($password, $hashed_password) {
return password_verify($password, $hashed_password);
}
}


Не работает авторизация
В бд запись идет при реги, пароль хешируется а при авторизации пишит "ошибка авторизации"
login.php
php
<?php
require_once __DIR__ . '/includes/functions.php';
$error = '';
if (is_logged_in()) {
redirect(SITE_URL . '/profile/');
}
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$username = trim($_POST['username'] ?? '');
$password = $_POST['password'] ?? '';
if (empty($username) || empty($password)) {
$error = "Введите логин и пароль.";
} else {
$stmt = execute_query("SELECT id, username, password, is_admin, avatar, short_link FROM users WHERE username = ?", [$username], 's');
if ($stmt && $stmt->num_rows === 1) {
$user = $stmt->get_result()->fetch_assoc();
if (verify_password($password, $user['password'])) {
$_SESSION['user_id'] = $user['id'];
$_SESSION['username'] = $user['username'];
$_SESSION['is_admin'] = (bool)$user['is_admin'];
$_SESSION['avatar'] = $user['avatar'];
$_SESSION['short_link'] = $user['short_link'];
execute_query("UPDATE users SET last_login = NOW() WHERE id = ?", [$user['id']], 'i');
redirect(SITE_URL . '/profile/');
}
} else {
$error = "Ошибка авторизации!";
}
$stmt->close();
}
}
$pageTitle = "АВТОРИЗАЦИЯ";
require_once __DIR__ . '/includes/templates/header.php';
?>
<section class="auth-form-container card">
<h2>АВТОРИЗАЦИЯ</h2>
<?php if ($error): ?>
<p class="error-message"><?php echo sanitize_output($error); ?></p>
<?php endif; ?>
<form action="login.php" method="POST">
<div class="form-group">
<input type="text" id="username" name="username" class="form-control" placeholder="Введите Логин" required autocomplete="username" value="<?php echo sanitize_output($_POST['username'] ?? ''); ?>">
</div>
<div class="form-group">
<input type="password" id="password" name="password" class="form-control" placeholder="Введите Пароль" required autocomplete="current-password">
</div>
<button type="submit" class="btn btn-primary">Войти</button>
<p class="mt-2"><a href="<?php echo SITE_URL; ?>/recover.php">Забыли пароль?</a></p>
<p class="mt-2">Нет аккаунта? <a href="<?php echo SITE_URL; ?>/register.php">Зарегистрироваться</a></p>
</form>
</section>
<?php require_once __DIR__ . '/includes/templates/footer.php'; ?>
php
<?php
require_once __DIR__ . '/includes/functions.php';
$error = '';
if (is_logged_in()) {
redirect(SITE_URL . '/profile/');
}
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
$username = trim($_POST['username'] ?? '');
$password = $_POST['password'] ?? '';
if (empty($username) || empty($password)) {
$error = "Введите логин и пароль.";
} else {
$stmt = execute_query("SELECT id, username, password, is_admin, avatar, short_link FROM users WHERE username = ?", [$username], 's');
if ($stmt) {
if ($stmt->num_rows === 1) {
$user = $stmt->get_result()->fetch_assoc();
$stmt->close();
if (verify_password($password, $user['password'])) {
$_SESSION['user_id'] = $user['id'];
$_SESSION['username'] = $user['username'];
$_SESSION['is_admin'] = (bool)$user['is_admin'];
$_SESSION['avatar'] = $user['avatar'];
$_SESSION['short_link'] = $user['short_link'];
execute_query("UPDATE users SET last_login = NOW() WHERE id = ?", [$user['id']], 'i');
redirect(SITE_URL . '/profile/');
} else {
$error = "Неверный логин или пароль!";
}
} else {
$stmt->close();
$error = "Пользователь не найден!";
}
} else {
$error = "Ошибка базы данных!";
}
}
}
$pageTitle = "АВТОРИЗАЦИЯ";
require_once __DIR__ . '/includes/templates/header.php';
?>
<section class="auth-form-container card">
<h2>АВТОРИЗАЦИЯ</h2>
<?php if ($error): ?>
<p class="error-message"><?php echo sanitize_output($error); ?></p>
<?php endif; ?>
<form action="login.php" method="POST">
<div class="form-group">
<input type="text" id="username" name="username" class="form-control" placeholder="Введите Логин" required autocomplete="username" value="<?php echo sanitize_output($_POST['username'] ?? ''); ?>">
</div>
<div class="form-group">
<input type="password" id="password" name="password" class="form-control" placeholder="Введите Пароль" required autocomplete="current-password">
</div>
<button type="submit" class="btn btn-primary">Войти</button>
<p class="mt-2"><a href="<?php echo SITE_URL; ?>/recover.php">Забыли пароль?</a></p>
<p class="mt-2">Нет аккаунта? <a href="<?php echo SITE_URL; ?>/register.php">Зарегистрироваться</a></p>
</form>
</section>
<?php require_once __DIR__ . '/includes/templates/footer.php'; ?>

Fatal error: Uncaught Error: Call to a member function fetch_assoc() on boolean in... login.php on line 21
покажи функцию execute_query с functions.php

php
function execute_query($sql, $params = [], $param_types = '') {
global $mysqli;
$stmt = $mysqli->prepare($sql);
if ($stmt === false) {
error_log("Ошибка подготовки запроса: " . $mysqli->error . " SQL: " . $sql);
return false;
}