Отправляет email-рассылки с помощью сервиса Sendsay
  Все выпуски  

Программирование с нуля - это совсем просто! 98) Курс PHP: Сессии


Школа программирования

Разработка ролевой игры

98) Курс PHP: Сессии

Сегодня - продолжение курса по PHP. Последний выпуск на эту тему - N 95.

Сессии

Сессии - одно из наиболее важных понятий PHP. Они были реализованы непосредственно в самом языке, начиная с 4-й версии.

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

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

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

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

Сессия начинается обращением к функции

session_start ();

Параметров у нее нету. Функция всегда возвращает true, поэтому результат ее вызова можно не проверять.

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

Регистрация переменной на всю сессию

После того, как сессия была открыта, функцией

session_register();

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

В качестве параметра функции указывается список названий этих переменных в кавычках (без предварительного символа "$" !). Функция возвращает true, если все переменные удалось зарегистрировать в сессии.

Например:

session_register("x", "MyVal");
$x = 5;

Чтобы в дальнейшем к этим переменным можно было обращаться непосредственно по имени, надо указать в настройках PHP-сервера (файл php.ini) в строке register_globals значение On (включить).

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

Проверка наличия регистрации

Функция

session_is_registered()

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

session_is_registered() обычно применяется в такой шаблонной конструкции:

      session_start();

      if (!session_is_registered("my_variable"))
      {
          session_register("my_variable ");
          $my_variable = начальное-значение;
      }

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

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

Завершение сессии

Функция

session_destroy();

завершает текущую сессию. При этом все переменные, что были зарегистрированы при ее открытии, остаются доступными.

Пример. Рассмотрим простейший пример организации сессионного взаимодействия с пользователем. Он может использоваться как шаблон для создания собственных интерактивных приложений.

Подготовим простую форму отправки значения PHP-сценарию.

  <html>
  <body>
  <h1>Пример сессии </h1>

  <form action="action.php" method="POST">
  Введите число: <input type="text" name="myvalue">
  <p>
  <input type="submit" value="Отправить">
  </form>

  </body>
  </html>

Сценарию action.php введенное число будет передаваться в поле myvalue.

Допустим, нам требуется показывать как текущее число, так и самое первое, введенное человеком в первый раз. Для этого (для хранения самого первого числа), очевидно, потребуется режим сессии. Условимся, что хранить первое значение мы будем в переменной mytest.

  <html>
  <body>
  <h1> Сессионный PHP-скрипт </h1>

  <?php

  // открываем сессию
      session_start();

  // проверяем, была ли в ней зарегистрирована переменная mytest:
      if ( ! session_is_registered("mytest") )

        { // нет еще - значит, надо
          // зарегистрировать переменную сессии
          // под названием mytest:

          session_register("mytest");

          // сразу в эту переменную занесем
          // первое значение, полученное от формы:

          $mytest = $_POST["myvalue"];
      }

  // выводим текущее полученное значение:

  print "<p>Сейчас введено: " ;
  print $_POST["myvalue"];

  // выводим значение, полученное в первый раз
  // и сохраненное в переменной $mytest:

  print "<p>В первый раз вы ввели: " ;
  print $mytest;

  ?>

  </body>
  </html>

Точка вызова сессий

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

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

  <?php

  // открываем сессию
      session_start();

  ?>

  <html>
  <body>
  <h1> Сессионный PHP-скрипт </h1>

  <?php

  // проверяем, была ли в ней зарегистрирована переменная mytest:
      if ( ! session_is_registered("mytest") )

        { // нет еще - значит, надо
          // зарегистрировать переменную сессии
          // под названием mytest:

          session_register("mytest");

          // сразу в эту переменную занесем
          // первое значение, полученное от формы:

          $mytest = $_POST["myvalue"];
      }

  // выводим текущее полученное значение:

  print "<p>Сейчас введено: " ;
  print $_POST["myvalue"];

  // выводим значение, полученное в первый раз
  // и сохраненное в переменной $mytest:

  print "<p>В первый раз вы ввели: " ;
  print $mytest;

  ?>

  </body>
  </html>

Задание. Модифицируйте сценарий action.php так, чтобы при введении в форму некоторого значения (например, 999) вызывалась бы функция завершения сессии session_destroy(). Проверьте, что после ее вызова произойдет со значением переменной $mytest.


(c) 2004-2006 Сергей Бобровский bobrovsky@russianenterprisesolutions.com

Школа программирования с нуля
Все предыдущие выпуски базового курса тут:
http://russianenterprisesolutions.com/sbo/

Дизайн рассылки: Алексей Голубев - Web-дизайн и web-программирование


В избранное