Способы работы с пользователями в index.php

Раздел: Разработка на PHP -> Управление пользователями

Варианты реализации управления пользователями в index.php

Как построить гибкую систему маршрутизации для пользовательских действий?

Наиболее эффективный подход - использование единой точки входа (front controller) с маршрутизатором и промежуточным слоем для аутентификации. index.php анализирует URI, выделяет контроллер и действие, проверяет доступ и вызывает нужный метод. Это позволяет централизованно управлять сессиями, CSRF-защитой и авторизацией.


<?php
// index.php - front controller
session_start();
require_once 'Router.php';
require_once 'AuthMiddleware.php';

$request = $_SERVER['REQUEST_URI'];
$router = new Router();
$router->addRoute('GET', '/register', 'UserController@registerForm');
$router->addRoute('POST', '/register', 'UserController@register');
$router->addRoute('GET', '/login', 'UserController@loginForm');
$router->addRoute('POST', '/login', 'UserController@login');
$router->addRoute('GET', '/profile', 'UserController@profile', ['auth']);

AuthMiddleware::check($router->getMiddlewares($request));
echo $router->dispatch($request);
?>   

Users php (управление пользователями в php)

Router и Middleware обрабатывают логику, освобождая index.php от громоздких условий. Этот вариант упрощает расширение функционала, тестирование и поддержку кода.

Проблема: сложность начальной настройки. Ошибка - забыть загрузить маршруты перед вызовом dispatch. Решение - вынести маршруты в отдельный конфигурационный файл.

Как обрабатывать действия пользователя с помощью GET-параметра?

Простой вариант - переключатель по $_GET['action']. В index.php проверяется значение параметра и выполняется соответствующий код (логин, регистрация, выход).


<?php
session_start();
$action = $_GET['action'] ?? 'default';

switch ($action) {
    case 'register':
        include 'register.php';
        break;
    case 'login':
        include 'login.php';
        break;
    case 'logout':
        session_destroy();
        header('Location: index.php?action=login');
        break;
    default:
        echo 'Главная страница';
}
?>   

Php su (php su (переключение пользователя))

Минусы: смешивание маршрутизации и логики, уязвимость к прямому вызову внутренних файлов. Для небольших проектов допустимо, но не рекомендуется для серьёзных приложений.

Ошибка: если не проверять существование файла при include, возникнет ошибка. Решение - использовать require_once и проверку file_exists().

Как использовать классы для разделения логики пользователей?

Вместо включения файлов можно создать классы-контроллеры. index.php подключает файл с классом и вызывает его метод.


<?php
session_start();
require_once 'UserController.php';

$controller = new UserController();
$action = $_GET['action'] ?? 'index';

if (method_exists($controller, $action)) {
    echo $controller->$action();
} else {
    http_response_code(404);
    echo 'Страница не найдена';
}
?>   

Этот подход даёт больше гибкости, чем switch, но всё ещё зависит от глобальных параметров. Комбинация с автозагрузкой классов упрощает разработку.

Проблема: незащищённый вызов методов (например, приватные). Решение - проверять, что метод существует и является публичным, либо использовать whitelist разрешённых действий.

- Index login php lang (форма входа на php с выбором языка)
- Action profile profile php (действие профиля в php)
- Groups php (группы пользователей в php)

Расширенные примеры кода с результатами

Регистрация пользователя (PDO + password_hash)

Пример

<?php
// register.php (используется в index.php через inclusion или контроллер)
$db = new PDO('mysql:host=localhost;dbname=test', 'root', '');
$db->setAttribute(PDO::ATTR_ERRMODE, PDO::ERRMODE_EXCEPTION);

if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $username = trim($_POST['username']);
    $email = trim($_POST['email']);
    $password = $_POST['password'];
    $confirm = $_POST['confirm'];

    if ($password !== $confirm) {
        $error = 'Пароли не совпадают';
    } elseif (strlen($password) < 8) {
        $error = 'Пароль должен содержать минимум 8 символов';
    } else {
        $hash = password_hash($password, PASSWORD_DEFAULT);
        $stmt = $db->prepare('INSERT INTO users (username, email, password_hash) VALUES (?, ?, ?)');
        $stmt->execute([$username, $email, $hash]);
        $_SESSION['user_id'] = $db->lastInsertId();
        header('Location: index.php?action=profile');
        exit;
    }
}
?>
<form method="post">
    <input name="username" required>
    <input name="email" type="email" required>
    <input name="password" type="password" required>
    <input name="confirm" type="password" required>
    <button type="submit">Зарегистрироваться</button>
</form>
<?php if (isset($error)) echo "<p class='error'>$error</p>"; ?>   
Результат: при вводе корректных данных пользователь добавляется в БД, создаётся сессия, выполняется редирект на профиль.
При ошибке (несовпадение паролей) выводится сообщение.

Авторизация и проверка сессии

Пример

<?php
// login.php
if ($_SERVER['REQUEST_METHOD'] === 'POST') {
    $email = $_POST['email'];
    $password = $_POST['password'];

    $stmt = $db->prepare('SELECT id, password_hash FROM users WHERE email = ?');
    $stmt->execute([$email]);
    $user = $stmt->fetch();

    if ($user && password_verify($password, $user['password_hash'])) {
        $_SESSION['user_id'] = $user['id'];
        header('Location: index.php?action=profile');
        exit;
    }
    $error = 'Неверный email или пароль';
}
?>   
Результат: при успешной аутентификации пользователь перенаправляется в профиль. Иначе ошибка.

Профиль пользователя с защитой от неавторизованного доступа

Пример

<?php
// profile.php
if (!isset($_SESSION['user_id'])) {
    header('Location: index.php?action=login');
    exit;
}

$stmt = $db->prepare('SELECT username, email FROM users WHERE id = ?');
$stmt->execute([$_SESSION['user_id']]);
$user = $stmt->fetch();
echo "Привет, {$user['username']}!<br>";
echo "Email: {$user['email']}";
?>   
Результат: если сессия не активна, пользователь перенаправляется на форму входа. Иначе отображается информация из БД.

Использование middleware для проверки авторизации

Пример

<?php
class AuthMiddleware {
    public static function handle() {
        if (!isset($_SESSION['user_id'])) {
            http_response_code(401);
            echo json_encode(['error' => 'Требуется авторизация']);
            exit;
        }
    }
}
// В index.php перед вызовом контроллера:
AuthMiddleware::handle();
?>   
Результат: любой маршрут, защищённый этим middleware, вернёт ошибку 401 для неавторизованных пользователей.

Обновление профиля (упрощённый пример)

Пример

<?php
if ($_SERVER['REQUEST_METHOD'] === 'POST' && isset($_SESSION['user_id'])) {
    $newEmail = $_POST['email'];
    $stmt = $db->prepare('UPDATE users SET email = ? WHERE id = ?');
    $stmt->execute([$newEmail, $_SESSION['user_id']]);
    echo 'Email обновлён';
}
?>   
Результат: email пользователя изменяется в базе данных.

Пользователь в index.php - comments

En
Index php user (php)