php записать в сессию массив
Работа с сессиями (сеансами) в PHP 7
Содержание:
В данной заметке коротко о том, как использовать сеансы (сессии) в PHP, как они работают и как они связаны с файлами cookie (куки).
Что такое сессия в PHP?
Сессия — это механизм для сохранения информации на разных веб-страницах для идентификации пользователей при навигации по сайту или приложению. Сессия PHP представляет собой способ хранения информации в переменных сессии, которые могут быть использованы для аутентификации на нескольких веб-страницах. В отличие от куков, информация сессии не хранится на компьютере пользователя. Вместо этого сессия создает файл на сервере во временном каталоге.
Рекомендуется настроить путь для хранения сессий на сервере. Сделать это можно несколькими способами. Необходимо заранее создать указанные директории!
Выше варианты для глобальной конфигурации хранения сессий. Можно настраивать хранение сессий для каждого проекта отдельно. Для этого в проекте необходимо вызвать php функцию session_save_path() c указанием необходимого пути. Перед session_start() укажем путь для хранения сессий проекта:
Создание сессии (сеанса) в PHP
При каждом вызове session_start() PHP сам отправляет куку в браузер пользователя.
Запись и чтение сессий
Завершение (очистка) сессии
Так как сессии часто используются для авторизации пользователей, то нужно иметь механизм «выхода» из системы. Для того, чтобы завершить сессию нам нужно:
Итоги
Пример использования сессии
В данном примере я покажу как можно использовать сессии (сеансы) в PHP на практике. Для начала на сервере создадим файл index.php со следующим содержимым:
Здесь я постарался максимально понятно описать всё происходящее. Под пользователя при заходе на эту страницу уже создаётся сессия, она пустая, это пока просто файл. Если пользователь заполнил все необходимые поля формы и нажал кнопку `Отправить`, то созданный файл (файл сессии) заполниться данными. Далее скрипт проверяет, если есть в сессии данные именно этого пользователя (здесь он уже сравнивает с кукой, которая пришла до этого на машину пользователя), то выводим эти данные. В противном случае, добавляем в сессию данные пользователя.
Сессии в PHP
Сессии в PHP представляют из себя механизм сохранения на стороне сервера информации о компьютере клиента. На самом деле сессии в PHP — это не такая сложная тема, но для её понимания нужно знать принцип работы cookie в PHP. Так что, если вы не знаете как работают cookie в PHP, то сначала читайте соответствующую статью, а потом уже возвращайтесь сюда.
Слово session с английского переводится как сеанс, так сам смысл сессий в PHP становится более понятным, но у программистов прижился термин «сессии», его и мы будем использовать в этой статье.
Сессии в PHP очень похожи на механизм cookie, те же самые пары ключ => значение, только они хранятся на стороне сервера.
Функция session_start()
Функция session_start() желательно вызывать в самом начале страницы, но в моих примерах я этого не делаю.
Сессии — это группы переменных, которые хранятся на сервере, но относятся к одному уникальному посетителю. Повторю, это ключевой момент: сессии хранятся на сервере.
Для того, чтобы обеспечить взаимодействие каждого посетителя с его данными из его сессии используется файл cookie, команду создать который PHP даёт сам, вам об это беспокоится не нужно. Этот cookie имеет значение только для сервера и не может быть использован для получения данных о пользователе.
Давайте наконец начнём использовать примеры. Всё очень просто.
Функция session_id()
Можете посмотреть в панели инструментов для разработчиков вашего браузера (в Chrome для этого нажмите Ctrl + Shift + I, потом Resources, и там найдёте cookie), этот домен положил вашему браузеру cookie с именем PHPSESSID и примерно таким значением: «7g5df9rkd1hhvr33lq1k6c72p7».
Функция session_name()
Если функции session_id() позволяет получать значение идентификатора сессии, функция session_name() позволяет узнать имя сессии.
Ещё раз про функцию session_start()
Пример использования сессии
Сейчас мы рассмотрим пример, который позволит провести небольшие эксперименты с сессиями.
Если закрыть окно браузера, то сессия прекратится, наш счётчик обнулится. Такое поведение сессий в PHP можно изменить, к этому вопросу мы вернёмся чуть дальше в статье.
Завершение сессии
Так как сессии часто используются для авторизации пользователей, то нужно иметь механизм «выхода» из системы.
Для того, чтобы завершить сессию нам нужно:
Функция session_destroy() удаляет временное хранилище на сервере. Кстати, она больше ничего не делает.
Пример завершения сессии:
Теперь можете провести эксперимент: запустить в одном окне пример со счётчиком, накрутить счётчик, а потом запусть пример с удалением сессии и снова обновить страницу со счётчиком.
Удаление файла cookies можно сделать так:
Ещё раз про функции session_name() и session_id()
Функции session_name() и session_id() на практике используются редко, но я о них пишу, так как в статье нужно раскрыть сам механизм работы сессий в PHP.
При использовании данного примера всем пользователям будет назначен один и тот же идентификатор сессии.
Тут подробней остановимся, если вы запустите пример из секции про функцию session_name() (вот ссылка) в разных браузерах (например в Chrome и в Internet Explorer), то в каждом браузере будет свой, уникальный идентификатор сессии. Браузеры хранят файлы cookies каждый в своей папке, поэтому функция session_start() даст каждому браузеру создать свой, уникальный идентификатор и, соответственно, для каждого браузера будет создано уникальное хранилище на сервере. Поэтому пример со счётчиком (этот) в каждом браузере будет работать независимо друг от друга.
Если задать одинаковый идентификатор сессии для всех пользователей, то они будут работать с одним хранилищем на сервере. Вот пример счётчика, который будет считать посещения с разных браузеров:
Если вы запустите этот пример, то не факт что вы увидите там единицу. Другие посетители могли уже изменить значения в хранилище сессий на сервере. Когда в этом случае сервер удаляет хранилище — я не знаю, поэтому при превышении счётчиком значения 100 буду завершать сессию.
Установка времени ожидания
По умолчанию, сессия «живёт» до тех пор, пока посетитель не закроет окно браузера. Это обусловлено тем, что функция session_start() ложит клиенту такой cookie.
session_set_cookie_params (int lifetime [, string path [, string domain [, bool secure]]])
На практике достаточно использовать только первый параметр (lifetime), сюда записываете время в секундах, определяющее сколько сервер должен помнить состояние сессии после закрытия браузера.
Действие функции session_set_cookie_params() распространяется только на период работы скрипта.
Вот пример использования этой функции:
Накрутите счётчик и закройте браузер, через 30 сукунд опять откройте этот пример. Ваша сессия сохранится.
Массив в сессию
Как сохранять массив в сессию PHP?
Подскажите пожалуйста как при каждом заходе на страницу сохранять две переменные в массив сессии и.
Как добавить массив в сессию с помощью PHP
Скажите пожалуста, как добавить массив в сессию с помощью PHP (ООП)?
Я незнаю что это, но ваш код заработал.
Я счас собрал этот код и он пока работает:
Какие тут можно придумать варианты чтобы уйти от этого?
Добавлено через 5 минут
Если я был прав и так оно и есть что удаленная буква подгружается, то как уйти от этого можно? загрузив например алфавит в сессию только один раз при помощи кнопки на странице каким либо способом?
(заполнить через цикл, заполнить его из базы, (заполнить )взять его из другой страницы?) Или что делать то?
Давайте как нибудь и его применим, а может и массив им заполним как нибудь?
Такой способ подойдет или есть еще какие?
Kanred,
Да вроде работает ваш способ, видимо переменную то что убрали из кода.
Я еще что хотел спросить- когда все буквы удалятсяих нужно будет снова восстановить!
Как это можно проделать? Обратится к другому php- файлу через форму которая кинет на php- обработчик? который в свою очередь заполнит сессию алфавитом и вернет назад на страницу, так?
Да можно и так, а можно просто проверить, передать этому что скрипту например так:
теперь можно сделать чтобы при нажатии на ссылку, загружалась эта же страница но с GET параметром alfav
Помощь в написании контрольных, курсовых и дипломных работ здесь.
Определить средний балл студентов, успешно сдавших сессию, используя двумерный массив
Помогите пожалуйста! Карма +100000. Задан двумерный числовой массив из 25 строк и 7 столбцов, в.
Закрыть сессию
Добрый день! Вобщем тема смешная и меня досихпор она смешил. Дело в чём, если я блокирую (баню).
Обновить сессию
Доброго времени суток, форумчане! Попал посреди ночи я с проблемой. Не могу добиться от сессий.
Как записать в сессию массив с индексами?
Помощь в написании контрольных, курсовых и дипломных работ здесь.
Как записать данные в сессию
Доброго времени суток Разрабатываю интернет-магазин, нужна функция сравнивания товаров по их.
Записать элементы массива X с нечетными индексами подряд в массив Y Excel basic
Записать элементы массива X с нечетными индексами подряд в массив Y 1) Записать элементы массива.
Добавлено через 2 минуты
и значения присвоятся.
Просто я как то побаиваюсь print_r, т.к. она выводит значения таким образом
а мне бы просто вывести так: 5 1 3 4
и еще тогда вопрос, как тогда обратиться например ко второму элементу массива в сесии?
Большое спасибо за помощь.
Добавлено через 14 минут
И все таки вывод 2- го элемента правильно написать так
echo «масссив=».$_Session[‘v’][2];
а присваивать правильно так
которая мне не нужна.
Спасибо большое.
А вопросы я правил, потому что кое что получилось, вот за ненадобностью удалял.
Помощь в написании контрольных, курсовых и дипломных работ здесь.
Как можно записать данные в сессию не перезагружая страницу?
есть форма и кнопка к этой форме. нужно все данные из формы при клике на кнопку записать в сессию.
Записать в новый массив сначала элементы исходного массива с четными, затем с нечетными индексами
Из одномерного массива А сформировать одномерный массив В, записав в него сначала элементы массива.
Как записать в сессию все данные из БД, а не только логин и пароль
Ребят есть быза в ней храню всех пользователей, через php происходит авторизация пользователей.
Задан массив А(9).найти произведение чисел с четными индексами и сумму с нечетными индексами.
Задан массив А(9).найти произведение чисел с четными индексами и сумму с нечетными индексами.
PHP для начинающих. Сессия
Начну с сессий — это один из самых важных компонентов, с которыми вам придется работать. Не понимая принципов его работы — наворотите делов. Так что во избежание проблем я постараюсь рассказать о всех возможных нюансах.
Но для начала, чтобы понять зачем нам сессия, обратимся к истокам — к HTTP протоколу.
HTTP Protocol
Изначально подразумевали, что по этому протоколу будет только HTML передаваться, отсель и название, а сейчас чего только не отправляют и =^.^= и(•_ㅅ_•)
Чтобы не ходить вокруг да около, давайте я вам приведу пример общения по HTTP протоколу.
Вот пример запроса, каким его отправляет ваш браузер, когда вы запрашиваете страницу http://example.com :
А вот пример ответа:
Это очень упрощенные примеры, но и тут можно увидеть из чего состоят HTTP запрос и ответ:
Т.е. если украсть cookie из вашего браузера, то можно будет зайти на вашу страничку в facebook от вашего имени? Не пугайтесь, так сделать нельзя, по крайней мере с facebook, и дальше я вам покажу один из возможных способов защиты от данного вида атаки на ваших пользователей.
Давайте теперь посмотрим как изменятся наши запрос-ответ, будь там авторизация:
Метод у нас изменился на POST, и в теле запроса у нас передаются логин и пароль. Если использовать метод GET, то строка запроса будет содержать логин и пароль, что не очень правильно с идеологической точки зрения, и имеет ряд побочных явлений в виде логирования (например, в том же access.log ) и кеширования паролей в открытом виде.
Как можно заметить, заголовки отправляемые браузером (Request Headers) и сервером (Response Headers) отличаются, хотя есть и общие и для запросов и для ответов (General Headers)
Сервер узнал нашего пользователя по присланным cookie, и дальше предоставит ему доступ к личной информации. Так, ну вроде с сессиями и HTTP разобрались, теперь можно вернутся к PHP и его особенностям.
PHP и сессия
Я надеюсь, у вас уже установлен PHP на компьютере, т.к. дальше я буду приводить примеры, и их надо будет запускать
Вот вам статейка на тему PHP is meant to die, или вот она же на русском языке, но лучше отложите её в закладки «на потом».
Перво-наперво необходимо «стартовать» сессию — для этого воспользуемся функцией session_start(), создайте файл session.start.php со следующим содержимым:
Запустите встроенный в PHP web-server в папке с вашим скриптом:
Запустите браузер, и откройте в нём Developer Tools (или что там у вас), далее перейдите на страницу http://127.0.0.1:8080/session.start.php — вы должны увидеть лишь пустую страницу, но не спешите закрывать — посмотрите на заголовки которые нам прислал сервер:
Там будет много чего, интересует нас только вот эта строчка в ответе сервера (почистите куки, если нет такой строчки, и обновите страницу):
Увидев сие, браузер сохранит у себя куку с именем `PHPSESSID`:
PHPSESSID — имя сессии по умолчанию, регулируется из конфига php.ini директивой session.name, при необходимости имя можно изменить в самом конфигурационном файле или с помощью функции session_name()
И теперь — обновляем страничку, и видим, что браузер отправляет эту куку на сервер, можете попробовать пару раз обновить страницу, результат будет идентичным:
Итого, что мы имеем — теория совпала с практикой, и это просто отлично.
Обновляем страничку и видим время сервера, обновляем ещё раз — и время обновилось. Давайте теперь сделаем так, чтобы установленное время не изменялось при каждом обновлении страницы:
Обновляем — время не меняется, то что нужно. Но при этом мы помним, PHP умирает, значит данную сессию он где-то хранит, и мы найдём это место…
Всё тайное становится явным
В вашей конфигурации путь к файлам может быть не указан, тогда файлы сессии будут хранится во временных файлах вашей системы — вызовите функцию sys_get_temp_dir() и узнайте где это потаённое место.
Так, идём по данному пути и находим ваш файл сессии (у меня это файл sess_dap83arr6r3b56e0q7t5i0qf91 ), откроем его в текстовом редакторе:
Как видим — вот оно наше время, вот в каком хитром формате хранится наша сессия, но мы можем внести правки, поменять время, или можем просто вписать любую строку, почему бы и нет:
Так, что мы ещё не пробовали? Правильно — украсть «печеньки», давайте запустим другой браузер и добавим в него теже самые cookie. Я вам для этого простенький javascript написал, скопируйте его в консоль браузера и запустите, только не забудьте идентификатор сессии поменять на свой:
Вот теперь у вас оба браузера смотрят на одну и туже сессию. Я выше упоминал, что расскажу о способах защиты, рассмотрим самый простой способ — привяжем сессию к браузеру, точнее к тому, как браузер представляется серверу — будем запоминать User-Agent и проверять его каждый раз:
Ключевое слово в предыдущем абзаце похоже, в реальных проектах cookies уже давно «бегают» по HTTPS протоколу, таким образом никто их не сможет украсть без физического доступа к вашему компьютеру или смартфону
Стоит упомянуть директиву session.cookie-httponly, благодаря ей сессионная кука будет недоступна из JavaScript’a. Кроме этого — если заглянуть в мануал функции setcookie(), то можно заметить, что последний параметр так же отвечает за HttpOnly. Помните об этом — эта настройка позволяет достаточно эффективно бороться с XSS атаками в практически всех браузерах.
По шагам
А теперь поясню по шагам алгоритм, как работает сессия в PHP, на примере следующего кода (настройки по умолчанию):
А есть ли жизнь без «печенек»?
PHP может работать с сессией даже если cookie в браузере отключены, но тогда все URL на сайте будут содержать параметр с идентификатором вашей сессии, и да — это ещё настроить надо, но оно вам надо? Мне не приходилось это использовать, но если очень хочется — я просто скажу где копать:
А если надо сессию в базе данных хранить?
Отдельно замечу, что не надо писать собственные обработчики сессий для redis и memcache — когда вы устанавливаете данные расширения, то вместе с ними идут и соответствующие обработчики, так что RTFM наше всё. Ну и да, обработчик нужно указывать до вызова session_start() 😉
Когда умирает сессия?
За время жизни сессии отвечает директива session.gc_maxlifetime. По умолчанию, данная директива равна 1440 секундам (24 минуты), понимать её следует так, что если к сессии не было обращении в течении заданного времени, то сессия будет считаться «протухшей» и будет ждать своей очереди на удаление.
Интересен другой вопрос, можете задать его матёрым разработчикам — когда PHP удаляет файлы просроченных сессий? Ответ есть в официальном руководстве, но не в явном виде — так что запоминайте:
Самая тривиальная ошибка
Ошибка у которой более полумиллиона результатов в выдаче Google:
Cannot send session cookie — headers already sent by
Cannot send session cache limiter — headers already sent
Для получения таковой, создайте файл session.error.php со следующим содержимым:
Во второй строке странная «магия» — это фокус с буфером вывода, я ещё расскажу о нём в одной из следующих статей, пока считайте это лишь строкой длинной в 4096 символов, в данном случае — это всё пробелы
Для проверки полученных знаний, я хочу, чтобы вы реализовали свой собственный механизм сессий и заставили приведенный код работать:
Блокировка
Ещё одна распространённая ошибка у новичков — это попытка прочитать файл сессии пока он заблокирован другим скриптом. Собственно, это не совсем ошибка, это недопонимание принципа блокировки 🙂
Но давайте ещё раз по шагам:
«Воткнутся» в данную ошибку очень легко, создайте два файла:
Есть пару вариантов, как избежать подобного явления — «топорный» и «продуманный».
«Топорный»
Использовать самописный обработчик сессий, в котором «забыть» реализовать блокировку 🙂
Чуть лучше вариант, это взять готовый и отключить блокировку (например у memcached есть такая опция — memcached.sess_locking) O_o
Потратить часы на дебаг кода в поисках редко всплывающей ошибки…
«Продуманный»
Куда как лучше — самому следить за блокировкой сессии, и снимать её, когда она не требуется:
— Если вы уверенны, что вам не потребуется вносить изменения в сессионные данные используйте опцию read_and_close при старте сессии:
Таким образом, блокировка будет снята сразу по прочтению данных сессии.
— Если вам таки нужно вносить изменения в сессию, то после внесения оных закрывайте сессию от записи:
В заключение
В этой статье вам дано семь заданий, при этом они касаются не только работы с сессиями, но так же познакомят вас с MySQL и с функциями работы со строками. Для усвоения этого материала — отдельной статьи не нужно, хватит и мануала по приведенным ссылкам — никто за вас его читать не будет. Дерзайте!