Сессии в PHP

сессии в PHP

От автора: В этой статье мы поговорим о сессиях в PHP. Т.к. протокол HTTP не поддерживает сохранение данных между двумя разными транзакциями, были придуманы сессии.

Это очень упрощает работу, как программистам, так и пользователям. Например, сессии используются после авторизации пользователя на сайте: держат в памяти сервера данные о том, что пользователь был авторизован, и что теперь ему можно дать некоторые права администрирования или использования сайта (комментирование, просмотр закрытых для гостей страниц или же написание-редактирование-удаление новостей на сайте, etc.).

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

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

Перед изучением урока, я рекомендую скачать исходник себе на компьютер!

Как работают сессии PHP?

Первым делом идентифицируется браузер. Ему выдается уникальный идентификатор, который будет передаваться при каждом запросе.

Идентификатор – это обычная переменная с неким значением. По умолчанию её имя PHPSESSID.

И цель PHP заключается в том, чтобы передать (двумя способами) эту переменную браузеру, чтобы тот, в свою очередь, вернул её со следующим запросом.

Грубо говоря, на сервере создается файл со всеми переменными для созданной сессии (+устанавливается период жизни сессии). И при открытии сессии в каком-то PHP файле, то сразу же идет запрос о получении id с cookies (см. выше — PHPSESSID), если нет таковой cookie с именем PHPSESSID , то создается новая сессия. Ну а если есть PHPSESSID, то с сервера загружается все связанное с предыдущей сессией. (Например, зарегистрированные переменные сессии).

Способы передачи значение переменной PHPSESSID

Через Cookies

Через URL

Кратко о способах

В браузер записывается cookie с именем PHPSESSID, естественно, если пользователь разрешил записывать их у себя в браузере. Подробнее о cookies можно почитать здесь, на этом сайте.

Через URL – PHP дописывает к каждой ссылке передачу id сессии (как для меня, это не очень удобно).

Итог: Кроме разрешения пользователя на использование cookie при передаче id сессии, можно так же задавать разрешение для PHP в файле php.ini для таких вот строк:

session.use_cookies = (1 – разрешить cookies, 0 — запретить)

session.use_trans_sid = (1 – разрешить передачу id сессии через url, 0 — запретить)

А вот и скриншот того, как должен выглядеть cookie PHPSESSID в браузере

сессии в PHP

Комментарий к скриншоту: как вы видите, я имею cookie PHPSESSID для домена sessions.gromitsu. Как я это получил? Все просто. Я создал файл index.php в корне домена sessions.gromitsu и открыл-закрыл в нем сессию.

<?php
session_start();
session_unset();
session_destroy();
?>

Установка (открытие) сессии PHP

Открытие сессии PHP производится при помощи функции session_start(), которая (ВНИМАНИЕ!) вызывается в самом начале php файла. Иначе вылезет ошибка (см. ниже).

session_start();

Эта функция проверяет, существует ли PHPSESSID (или в cookies, или в ссылке (метод GET или POST)). Если да, загружает зарегистрированные переменные сессии, если нет, то создает новую сессию.

Регистрация переменных и удаление сессии

Регистрация переменных сессии.

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

$_SESSION[‘yourname’] = "Vasya"; // сохраняем имя Вася в суперглобальный массив $_SESSION.
Вместо yourname может быть что угодно.

Вывод определенных данных с $_SESSION

echo $_SESSION[‘yourname’]; //выведет Vasya

Ещё добавлю, что регистрировать переменные можно, как и массивы. О чем я? Смотрите ниже.

<?php
session_start();
$_SESSION['somearray'] = array('hello','world'); // 
echo $_SESSION['somearray'][0];
?>

сессии в PHP

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

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

Разработаем простой скрипт инициализации имени пользователя на одной странице, удаление сессии и вывода приветствия с именем этого пользователя на другой странице.

pageone.php

<?php
session_start(); // Отрываем сессию
$_SESSION['user'] = 'Вася'; // регистрируем переменную user через суперглобальный массив $SESSION со значением "Вася"
?>
<a href="pagetwo.php">Перейти на вторую страницу</a>

сессии в PHP

pagetwo.php

<?php
session_start(); // Стартуем сессию.
echo "Приветствую вас, ".$_SESSION['user']; //Выведем имя пользователя через суперглобальный массив $_SESSION
session_destroy(); //уничтожим все данные, хранящейся в суперглобальном массиве $_SESSION
?>

сессии в PHP

Ну и страница, до которой данные сессии не сохранились. Сценарий такой же как и в pagetwo.php

pagethree.php

<?php
session_start(); // Для работы с сессиями, их нужно сначала запустить (открыть, стартонуть)
echo "Приветствую вас, ".$_SESSION['user']; //Выведем имя пользователя через суперглобальный массив $_SESSION
?>

сессии в PHP

Напоследок поговорим о ЕРРОРАХ, которые могут возникнуть в процессе обучения.

