Суперглобальный массив $_SESSION

PHP :: Сессии

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

(от англ. session ) – это механизм идентификации браузера пользователя и сохранения информации между последовательными доступами к веб-сайту, который позволяет сохранять данные о клиенте на стороне сервера.

Идентификация браузера (и, соответственно, пользователя) осуществляется посредством идентификатора сессии ( session_id ), который представляет собой обычную строковую переменную (по умолчанию ее имя — PHPSESSID ) и присваивается каждому посетителю сайта, позволяя серверу отличить одного пользователя от другого (см. пример №1 ).

'; //Выводим идентификатор сессии echo session_id(); ?>

После того, как при помощи функции session_start() для данного пользователя будет запущена сессия с идентификатором session_id() , на сервере будет создан для нее временный файл, а также станет доступен специальный суперглобальный массив $_SESSION , который как раз и предназначен для хранения переменных текущей сессии пользователя на стороне сервера (в отличие от куки, которые хранятся на стороне пользователя).

Читайте также:  Css linear gradient плавное

Следует отметить, что если данные в куки теоретически могут храниться и несколько лет (в зависимости от параметров), то данные в суперглобальном массиве $_SESSION хранятся только до окончания сессии, т.е. до момента закрытия пользователем своего браузера. Точнее, по умолчанию в PHP сессия считается закрытой даже при открытом браузере, если посетитель ушел с сайта и не возвращался в течение 24 минут, т.к. в силу разных технических моментов определить точное время закрытия браузера пользователем невозможно.

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

Что касается идентификатора сессии, то он хранится либо в cookie на стороне пользователя, либо передается через URL . В первую очередь PHP пытается установить пользователю куки, но также при старте сессии URL дополняется и id сессии на случай, если установка куки в браузере будет невозможна. При следующем запросе, если куки поддерживаются, PHP перестанет дополнять ссылки идентификаторами сессии. Если же прием куки в браузере пользователя будет отключен, то PHP будет постоянно добавлять id сессии к ссылкам, чтобы обеспечить сохранность текущей сессии.

Старт сессии в PHP

Для того, чтобы запустить или возобновить существующую сессию, в PHP присутствует функция session_start() , которую, как и вслучае с отправкой куки, следует вызывать в самом начале php -скрипта до вывода любой другой информации (см. пример №1 ). В случае удачного старта сессии функция возвращает TRUE , если же возникнет ошибка и сессия не стартует, функция вернет FALSE .

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

id сессии в PHP

Для того, чтобы получить id текущей сессии или назначить ей новый идентификатор, нужно использовать функцию session_id() . При этом, если ни одна сессия не запущена и id явно не установлен, то session_id() вернет пустую строку.

Что касается установки для сессии своего идентификатора, то здесь важно помнить, что задаваемый id может состоять только из символов a-z , A-Z , цифр 0-9 , запятой и знака минус (см. пример №2 ). Кроме того, сама функция session_id() должна быть вызвана до вызова функции session_start() .

Пример №2. Установка id сессии

Также хотелось бы отметить, что если установить один и тот же идентификатор сессии нескольким пользователям, то они смогут посещать страницу по одному и тому же сеансу, т.е. в окружении с одинаковыми параметрами (например, для них будет использоваться время одного и того же часового пояса).

Имя сессии в PHP

Кроме идентификатора сессия имеет еще и собственное имя, которое можно получить или установить при помощи функции session_name() . Если функция вызывается без параметра, то она возвращает имя текущей сессии (по умолчанию это PHPSESSID ). Если аргумент в виде строки с именем, которое нужно установить сессии, присутствует, то функция перезаписывает текущее имя сессии на новое, но возвращает старое (см. пример №3 ).

'; //Выводим id сессии html echo session_id().'
'; //Выводим старое имя сессии до перезаписи echo $old_name; ?>

Пример №3. Установка имени сессии

Важно помнить, что после установки имени сессии, функция session_name() должна вызываться каждый раз перед стартом самой сессии.

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

Суперглобальный массив $_SESSION

Как уже был сказано выше, после старта сессии необходимые данные могут быть занесены в суперглобальный массив $_SESSION и позднее доступны на любой странице сайта, на которой будет запущена сессия (см. пример №4 ). При этом следует помнить, что если после запуска сессии мы создадим свой массив и поместим туда переменные, то они доступны другим страницам не будут.

//------- Первая страница --------      На данной странице мы стартуем сессию и заносим 
данные в суперглобальный массив $_SESSION, которые
далее будут доступны на любой странице сайта, где
будет запущена текущая сессия. Убедимся в этом,
совершив переход на 2-ю страницу здесь и
попробовав вывести данные массива на страницу. //------- Вторая страница -------- Выводим данные массива, помещенные в массив на первой странице: .
Попробуйте закомментировать старт сессии!

Пример №4. Использование суперглобального массива $_SESSION

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

Удаление переменных сессии

