Код IT
← Каталог

Работа с сессиями в PHP — Страница регистрации — подробный разбор

Фрагмент из «Работа с сессиями в PHP»: Страница регистрации — подробный разбор.

PHP main.php
<?php
session_start();
require_once '../includes/db.php';

$errors = [];

if ($_POST) {
    $username = trim($_POST['username'] ?? '');
    $email = filter_var($_POST['email'] ?? '', FILTER_SANITIZE_EMAIL);
    $password = $_POST['password'] ?? '';

    // Валидация
    if (strlen($username) < 3) {
        $errors[] = "Логин должен быть не короче 3 символов";
    }
    if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
        $errors[] = "Некорректный email";
    }
    if (strlen($password) < 8) {
        $errors[] = "Пароль должен содержать минимум 8 символов";
    }

    // Проверка уникальности логина и email
    if (empty($errors)) {
        $stmt = $pdo->prepare("SELECT id FROM users WHERE username = ? OR email = ?");
        $stmt->execute([$username, $email]);
        if ($stmt->fetch()) {
            $errors[] = "Пользователь с таким логином или email уже существует";
        }
    }

    if (empty($errors)) {
        $hash = password_hash($password, PASSWORD_ARGON2ID);
        $stmt = $pdo->prepare("INSERT INTO users (username, email, password_hash, role) VALUES (?, ?, ?, 'user')");
        $stmt->execute([$username, $email, $hash]);

        // Автоматический вход после регистрации (опционально)
        $_SESSION['user_id'] = $pdo->lastInsertId();
        $_SESSION['username'] = $username;
        $_SESSION['role'] = 'user';
        $_SESSION['logged_in'] = true;
        session_regenerate_id(true);

        header("Location: /dashboard.php");
        exit;
    }
}
?>

<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <title>Регистрация</title>
</head>
<body>
    <h1>Регистрация</h1>

    <?php if (!empty($errors)): ?>
        <div style="color: red;">
            <?php foreach ($errors as $error): ?>
                <p><?= htmlspecialchars($error) ?></p>
            <?php endforeach; ?>
        </div>
    <?php endif; ?>

    <form method="post">
        <label>
            Логин:<br>
            <input type="text" name="username" required>
        </label><br><br>

        <label>
            Email:<br>
            <input type="email" name="email" required>
        </label><br><br>

        <label>
            Пароль:<br>
            <input type="password" name="password" required>
        </label><br><br>

        <button type="submit">Зарегистрироваться</button>
    </form>

    <p><a href="/auth/login.php">Уже есть аккаунт? Войти</a></p>
</body>
</html>
<?php
session_start();
require_once '../includes/db.php';

$errors = [];

if ($_POST) {
    $username = trim($_POST['username'] ?? '');
    $email = filter_var($_POST['email'] ?? '', FILTER_SANITIZE_EMAIL);
    $password = $_POST['password'] ?? '';

    // Валидация
    if (strlen($username) < 3) {
        $errors[] = "Логин должен быть не короче 3 символов";
    }
    if (!filter_var($email, FILTER_VALIDATE_EMAIL)) {
        $errors[] = "Некорректный email";
    }
    if (strlen($password) < 8) {
        $errors[] = "Пароль должен содержать минимум 8 символов";
    }

    // Проверка уникальности логина и email
    if (empty($errors)) {
        $stmt = $pdo->prepare("SELECT id FROM users WHERE username = ? OR email = ?");
        $stmt->execute([$username, $email]);
        if ($stmt->fetch()) {
            $errors[] = "Пользователь с таким логином или email уже существует";
        }
    }

    if (empty($errors)) {
        $hash = password_hash($password, PASSWORD_ARGON2ID);
        $stmt = $pdo->prepare("INSERT INTO users (username, email, password_hash, role) VALUES (?, ?, ?, 'user')");
        $stmt->execute([$username, $email, $hash]);

        // Автоматический вход после регистрации (опционально)
        $_SESSION['user_id'] = $pdo->lastInsertId();
        $_SESSION['username'] = $username;
        $_SESSION['role'] = 'user';
        $_SESSION['logged_in'] = true;
        session_regenerate_id(true);

        header("Location: /dashboard.php");
        exit;
    }
}
?>

<!DOCTYPE html>
<html lang="ru">
<head>
    <meta charset="UTF-8">
    <title>Регистрация</title>
</head>
<body>
    <h1>Регистрация</h1>

    <?php if (!empty($errors)): ?>
        <div style="color: red;">
            <?php foreach ($errors as $error): ?>
                <p><?= htmlspecialchars($error) ?></p>
            <?php endforeach; ?>
        </div>
    <?php endif; ?>

    <form method="post">
        <label>
            Логин:<br>
            <input type="text" name="username" required>
        </label><br><br>

        <label>
            Email:<br>
            <input type="email" name="email" required>
        </label><br><br>

        <label>
            Пароль:<br>
            <input type="password" name="password" required>
        </label><br><br>

        <button type="submit">Зарегистрироваться</button>
    </form>

    <p><a href="/auth/login.php">Уже есть аккаунт? Войти</a></p>
</body>
</html>