$full_name, 'city' => $city, 'email' => $email, 'phone' => $phone ]; header('Location: ../register.php'); exit(); } // Подключаемся к базе данных $db = Database::getInstance()->getConnection(); try { // Проверяем, существует ли пользователь с таким email $checkStmt = $db->prepare("SELECT user_id FROM users WHERE email = ?"); $checkStmt->execute([$email]); if ($checkStmt->fetch()) { $_SESSION['registration_errors'] = ['Пользователь с таким email уже существует']; $_SESSION['old_data'] = [ 'fio' => $full_name, 'city' => $city, 'email' => $email, 'phone' => $phone ]; header('Location: ../register.php'); exit(); } // Хэшируем пароль $password_hash = password_hash($password, PASSWORD_DEFAULT); // Определяем, является ли пользователь администратором $is_admin = false; $admin_emails = ['admin@aeterna.ru', 'administrator@aeterna.ru', 'aeterna@mail.ru']; if (in_array(strtolower($email), $admin_emails)) { $is_admin = true; } // Используем CAST для правильной передачи boolean в PostgreSQL $stmt = $db->prepare(" INSERT INTO users (email, password_hash, full_name, phone, city, is_admin, is_active) VALUES (?, ?, ?, ?, ?, CAST(? AS boolean), TRUE) RETURNING user_id "); $stmt->execute([ $email, $password_hash, $full_name, $phone, $city, $is_admin ? 'true' : 'false' // Строковые значения true/false для CAST ]); $user_id = $stmt->fetchColumn(); if (!$user_id) { throw new Exception('Ошибка при создании пользователя: user_id не получен'); } // Проверяем, что пользователь действительно создался $verifyStmt = $db->prepare("SELECT user_id, email, password_hash FROM users WHERE user_id = ?"); $verifyStmt->execute([$user_id]); $verifyUser = $verifyStmt->fetch(PDO::FETCH_ASSOC); if (!$verifyUser) { throw new Exception('Ошибка: пользователь не найден после создания'); } // Проверяем, что пароль сохранился правильно if (empty($verifyUser['password_hash'])) { throw new Exception('Ошибка: пароль не сохранен'); } // Автоматически авторизуем пользователя $_SESSION['user_id'] = $user_id; $_SESSION['user_email'] = $email; $_SESSION['full_name'] = $full_name; $_SESSION['user_phone'] = $phone; $_SESSION['user_city'] = $city; $_SESSION['isLoggedIn'] = true; $_SESSION['isAdmin'] = (bool)$is_admin; $_SESSION['login_time'] = time(); // Обновляем время последнего входа $updateStmt = $db->prepare("UPDATE users SET last_login = CURRENT_TIMESTAMP WHERE user_id = ?"); $updateStmt->execute([$user_id]); // Перенаправляем на главную или каталог $_SESSION['registration_success'] = 'Регистрация прошла успешно! ' . ($is_admin ? 'Вы зарегистрированы как администратор.' : 'Добро пожаловать в AETERNA!'); header('Location: ../catalog.php'); exit(); } catch (PDOException $e) { // Логируем полную ошибку для отладки error_log("Registration DB Error: " . $e->getMessage()); error_log("SQL State: " . $e->getCode()); error_log("Email: " . $email); $_SESSION['registration_errors'] = ['Ошибка базы данных: ' . $e->getMessage()]; $_SESSION['old_data'] = [ 'fio' => $full_name, 'city' => $city, 'email' => $email, 'phone' => $phone ]; header('Location: ../register.php'); exit(); } catch (Exception $e) { error_log("Registration Error: " . $e->getMessage()); $_SESSION['registration_errors'] = [$e->getMessage()]; header('Location: ../register.php'); exit(); } } else { // Если запрос не POST, перенаправляем на форму регистрации header('Location: register.php'); exit(); } ?>