Encodera

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.

Оглавление

Сессии и куки

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

Примерам этого урока нужен веб-сервер, поэтому здесь они не запускаются.

Как работает сессия

При первом визите PHP создаёт на сервере хранилище и выдаёт браузеру случайный идентификатор. Браузер присылает его с каждым следующим запросом, и PHP находит по нему нужное хранилище. Сами данные остаются на сервере — у посетителя только идентификатор.

Начало сессии

Сессию открывает функция session_start(). После неё доступен массив $_SESSION:

<?php
 
session_start();
 
$_SESSION['name'] = 'Анна';

Значение сохранится и будет доступно на любой другой странице сайта, где тоже вызвана session_start():

<?php
 
session_start();
 
echo $_SESSION['name'] ?? 'Гость';

Счётчик посещений

Данные сессии можно менять как обычный массив:

<?php
 
session_start();
 
$_SESSION['visits'] = ($_SESSION['visits'] ?? 0) + 1;
 
echo "Вы открыли эту страницу {$_SESSION['visits']} раз";

Вход и выход

На сессиях строится авторизация: после проверки пароля в сессию записывают идентификатор пользователя, а на закрытых страницах проверяют, что он там есть.

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

При выходе сессию уничтожают:

<?php
 
session_start();
session_destroy();

Куки

Кука — небольшое значение, которое хранится в самом браузере. Её создаёт setcookie(), а прочитать можно из массива $_COOKIE при следующем запросе:

<?php
 
setcookie('theme', 'dark', time() + 60 * 60 * 24 * 30);
 
$theme = $_COOKIE['theme'] ?? 'light';

Третий аргумент — время, до которого кука действует: здесь это 30 дней от текущего момента.

Что где хранить

СессияКука
Где лежат данныеНа сервереВ браузере
Может ли посетитель изменитьНетДа
Для чегоВход, корзинаТема, язык

Частая ошибка

session_start(), setcookie() и header() должны вызываться до любого вывода на страницу — даже до пробела перед <?php. Иначе PHP выдаст предупреждение headers already sent, и ничего не сработает.

И не храните в куках ничего секретного: посетитель видит их содержимое и может изменить его.

Спасибо, что читаете!

Пожертвуйте сайту, мы стараемся ради вас.