Warning: Cannot send session cookie — headers already sent

Warning: Cannot send session cache limiter — headers already sent

Эти ERRORS говорят о том, что ещё до использования функции session_start() был передан хоть один HTTP заголовок. Что это? При общении сервера и браузера сначала идет запрос на сервер, откуда потом сначала возвращается HTTP заголовок, а потом вся информация, которую вы запрашивали. Так вот, в PHP для удобства придумали так, чтобы функции header(), set_cookie(), session_start() передавали сами HTTP заголовки. И вот, неопытный программист, ещё до выполнения одной из выше написанных функций, имел неосторожность поставить лишний символ (пробел, цифру, букву). Так вот, до функций header(), set_cookie(), session_start() не должно стоять никакого символа. Абсолютно никакого! Тогда все будет работать на УРА!

На этом, урок по работе с сессиями в PHP, окончен. Буду рад Вашим комментариям и вопросам.

С уважением, Влад Паук.

киберсант-вебмастер

Автор: Влад Паук

Редакция: Рог Виктор и Андрей Бернацкий. Команда webformyself.

E-mail: contact@webformyself.com

Проект webformyself.com — Как создать свой сайт. Основы самостоятельного сайтостроения

"Киберсант-вебмастер" — самый полный курс по сайтостроению в рунете!

P.S. Хотите опубликовать интересный тематический материал и заработать? Если ответ «Да», то жмите сюда.

Курс по программированию на языке PHP

Изучите PHP с нуля до результата!

Смотреть курс

Метки: ,

Комментарии Вконтакте:

Комментарии Facebook:

