<?php
// Включение отображения ошибок для отладки (убрать на продакшене)
ini_set('display_errors', 1);
ini_set('display_startup_errors', 1);
error_reporting(E_ALL);
// Проверка, была ли сессия уже запущена
if (session_status() === PHP_SESSION_NONE) {
session_start();
}
require_once 'config.php';
require_once 'includes/db.php';
require_once 'includes/auth.php';
// Проверка авторизации
require_login(); // Убедимся, что пользователь авторизован
global $pdo;
$user_id = $_SESSION['user_id'];
// Получаем данные текущего пользователя
$stmt = $pdo->prepare("SELECT id, login, name, city, website, about, avatar FROM users WHERE id = ?");
$stmt->execute([$user_id]);
$user = $stmt->fetch();
if (!$user) {
header('Location: index.php');
exit;
}
// Генерация CSRF-токена
$csrf_token = generate_csrf_token(); // Используем функцию из includes/auth.php
// Обработка загрузки аватара
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['upload_avatar'])) {
// Проверка CSRF-токена
if (!verify_csrf_token()) {
$error = "Недействительный запрос. Попробуйте снова.";
} else {
if (isset($_FILES['avatar']) && $_FILES['avatar']['error'] === UPLOAD_ERR_OK) {
$file = $_FILES['avatar'];
$fileName = basename($file['name']);
$fileType = strtolower(pathinfo($fileName, PATHINFO_EXTENSION));
$allowedTypes = ['jpg', 'jpeg', 'png', 'gif'];
if (in_array($fileType, $allowedTypes)) {
$newFileName = 'avatars/' . uniqid() . '.' . $fileType;
move_uploaded_file($file['tmp_name'], $newFileName);
// Удаляем старый аватар, если он есть
if (!empty($user['avatar']) && file_exists($user['avatar'])) {
unlink($user['avatar']);
}
$stmt = $pdo->prepare("UPDATE users SET avatar = ? WHERE id = ?");
$stmt->execute([$newFileName, $user_id]);
header('Location: profile.php');
exit;
} else {
$error = "Недопустимый формат файла. Используйте JPG, JPEG, PNG или GIF.";
}
} else {
$error = "Ошибка загрузки файла.";
}
}
}
// Обработка удаления аватара
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['delete_avatar'])) {
// Проверка CSRF-токена
if (!verify_csrf_token()) {
$error = "Недействительный запрос. Попробуйте снова.";
} else {
if (!empty($user['avatar']) && file_exists($user['avatar'])) {
unlink($user['avatar']);
}
$stmt = $pdo->prepare("UPDATE users SET avatar = NULL WHERE id = ?");
$stmt->execute([$user_id]);
header('Location: profile.php');
exit;
}
}
// Обработка обновления профиля (имя, город, сайт, о себе)
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['update_profile'])) {
// Проверка CSRF-токена
if (!verify_csrf_token()) {
$error = "Недействительный запрос. Попробуйте снова.";
} else {
$name = trim($_POST['name'] ?? '');
$city = trim($_POST['city'] ?? '');
$website = trim($_POST['website'] ?? '');
$about = trim($_POST['about'] ?? '');
try {
$stmt = $pdo->prepare("UPDATE users SET name = ?, city = ?, website = ?, about = ? WHERE id = ?");
$stmt->execute([$name, $city, $website, $about, $user_id]);
header('Location: profile.php');
exit;
} catch (PDOException $e) {
error_log("Ошибка обновления профиля: " . $e->getMessage());
$error = "Произошла ошибка при обновлении профиля. Обратитесь к администратору.";
}
}
}
// Обработка изменения пароля
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_POST['change_password'])) {
// Проверка CSRF-токена
if (!verify_csrf_token()) {
$error = "Недействительный запрос. Попробуйте снова.";
} else {
$current_password = trim($_POST['current_password'] ?? '');
$new_password = trim($_POST['new_password'] ?? '');
$confirm_password = trim($_POST['confirm_password'] ?? '');
if (!empty($current_password) && !empty($new_password) && !empty($confirm_password)) {
try {
$stmt = $pdo->prepare("SELECT password FROM users WHERE id = ?");
$stmt->execute([$user_id]);
$user_data = $stmt->fetch();
if (password_verify($current_password, $user_data['password'])) {
if ($new_password === $confirm_password) {
$hashed_password = password_hash($new_password, PASSWORD_DEFAULT);
$stmt = $pdo->prepare("UPDATE users SET password = ? WHERE id = ?");
$stmt->execute([$hashed_password, $user_id]);
header('Location: profile.php?success=1');
exit;
} else {
$error = "Новый пароль и подтверждение не совпадают.";
}
} else {
$error = "Текущий пароль неверен.";
}
} catch (PDOException $e) {
error_log("Ошибка изменения пароля: " . $e->getMessage());
$error = "Произошла ошибка при изменении пароля. Обратитесь к администратору.";
}
} else {
$error = "Все поля должны быть заполнены.";
}
}
}
?>
<!DOCTYPE html>
<html lang="ru">
<head>
<meta charset="UTF-8">
<meta name="viewport" content="width=device-width, initial-scale=1.0">
<link rel="stylesheet" href="assets/css/style.css">
<script src="assets/js/script.js" defer></script>
<title>Профиль — AstralForge</title>
</head>
<body>
<nav class="navbar">
<div class="navbar-container">
<?php if (isset($_SESSION['user_id'])): ?>
<div class="navbar-user">
<a href="profile.php" class="navbar-avatar-link">
<?php
$current_user = $pdo->prepare("SELECT avatar, login FROM users WHERE id = ?");
$current_user->execute([$_SESSION['user_id']]);
$current_user_data = $current_user->fetch();
?>
<?php if (empty($current_user_data['avatar'])): ?>
<span class="default-avatar navbar-avatar">?</span>
<?php else: ?>
<img src="<?php echo htmlspecialchars($current_user_data['avatar']); ?>" alt="Ваш аватар" class="navbar-avatar" onerror="this.replaceWith(document.createElement('span').classList.add('default-avatar', 'navbar-avatar').textContent='?');">
<?php endif; ?>
</a>
<a href="profile.php" class="navbar-username"><?php echo htmlspecialchars($current_user_data['login']); ?></a>
</div>
<div class="navbar-links">
<a href="index.php">Главная</a>
<a href="user_list.php">Пользователи</a>
<a href="messages.php">
<span class="message-icon"></span>
</a>
<?php if (isset($_SESSION['is_admin']) && $_SESSION['is_admin']) echo '<a href="admin/index.php">Админ-панель</a>'; ?>
<a href="logout.php">Выход</a>
</div>
<?php endif; ?>
</div>
</nav>
<div class="container">
<h1 class="profile-title">Профиль пользователя: <?php echo htmlspecialchars($user['login']); ?></h1>
<div class="profile-section">
<h2>Аватар</h2>
<div class="profile-header">
<?php if (empty($user['avatar'])): ?>
<span class="default-avatar user-avatar">?</span>
<?php else: ?>
<img src="<?php echo htmlspecialchars($user['avatar']); ?>" alt="Ваш аватар" class="user-avatar" onerror="this.replaceWith(document.createElement('span').classList.add('default-avatar', 'user-avatar').textContent='?');">
<?php endif; ?>
</div>
<form method="POST" enctype="multipart/form-data" class="avatar-form">
<input type="file" name="avatar" accept="image/jpeg,image/png,image/gif">
<input type="hidden" name="csrf_token" value="<?php echo htmlspecialchars($csrf_token); ?>">
<button type="submit" name="upload_avatar" class="chat-button">Загрузить аватар</button>
<?php if (!empty($user['avatar'])): ?>
<button type="submit" name="delete_avatar" class="chat-button" style="background: linear-gradient(45deg, #e74c3c, #c0392b);">Удалить аватар</button>
<?php endif; ?>
</form>
</div>
<div class="profile-section">
<h2>Редактировать профиль</h2>
<form method="POST" class="profile-form">
<div class="profile-details">
<div class="form-group">
<label for="name" class="info-label">Имя:</label>
<input type="text" id="name" name="name" value="<?php echo htmlspecialchars($user['name'] ?: ''); ?>" class="info-value" placeholder="Введите имя">
</div>
<div class="form-group">
<label for="city" class="info-label">Город:</label>
<input type="text" id="city" name="city" value="<?php echo htmlspecialchars($user['city'] ?: ''); ?>" class="info-value" placeholder="Введите город">
</div>
<div class="form-group">
<label for="website" class="info-label">Веб-сайт:</label>
<input type="url" id="website" name="website" value="<?php echo htmlspecialchars($user['website'] ?: ''); ?>" class="info-value" placeholder="Введите URL сайта">
</div>
<div class="form-group">
<label for="about" class="info-label">О себе:</label>
<textarea id="about" name="about" class="info-value info-about" placeholder="Расскажите о себе"><?php echo htmlspecialchars($user['about'] ?: ''); ?></textarea>
</div>
<input type="hidden" name="csrf_token" value="<?php echo htmlspecialchars($csrf_token); ?>">
<button type="submit" name="update_profile" class="chat-button">Сохранить изменения</button>
</div>
</form>
</div>
<div class="profile-section">
<h2>Изменить пароль</h2>
<form method="POST" class="profile-form">
<?php if (isset($error)): ?>
<p style="color: #e74c3c;"><?php echo htmlspecialchars($error); ?></p>
<?php elseif (isset($_GET['success']) && $_GET['success'] == 1): ?>
<p style="color: #2ecc71;">Пароль успешно изменён!</p>
<?php endif; ?>
<div class="profile-details">
<div class="form-group">
<label for="current_password" class="info-label">Текущий пароль:</label>
<input type="password" id="current_password" name="current_password" class="info-value" placeholder="Введите текущий пароль" required>
</div>
<div class="form-group">
<label for="new_password" class="info-label">Новый пароль:</label>
<input type="password" id="new_password" name="new_password" class="info-value" placeholder="Введите новый пароль" required>
</div>
<div class="form-group">
<label for="confirm_password" class="info-label">Подтвердите новый пароль:</label>
<input type="password" id="confirm_password" name="confirm_password" class="info-value" placeholder="Повторите новый пароль" required>
</div>
<input type="hidden" name="csrf_token" value="<?php echo htmlspecialchars($csrf_token); ?>">
<button type="submit" name="change_password" class="chat-button">Изменить пароль</button>
</div>
</form>
</div>
</div>
</body>
</html>