Загрузка данных


<?php
session_start();
require 'db.php';

// если уже вошёл - сразу в кабинет
if (isset($_SESSION['user_id'])) {
    header('Location: cabinet.php');
    exit;
}

$error = '';
$open_reg = false;   // true - показываем регистрацию вместо входа
$email_val = '';

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $action = $_POST['action'] ?? '';
    $email = trim($_POST['email'] ?? '');
    $email_val = $email;

    if ($action === 'login') {
        $pass = $_POST['password'] ?? '';
        $cap = trim($_POST['captcha'] ?? '');

        // сначала капча
        if (!isset($_SESSION['captcha']) || $cap !== (string)$_SESSION['captcha']) {
            $error = 'Неверный ответ в проверке «Я не робот»';
        } else {
            $st = $db->prepare('SELECT * FROM users WHERE email = ?');
            $st->execute([$email]);
            $u = $st->fetch(PDO::FETCH_ASSOC);

            if ($u && password_verify($pass, $u['password_hash'])) {
                login_user($u);
            } else {
                $error = 'Неверный email или пароль';
            }
        }
    }

    if ($action === 'register') {
        $open_reg = true;
        $last = trim($_POST['last_name'] ?? '');
        $first = trim($_POST['first_name'] ?? '');
        $middle = trim($_POST['middle_name'] ?? '');
        $pass = $_POST['password'] ?? '';
        $pass2 = $_POST['password_repeat'] ?? '';

        if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
            $error = 'Введите email правильно';
        } elseif ($last === '' || $first === '') {
            $error = 'Заполните фамилию и имя';
        } elseif (strlen($pass) < 8) {
            $error = 'Пароль должен быть не короче 8 символов';
        } elseif ($pass !== $pass2) {
            $error = 'Пароли не совпадают';
        } elseif (!isset($_POST['agree'])) {
            $error = 'Нужно согласие на обработку данных';
        } else {
            $st = $db->prepare('SELECT id FROM users WHERE email = ?');
            $st->execute([$email]);
            if ($st->fetch()) {
                $error = 'Этот email уже зарегистрирован, просто войдите';
            } else {
                // новый человек всегда обычный пользователь, админом через регистрацию стать нельзя
                $st = $db->prepare("INSERT INTO users (email, last_name, first_name, middle_name, password_hash, role) VALUES (?, ?, ?, ?, ?, 'user')");
                $st->execute([$email, $last, $first, $middle, password_hash($pass, PASSWORD_DEFAULT)]);
                login_user(['id' => $db->lastInsertId(), 'role' => 'user']);
            }
        }
    }
}

// новая капча при каждом показе страницы
$a = rand(1, 9);
$b = rand(1, 9);
$_SESSION['captcha'] = $a + $b;

$title = 'Вход и регистрация';
include 'header.php';
?>
  <main class="page-main auth-main">

    <!-- регистрация -->
    <section class="form-box reg-box <?= $open_reg ? 'open' : '' ?>" id="register">
      <h1>Регистрация</h1>
      <?php if ($error && $open_reg): ?><p class="msg-err"><?= h($error) ?></p><?php endif; ?>
      <form action="auth.php" method="post">
        <input type="hidden" name="action" value="register">
        <label class="field">Email
          <input type="email" name="email" value="<?= $open_reg ? h($email_val) : '' ?>" required>
        </label>
        <label class="field">Фамилия
          <input type="text" name="last_name" required>
        </label>
        <label class="field">Имя
          <input type="text" name="first_name" required>
        </label>
        <label class="field">Отчество
          <input type="text" name="middle_name">
        </label>
        <label class="field">Пароль
          <input type="password" name="password" minlength="8" required>
        </label>
        <label class="field">Пароль ещё раз
          <input type="password" name="password_repeat" minlength="8" required>
        </label>
        <label class="check agree">
          <input type="checkbox" name="agree" required>
          <span>Даю <a href="#">согласие</a> на обработку своих персональных данных</span>
        </label>
        <button class="btn form-btn btn-green" type="submit">Зарегистрироваться</button>
      </form>
      <p class="form-text">Уже есть аккаунт? <a class="blue" href="auth.php#login">Войти</a></p>
      <p class="form-text">Нужна помощь? <a class="blue" href="mailto:academy@teplicy.ru">Написать в поддержку</a></p>
    </section>

    <!-- вход -->
    <section class="form-box login-box" id="login">
      <h1>Вход</h1>
      <?php if ($error && !$open_reg): ?><p class="msg-err"><?= h($error) ?></p><?php endif; ?>
      <form action="auth.php" method="post">
        <input type="hidden" name="action" value="login">
        <label class="field">Email
          <input type="email" name="email" value="<?= $open_reg ? '' : h($email_val) ?>" required>
        </label>
        <label class="field">Пароль
          <input type="password" name="password" required>
        </label>
        <label class="field">Проверка: сколько будет <?= $a ?> + <?= $b ?>?
          <input type="text" name="captcha" inputmode="numeric" autocomplete="off" required>
        </label>
        <button class="btn form-btn btn-green" type="submit">Войти</button>
      </form>
      <p class="form-text">Впервые здесь? <a class="blue" href="#register">Зарегистрироваться</a></p>
      <p class="form-text">Не получается войти? <a class="blue" href="mailto:academy@teplicy.ru">Написать в поддержку</a></p>
    </section>

  </main>
<?php include 'footer.php'; ?>