Короткий ответ: PHP-сайт узнает пользователя через cookie и сессии. Браузер хранит небольшой идентификатор, сервер по этому идентификатору понимает, какой пользователь открыл страницу. Для обычного входа на сайт чаще всего используют session_start() и сохраняют в сессии user_id
Важно: сайт не “узнает человека” сам по себе. Он узнает браузер, в котором есть нужная cookie. Если пользователь открыл другой браузер, очистил cookie или зашел с другого устройства, сайт не сможет связать его с прежней сессией без нового входа
Самый простой пример сессии
login.php
<?php
session_start();
$_SESSION['user_id'] = 15;
$_SESSION['user_name'] = 'Динар';
header('Location: profile.php');
exit;
profile.php
<?php
session_start();
if (!isset($_SESSION['user_id'])) {
echo 'Вы не вошли';
exit;
}
echo 'Здравствуйте, ' . htmlspecialchars($_SESSION['user_name'], ENT_QUOTES, 'UTF-8');
После входа сервер сохраняет данные сессии, а браузер хранит cookie с идентификатором сессии. При следующем запросе PHP восстанавливает $_SESSION
Как сделать выход
logout.php
<?php
session_start();
$_SESSION = [];
session_destroy();
header('Location: login-form.php');
exit;
Так пользователь выходит из текущей сессии. В рабочем проекте можно дополнительно удалить cookie сессии, но для первого понимания достаточно увидеть принцип
Чем cookie отличается от session
Cookie хранится в браузере. Сессия хранится на сервере, а в браузере обычно лежит только идентификатор сессии
Плохой вариант
setcookie('is_admin', '1');
Если сайт доверяет такой cookie, пользователь может попытаться изменить ее значение. Поэтому права доступа и user_id лучше проверять на сервере
Лучше хранить в сессии только идентификатор пользователя, а роль и права брать из базы
Что такое remember me
“Запомнить меня” — это отдельная логика поверх обычной сессии. Обычно сайт выдает долгоживущий токен в cookie, а в базе хранит его безопасную версию. При следующем визите сайт проверяет токен и создает новую сессию
Не храните пароль в cookie. Не храните роль администратора в cookie. Не храните user_id как единственное доказательство входа без защиты
Как связать с базой данных
После проверки логина и пароля вы находите пользователя в базе, проверяете пароль через password_verify(), затем сохраняете user_id в сессии
<?php
session_start();
if (password_verify($passwordFromForm, $user['password_hash'])) {
$_SESSION['user_id'] = $user['id'];
header('Location: profile.php');
exit;
}
echo 'Неверный логин или пароль';
Пароль в базе должен храниться не как обычный текст, а как хеш через password_hash()
Проверка доступа к странице
На закрытых страницах делайте проверку в начале файла
<?php
session_start();
if (!isset($_SESSION['user_id'])) {
header('Location: login-form.php');
exit;
}
Лучше вынести такую проверку в отдельный файл и подключать его на всех закрытых страницах
Мини-практика
Создайте три файла: login.php, profile.php, logout.php. В login.php запишите тестовый user_id в сессию, в profile.php покажите имя пользователя, в logout.php уничтожьте сессию
Потом откройте profile.php до входа, после входа и после выхода. Так вы увидите, как сайт “узнает” пользователя по сессии
Частые ошибки
Забывают вызвать session_start() до работы с $_SESSION
Выводят HTML до session_start() и header(), а потом получают ошибки заголовков
Хранят пароль или роль администратора в cookie
Считают cookie абсолютным доказательством личности. Cookie можно потерять, украсть или подделать, если система сделана плохо
Не делают выход из аккаунта
Не проверяют доступ на каждой закрытой странице
Не используют password_hash() и password_verify() для паролей
Что почитать дальше по PHP
Если нужен общий маршрут по теме, откройте рубрику PHP. Для соседних задач пригодятся эти разборы:
- PHP-регистрация пользователя: форма, база данных и безопасный пароль
- Timeweb: как изменить версию PHP на хостинге и проверить сайт
- Как в PHP защититься от загрузки вредоносного изображения на сайт
- Как включить нужную версию PHP: сайт, терминал, Apache и PHP-FPM