Если нужно удалить все переменные связанные с текущей сессией, нужно использовать функцию session_unset() . В результате суперглобальный массив $_SESSION будет очищен (см. пример №5 ). Если же нужно удалить только некоторые данные, то можно использовать функцию unset() (например, unset($_SESSION[‘var_name’]) удалит элемент массива с указанным ключем).

Важно помнить, что применять конструкцию unset($_SESSION) не стоит, иначе будут удалены не только переменные сессии, но и сам суперглобальный массив.

'; //Заносим какие-нибудь данные в массив $_SESSION['my_name']="Иван Иванович"; //Проверяем наличие данных print_r($_SESSION); //Очищаем массив $_SESSION session_unset(); //Пробуем вывести (получим ошибку) echo $_SESSION['my_name']; //Но массив при этом не удаляется (он пустой) print_r($_SESSION); //Сама сессия остается открытой, проверяем это echo '
Сессия работает : '.session_id().'
'; //Заносим заново данные в массив $_SESSION['my_name']="Иван Иванович"; //Проверяем наличие данных print_r($_SESSION); ?>

Пример №5. Удаление переменных сессии

Закрытие сессии в PHP

Чтобы закрыть саму сессию и удалить данные связанные с ней (например, идентификатор сессии), необходимо использовать функцию session_destroy() . После вызова данной функции текущая сессия закрывается, но данные суперглобального массива и установленных куки не удаляются (см. пример №6 ). Поэтому, для очистки массива $_SESSION нужно использовать session_unset() , а для удаления куки — функцию setcookie() .

Пример №6. Завершение сессии

Запустите пример №6 в своем браузере (откройте фрейм в новой вкладке или окне). Затем обновите страницу с примером несколько раз, после чего сделайте тоже самое, но прежде снимите комментирование для строки удаления куки. В результате можно будет увидеть, что если куки не удалять, то при каждом обновлении страницы прежняя сессия будет восстанавливаться (в массив будет заноситься один и тот же session_id ). Если же куки с данными открытой сессии удалять, то при обновлении страницы будет запускаться новая сессия (в массив каждый раз будет заноситься другое значение session_id ).

Подробнее об остальных функциях для работы с сессиями можно узнать в официальном справочнике в разделе «Справочник функций» -> «Расширения для работы с сессиями» -> «Функции для работы с сессиями» .

Быстрый переход к другим страницам

html.okpython.net Copyright © 2016-2023.

Источник

PHP: Storing an array in a session variable.

This is a tutorial on how to store a PHP array in a session variable. Typically, this sort of design is used on eCommerce websites, where the user is able to add multiple products to their cart. Because the cart is a temporary list, many developers will opt to store it in the user’s session.

Storing an array in a session variable is simple, and it works exactly the same as storing string values or whatnot. Have a look at the following PHP code snippet:

If you run the code above, you’ll see that our session variable contains the $cartArray. The output of our var_dump will look like this:

array (size=3) 0 => int 123 1 => int 12 2 => int 490

Looping over the session array.

But what if we want to loop through this cart array?

  • We make sure that the session variable in question actually exists. This is important, as we can never be sure that a particular session variable has been set. If we attempt to iterate over a session array that does not exist, our application will throw out a number of PHP warnings, such as “Warning: Invalid argument supplied for foreach() “
  • We loop through the session array like we would with a regular PHP array. We print out the product ID of the cart item for testing purposes.

To make sure that our session array always exists, we could use the following code:

Here, we check to see if “cart” has been set. If not, we create an empty session array.

Adding elements to the array.

So, what if we want to add items to our session array?

As you can see – our session array works the exact same way as a regular PHP array. If you run and refresh the script above, you’ll see that a new element is added on every page load. This is what my session looked like after multiple refreshes:

array (size=1) 'cart' => array (size=6) 0 => int 123 1 => int 12 2 => int 490 3 => int 2787376 4 => int 2787376 5 => int 2787376

Hopefully, you found this tutorial to be helpful!

Источник

Array as session variable

Is it possible to make an array a session variable in PHP? The situation is that I have a table (page 1) with some cells having a link to a particular page. The next page will have a list of names (page 2, which I want to keep in a session array) with their respective checkboxes. On submitting this form, it will lead to a transaction page (page 3, where values of posted checkboxes are kept in a database for corresponding names). Now, if I return to the first page and click another cell, will the session array contain the new list of names or the old ones?

4 Answers 4

Yes, you can put arrays in sessions, example:

$_SESSION['name_here'] = $your_array; 

Now you can use the $_SESSION[‘name_here’] on any page you want but make sure that you put the session_start() line before using any session functions, so you code should look something like this:

 session_start(); $_SESSION['name_here'] = $your_array; 

Possible Example:

 session_start(); $_SESSION['name_here'] = $_POST; 

Now you can get field values on any page like this:

 echo $_SESSION['name_here']['field_name']; 

As for the second part of your question, the session variables remain there unless you assign different array data:

 $_SESSION['name_here'] = $your_array; 

Session life time is set into php.ini file.

Источник

Оцените статью