Комментарии (32)

  1. Даврон

    Привет из Ташкента! Спасибо за статью.

  2. Alex

    Проще некуда

  3. Алексей

    Я очень хочу этот курс посмотреть, но напряг в связи с отсутствием на данный момент денег.
    Скажите стоимость комплекта и можно ли будет его получить с отсрочкой платежа???
    Без обид…
    Подпись — Алексей Евгеньевич…

  4. Вардан

    Урок получилось отлично.
    Думаю каждый занимающий PHP программированием знает о необхадимости сессий. Полезный урок. Спасибо за Ваш труд.

  5. Арман

    Спасибо за статью.
    Если можно скажите разницу между session_unset() и unset($_SESSION['something']), ведь обе уничтожают переменную, какое лучше использовать?

    • Влад Паук

      Хороший вопрос. Лучше все использовать второй вариант. Если быть точнее, безопаснее.

      Спасибо вам за комментарий.

  6. Николай

    Андрей, Влад и Виктор здравствуйте!!! Вначале Спасибо большое за ваши уроки и за ваше отзывчивое сердце. Пробовал самостоятельно раньшеизучать и PhP и CSS и всё что связано с программированием, но для этого нужны мозги помоложе чем мои, а вот с вашей помощью и вашими уроками намноговсё стало яснее и понятнее, за что и я и все кто у вас учится благодарны за вашу помощь в постижении этой части науки о программировании. Поздравляю вас С Наступающим Новым Годом !!! Пусть в последующих годах вашей жизни всегда вам будет Удача и Успех во всём. С искренним уважением Николай Пахомов 69 лет.

  7. Kai

    Здравствуйте Влад!

    У меня к вам такой вопрос:

    Я впервые столкнулся с вопросом как привести к валидности свои страницы.

    Как исправлять ошибки,чтоб на выходе получалась целиком валидная страница?

    • Andrey Bernacki

      Я конечно не Влад и может быть не в теме вопроса, но что значит как?
      Вам высветил валидатор — 612 Errors, 3 warning(s) — 612 ошибок и 3 предупреждения. Далее каждая ошибка разбирается и поясняется что не так. Если на английском не читаете, то нужно посидеть со словарем ( могу посоветовать http://translate.google.com/). В некоторых случаях даже пишет «How to fix» — «как исправить». Плюс к этому пишет в какой строке ошибка. Собственно берете и правите.

      Например на 2-ую строку ругается потому что у вас идет , а доктайп указан < !DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.01 Transitional//EN" "http://www.w3.org/TR/html4/loose.dtd">. Соответственно решение:

      1. Или убрать строку ;
      2. Или доктайп сделать таким — < !DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">

      Причем второй вариант предпочтительнее.
      Потом нужно будет поправить все теги мета. Ну и так далее.

      P.S. Был бы вопрос конкретный, так и ответ бы дал конкретный (например написано правильно, но все равно выдает ошибку). А на абстрактный вопрос «А как?» и ответ такой же — «А вот так…»

      • Kai

        Не чем ответить Андрей на удаленный комментарий?

        Не знаете ответа или исправлять косяки просто влом?

        • Виктор Рог

          В чем именно у Вас проблема?

          • Kai

            Я уже писал в чем проблема Виктор.

            Просто Андрей тут любит модерировать по чем зря.

            И вносить сумятицу в голову коллег.

            Чуть ниже отписал о чем..

            Спасибо за отклик.

          • Виктор Рог

            По-моему скромному мнению сумятицу вводите Вы. Только без обид.
            Андрей отвечает на все направленные вопросы ему на email. ГАРАНТИРОВАНО. И судя по откликов многих, отвечает он качественно, поэтому обвинение его в некомпетентности, по меньшей мере не обосновано.

            …ИМХО.

          • Andrey Bernacki

            Андрей вообще к модерации комментариев отношения не имеет — если что))

        • Andrey Bernacki

          По поводу — «Не чем ответить Андрей на удаленный комментарий?»
          — Я считаю, что я рассказал вам, как действовать в данной ситуации. Даже для примера первую ошибку разобрал.

          По поводу — «Не знаете ответа или исправлять косяки просто влом?»
          — За вас исправлять 613 ошибок, копаясь в чужом коде, у меня просто нет времени. Мне еще и на мыло письма приходят, и поддерживать клиентов, купивших курс тоже нужно. А забить на них всех и сесть на день разбираться с вашим кодом… Ну извините…

          А по поводу — «Не знаете ответа?»
          — Там ответ сам валидатор пишет, только на английском. — Может Вам влом со словарем посидеть? Плюс вам же пользы от этого больше будет. Сами разберетесь и больше таких ошибок клепать не будете. Ну а если в чем-то конкретно засада будет, пожалуйста, — Вопрос в студию. Помогу.

          • Kai

            Андрей вы извините,но вы сами вносите сумятицу в ответе мне.
            и людей впросак вводите..
            Где мой второй комментарий на ваш первый отклик?

            Кто его модерировал и и не стал показывать на общее обозрение?

            А ведь я там ясно изложил свою мысль..

            И что касается моего второго комментария,то оно уже касалось именно по второму моему комментарию.

            И если вкратце ,то повторю еще раз:

            Сайт не мой,его клепал горе программист.
            Просто по работе досталось править за ним ошибки.

            Наткнувшись на ваш сайт,решил спросить у коллег как править ошибки в php,
            и править не просто так, а еще приводить их к валидности.

            И пример мне нужен лишь единичный, а не править все косяки.

            И в качестве примера просил вас показать это на любой вашей странице,

            которые тоже валидным идеалом не блещут,вплоть до CSS

            Опыт работы с ошибками в HTML у меня на отлично,примеры я уже давал.
            И с английским о,кей

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

            Но,а если не знаете как, так и скажите — не можем мол брат, не можем..

            И давайте не резать комментарии
            Ведь это легче всего -удалить то..

          • Andrey Bernacki

            Как говорил выше, комментарии я не модерирую. Не знаю куда он делся. Хотя модерируются все комментарии — и хорошие и плохие, тем более если это вопрос. Так что возможно он просто не дошел до сайта.

            И так, как это делать.
            Я понимаю, что идет часть PHP кода, в нем всавки html. Но в этом коде нужно найти то место, на которое ругается валидатор и подправить. Найти можно обычным поиском аля «Правка» -> «Найти» — это в любом редакторе кода есть.
            То что касается пропущенного атрибута alt в теге img или неправильного закрытия тега img — то это прямо из админки в редакторе статьи делать придется

  8. shanson

    Пробежалась по статье, вот думаю – изучать или нет PHP. Сейчас у меня блог php не поддерживает. А завтра. Хорошо, что есть места где об этом можно почитать

  9. Nelly

    Спасибо за статью! Все понятно написано, очень интересно и тема актуальная! А можно узнать, а в курсе ДВД есть такой материал?

  10. Ника

    огромное спасибо за познавательную статью!

  11. анатолий

    Спасибо,друзья! Но мне этот интересный материал не осилить.

  12. Артем

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

  13. Алексей

    Сессии эт прикольно , но вот недавно была проблема .
    Делал в админке сайта аякс запрос к пхп файлу ( скрипт обрабатываться может секунд 20-40), так вот в это время хотел еще делать еще 1 аякс запрос к другому скрипту, но не работало . Оказалось так как я использую сессии в первом скрипте и во втором, первый блочил запись файла сессии ,а второй скрипт так как файл заблокирован ждал пока обработается первый

  14. Жёлтый Дракон

    Хорошая статья, всё доходчиво и понятно. Респект.

  15. Руслан

    Очень полезная статья. Всё очень понятно. Спасибо!!!

  16. A1ex

    Мне, как начинающему, статья действительно полезна. Хочу реализовать расширенную форму комментариев на Вордпресс, это как раз то что мне нужно

  17. seo-самурай

    Здорово, но непонятно. Нужно наверное первые уроки почитать.

  18. Игорь

    Толково написано!

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *

Можно использовать следующие HTML-теги и атрибуты: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <strike> <strong>

Я не робот.

Spam Protection by WP-SpamFree