Исправление багов авторизации, корзины и админки
- Исправлено выпадающее меню профиля (hover-баг с margin-top) - Исправлена авторизация: правильные пути к API (api/auth.php) - Исправлены ссылки на админку (admin/index.php вместо admin_panel.php) - Исправлены пути API корзины в catalog.php и checkout.php - Добавлена форма добавления/редактирования товаров в админке - Исправлены кнопки +/- в корзине (улучшена обработка AJAX) - Исправлена регистрация: правильные пути и обработка boolean в PostgreSQL - Добавлена миграция для назначения прав админа пользователю admin@mail.ru - Удален тестовый блок 'Быстрый вход' для неавторизованных пользователей - Улучшена обработка ошибок во всех API-эндпоинтах
This commit is contained in:
182
api/register_handler.php
Normal file
182
api/register_handler.php
Normal file
@@ -0,0 +1,182 @@
|
||||
<?php
|
||||
// register_handler.php
|
||||
session_start();
|
||||
require_once __DIR__ . '/../config/database.php';
|
||||
|
||||
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
|
||||
$errors = [];
|
||||
|
||||
// Получаем данные из формы
|
||||
$full_name = trim($_POST['fio'] ?? '');
|
||||
$city = trim($_POST['city'] ?? '');
|
||||
$email = trim($_POST['email'] ?? '');
|
||||
$phone = trim($_POST['phone'] ?? '');
|
||||
$password = $_POST['password'] ?? '';
|
||||
$confirm_password = $_POST['confirm-password'] ?? '';
|
||||
|
||||
// Валидация данных
|
||||
if (empty($full_name) || strlen($full_name) < 3) {
|
||||
$errors[] = 'ФИО должно содержать минимум 3 символа';
|
||||
}
|
||||
|
||||
if (empty($city) || strlen($city) < 2) {
|
||||
$errors[] = 'Введите корректное название города';
|
||||
}
|
||||
|
||||
if (empty($email) || !filter_var($email, FILTER_VALIDATE_EMAIL)) {
|
||||
$errors[] = 'Введите корректный email адрес';
|
||||
}
|
||||
|
||||
if (empty($phone) || !preg_match('/^(\+7|8)[\s-]?\(?\d{3}\)?[\s-]?\d{3}[\s-]?\d{2}[\s-]?\d{2}$/', $phone)) {
|
||||
$errors[] = 'Введите корректный номер телефона';
|
||||
}
|
||||
|
||||
if (empty($password) || strlen($password) < 6) {
|
||||
$errors[] = 'Пароль должен содержать минимум 6 символов';
|
||||
}
|
||||
|
||||
if ($password !== $confirm_password) {
|
||||
$errors[] = 'Пароли не совпадают';
|
||||
}
|
||||
|
||||
// Проверка согласия с условиями
|
||||
if (!isset($_POST['privacy']) || $_POST['privacy'] !== 'on') {
|
||||
$errors[] = 'Необходимо согласие с условиями обработки персональных данных';
|
||||
}
|
||||
|
||||
// Если есть ошибки, возвращаем на форму
|
||||
if (!empty($errors)) {
|
||||
$_SESSION['registration_errors'] = $errors;
|
||||
$_SESSION['old_data'] = [
|
||||
'fio' => $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;
|
||||
}
|
||||
|
||||
// РАЗНЫЕ ВАРИАНТЫ ДЛЯ ТЕСТИРОВАНИЯ - РАСКОММЕНТИРУЙТЕ НУЖНЫЙ
|
||||
|
||||
// Вариант 1: С явным преобразованием boolean (самый надежный)
|
||||
$stmt = $db->prepare("
|
||||
INSERT INTO users (email, password_hash, full_name, phone, city, is_admin)
|
||||
VALUES (?, ?, ?, ?, ?, ?)
|
||||
RETURNING user_id
|
||||
");
|
||||
|
||||
// Преобразуем boolean в integer для PostgreSQL
|
||||
$stmt->execute([
|
||||
$email,
|
||||
$password_hash,
|
||||
$full_name,
|
||||
$phone,
|
||||
$city,
|
||||
$is_admin ? 1 : 0 // Преобразуем в integer (1 или 0)
|
||||
]);
|
||||
|
||||
// Вариант 2: С использованием CAST в SQL (альтернатива)
|
||||
/*
|
||||
$stmt = $db->prepare("
|
||||
INSERT INTO users (email, password_hash, full_name, phone, city, is_admin)
|
||||
VALUES (?, ?, ?, ?, ?, CAST(? AS boolean))
|
||||
RETURNING user_id
|
||||
");
|
||||
|
||||
$stmt->execute([
|
||||
$email,
|
||||
$password_hash,
|
||||
$full_name,
|
||||
$phone,
|
||||
$city,
|
||||
$is_admin ? 'true' : 'false' // Строковые значения true/false
|
||||
]);
|
||||
*/
|
||||
|
||||
$user_id = $stmt->fetchColumn();
|
||||
|
||||
if ($user_id) {
|
||||
// Автоматически авторизуем пользователя
|
||||
$_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'] = $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();
|
||||
} else {
|
||||
throw new Exception('Ошибка при создании пользователя');
|
||||
}
|
||||
|
||||
} 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();
|
||||
}
|
||||
?>
|
||||
Reference in New Issue
Block a user