Введение в сессии в PHP

Когда мы видим страницу сайта в своем браузере, PHP скрипт этой страницы уже давно отработал и забыл о нас. Поэтому, если мы переходим с одной страницы сайта на другую - PHP скрипт не может запомнить данные с предыдущей страницы, например, значения переменных.

Однако, такой механизм очень нужен, хотя бы для того, чтобы запоминать выбор пользователя или то, что пользователь был авторизован.

В PHP для хранения данных пользователя между страницами сайта предназначены сессии. Мы можем записывать какую-либо информацию в сессию и считывать ее оттуда в следующем запуске этого или другого скрипта сайта. С помощью сессии можно реализовать авторизацию пользователей, корзину интернет-магазина и другое.

Инициализируем сессию

Чтобы записать что-то в сессию ее сначала нужно инициализировать с помощью функции session_start:

<?php session_start(); ?>

После инициализации мы можем записать что-нибудь в сессию или прочитать что-нибудь оттуда. Это делается с помощью суперглобального массива $_SESSION.

Давайте попробуем на практике. Сделаем файл test1.php и разместим в нем следующий код:

<?php session_start(); $_SESSION['test'] = 'abcde'; // пишем в сессию ?>

А в файле test2.php - следующий код:

<?php session_start(); echo $_SESSION['test']; // читаем из сессии ?>

Теперь для начала откройте в браузере файл test1.php, а потом test2.php. При открытии второго файла в браузере выведется то, что было записано в сессию в первом файле.

Сделайте два файла. При запуске первого файла запишите в сессию два числа, а при запуске второго файла - выведите на экран сумму этих чисел.

Нюансы

Сессия пользователя хранится на сервере. При этом она живет не вечно, а всего около получаса - если пользователь за это время не выполнил никаких обращений к сайту, то его сессия удалится и станет пустой.

Возможные проблемы

Основная проблема при работе с сессией следующая: нельзя делать никакого вывода в браузер до окончания работы с сессиями, в противном случае вы увидите следующую ошибку: Warning: Cannot send session cookie - headers already sent.

Что такое вывод в браузер? Это любой символ до <?php, например, текст или тег, даже пробел, а также сообщение об ошибке со стороны PHP. Кроме того нельзя делать выводы через echo, var_dump и print_r.

Кодировка вашего документа обязательно должна быть utf-8 без BOM. Если она будет просто utf-8, то перед <?php будет вставлен спец. символ, характерный для данной кодировки и сессии работать не будут.