Пятница, 17.05.2024, 00:04
DigitalBox
Приветствую Вас Гость | RSS
Главная Обмен страничными данными Регистрация Вход
Меню сайта

Обмен страничными данными



При перемещении пользователя между страницами Web-приложения может возникнуть ситуация, когда информация, введенная на одной странице, может понадобиться на другой странице. Для реализации этого требования на языке РНР можно воспользоваться несколькими способами:

  • Добавление информации к URL-адресам. В этом случае требуемую информацию можно добавить к URL-адресу новой страницы. Этот подход оказывается наиболее эффективным только при передаче небольшого количества данных.
  • Хранение информации с помощью данных cookie. Для передачи информации между сценариями можно воспользоваться данными cookie, которые представляют собой множество пар "переменная-значение" (имя_переменной=значение). При этом информация сохраняется в клиентской части приложения, т.е. на локальном компьютере пользователя. После того как данные cookie были сохранены, ими можно воспользоваться с любой Web-страницы. Существенный недостаток такого подхода заключается в возможности отключения режима использования данных cookie в клиентском браузере.
  • Передача данных с использованием HTML-форм. Для передачи информации между различными сценариями Web-приложения могут использоваться HTML-формы. После щелчка на кнопке Submit данные из полей формы будут переданы серверному сценарию. Такой подход оказывается весьма полезным, если необходимо взаимодействовать с пользователями.
  • Использование сеансов. Начиная с версии 4, язык РНР позволяет реализовать поддержку пользовательских сеансов и всю необходимую информацию хранить на сервере. Доступ к этой информации можно получить из любого сценария (Web-страницы). Этот подход оказывается особенно эффективным при просмотре большого количества Web-страниц.

В следующих разделах каждый из упомянутых подходов рассматривается более подробно.


Добавление информации к URL-адресу

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

переменная=значение

В этом случае переменная— это имя переменной (без использования символа $), а значение — ее значение. Пару переменная=значение можно добавить к адресу URL после символа ?. Например:

  • <a href= "nextpage. рнр?age=14">перейти на следующую страницу</а>
  • header("Location: nextpage.php?age=14");
  • <form action="nextpage.php?age=14" method="POST">

Во всех трех примерах при переходе на новую страницу nextpage.php передается переменная $age со значением 14. Строка age=14 добавляется в конец URL-адреса сразу после знака ?.

При передаче в адресе URL нескольких пар "переменная-значение" они отделяются друг от друга амперсантом (&). Например:

<form action="nextpage.php?state=CA&city=Moлл" method="POST">

Доступ ко всем переменным, передаваемым в строке URL, можно получить через встроенный массив $__GET. В сценарии nextpage.php из предыдущего примера для отображения переданных значений можно воспользоваться выражением:

echo "{$_GET['city']}, {$_GET['state']}";

и получить следующий результат:

МОЛЛ, СА

Эти же данные можно извлечь и из массива $_REQUEST. Например:

echo "{$_REQUEST['city']}, {$_REQUEST['state']}";

С использованием URL удобно передавать лишь небольшое количество информаши. Кроме того, такой подход обладает и рядом других недостатков (в том числе связанных и с обеспечением безопасности), среди которых следует выделить следующие:

  • Общедоступность. Адрес URL всегда отображается в адресной строке окна браузера. Естественно, что передаваемая информация также будет видна пользователю. Например, если требуется передать пароль, вряд ли стоил использовать для этого URL-адрес.
  • В URL-адресе можно передавать любую информацию. Рассмотрим ситуацию, когда пользователь зашел на Web-узел с ограниченным доступом. В этом случае к URL-адресу добавляется строка auth=yes (свидетельствующая о том, что аутентификация завершилась успешно). При этом проверка равенства $_GET['auth'] =yes будет выполняться на каждой странице. Лишь при истинности этого условия будет осуществляться переход на новую страницу. Однако любой пользователь может ввести в окне 6payзepa URL-адрес http://www.имя-узла.com/page.php?auth=yes и без ввода каких-либо данных аутентификации получить доступ к страницам с ограниченным
    доступом.
  • Адрес URL можно сохранить в браузере. Пользователь может сохранить в браузере закладку с URL-адресом, а вместе с ним и добавленную к нему информацию.
  • Ограниченная длина адреса URL. Для разных браузеров и их версий максимальная длина URL-адреса всегда конечна (хотя и различается). Если необходимо передать большое количество информации, то объективные ограничения, наложенные на длину адреса URL, могут не позволить этого сделать.

Передача информации с помощью данных cookie

Информацию, которую необходимо передавать от страницы к странице, можно сохранить как данные cookie. Эти данные представляют собой набор пар "переменная-значение" (переменная=значение) и очень напоминают фрагменты, добавляемые к URL-адресу. Особенность данных cookie заключается в том, что они сохраняются браузером на пользовательском компьютере и позже могут использоваться сценариями.

На первый взгляд, данные cookie позволяют решить все проблемы, связанные с обменом данных между отдельными компонентами (страницами) Web-приложения. Их необходимо хранить в клиентском браузере и использовать по мере необходимости. Сохранив данные cookie один раз, их можно использовать при последующих посещениях данной Web-страницы. Однако, как легко догадаться, не все так просто. Дело в том, что режим использования (или неиспользования) данных cookie в клиентском браузере полностью определяется пользователем. Другими словами, в любой момент он их может удалить или вообще от них отказаться. Большинство посетителей Web-узлов зачастую именно так и поступают. Далеко не все из них рады тому, что кто-то сохраняет у них на компьютере свою информацию. Подобная реакция вполне объяснима. Приведенные выше рассуждения и факты существенно сужают область применения механизма cookie. Если основу функционирования Web-приложения составляют данные cookie и пользователь отключил режим их использования, то оно будет работать некорректно.

Изначально данные cookie предназначались для хранения небольшого количества данных в течение короткого промежутка времени. Если для данных cookie не указать время их жизни, то они будут удалены сразу же после завершения работы с Web-приложением. Несмотря на то что данные cookies достаточно полезны, следует хорошенько подумать, прежде чем принять решение о необходимости их использования. И вот по каким причинам:

  • Возможность отключения режима использования данных cookie. До тех пор пока нет полной уверенности в том, что все пользователи разрешают использование данных cookie (или согласны установить этот режим работы браузера), возможно возникновение проблем и нарушение корректного функционирования Web-приложения.
  • Язык РНР предоставляет гораздо более эффективные средства. Начиная с версии 4 языка РНР, механизм поддержки сеансов обеспечивает возможность хранения данных на протяжении всего сеанса (session) работы пользователя — другими словами, до тех пор, пока он остается на Web-узле. При этом информации хранится на сервере, так что пользователь на это никак не может повлиять.
  • Информацию можно хранить в базе данных. Если имеется доступ к базе данных, которая позволяет как хранить, так и извлекать информацию, то эта возможность гораздо лучше, чем использование данных cookie. Пользователи не смогут удалить информацию из базы данных.

Манипулирование данными cookie

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

setcookie("переменная", "значение");

Параметр переменная представляет собой имя переменной (без символа $), а значение — ее значение. Это выражение будет сохраняться до тех пор, пока пользователь не покинет Web-узел. Рассмотрим следующий пример, в котором с помощью данных cookie на клиентском узле сохраняется выражение state=CA:

setcookie("state","СА");

К данным cookie можно обратиться с помощью встроенного массива $_СООКIЕ. Например, можно вывести выражение:

echo "Вы живете в штате {$_COOKIE['state']} ";

В результате будут получены следующие данные:

Вы живете в штате СА

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


Установка времени жизни данных cookie

В случае необходимости можно задать время жизни данных cookie. Для этого предназначена функция setcookie() с синтаксисом:

setcookie("переменная", "значение", время-жизни);

Параметр время-жизни определяет время, по истечении которого данные cookie будут удалены. Обычно это значение вычисляется с помощью функции time() или mktime().

  • time(). Эта функция возвращает текущее значение даты и времени. Для задания времени жизни данных cookie к результату функции time() следуетприбавить соответствующее значение в секундах. Например:
    setcookie("state", "СА", time ()+3600) ; #удаление данных: через 1 час
    setcookie("Name", $Name, time()+(3*86400)) #удаление данных через 3 дня
  • mktime(). Эта функция позволяет преобразовать указанное значение дггы и времени в форму, которая понятна компьютеру. Для этого требуемую дату необходимо представить в следующем виде: часы, минуты, секунды, месяц, день и год. Если какое-то значение будет пропущено, по умолчанию используется значение, соответствующее текущему моменту времени. Ниже npиведено несколько примеров установки времени жизни данных cookie с помощью функции mktime().
    setcookie("state", "СА", mktime(3, 0, 0, 4, 1, 2003)); #удаление cookie 1 апреля 2003 года в 03:00
    setcookie("state", "СА", mktime(13, 0, 0,,,)); #удаление данных сегодня в 13:00

Для удаления данных cookie соответствующей переменной необходимо присвоить пустое значение. Это можно осуществить двумя способами:

setcookie("имя");
setcookie("имя", "");

Однако функция setcookie() имеет одно существенное ограничение. Она должна вызываться до генерации какой-либо части Web-страницы. Невозможно задать данные cookie где-то в середине сценария после того, как некоторая часть страницы уже была сформирована.


Передача информации с помощью HTML-форм

Один из стандартных способов передачи информации между страницами заключается в использовании форм. Дело в том, что HTML-формы могут содержать кнопку Submit. После щелчка на этой кнопке введенная в поля формы информация передается сценарию, URL-адрес которого задан в дескрипторе <form>. Для описания формы используется следующий общий синтаксис:

<form action="processform.php" method="POST">
     поля формы
<input type="submit" value="строка">
</form>

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

Поля, которые не отображаются на Web-странице, но используются при передаче данных, называются скрытыми (hidden fields). Их можно использовать как вместе с обычными полями, так и отдельно от них. После щелчка на соответствующей кнопке значения скрытых полей передаются следующей странице. В следующем примере после щелчка на кнопке Следующая страница регистрационные данные пользователя будут переданы странице nextpage.php:

‹?php
     $acct = "admin";
     echo "<form action='nextpage.php' method='POST'>
                 <input type='hidden' name='acct' value='$acct'>
                 <input type='submit' value='Следующая страница'>
                 </form>\n";
?›

Ha Web-странице отображается только кнопка Следующая страница, причем пользователю не нужно вводить никакой информации. После щелчка на этой кнопке вызывается сценарий nextpage.php, а значение скрытого поля сохраняется в элементе массива $_POST ['acct']. Такой подход позволяет передавать требуемую информацию между страницами Web-узла. Например, приведенный фрагмент можно включить в сценарий, предназначенный для отображения различных видов товаров. Тогда после щелчка на кнопке Следующая страница регистрационные данные пользователя будут переданы новой странице и, таким образом, окажутся доступными для соответствующего сценария.


Использование сеансов РНР

Сеанс (session) можно определить как промежуток времени, в течение которого пользователь взаимодействует с Web-приложением. В течение одного сеанса посетители Web-узла обычно просматривают большое количество страниц, и очень часто требуется иметь доступ к одной и той же информации на каждой из них. Начиная с версии 4.0, язык РНР позволяет реализовать такой подход, основанный на механизме поддержки сеансов.


Как работают сеансы РНР

Язык РНР предоставляет средства для создания сеансов и хранения связанных с ними переменных. После создания сеанса значения установленных переменных становятся доступными на любой странице (или в сценарии) Web-приложения. При открытии сеанса интерпретатором РНР выполняются следующие действия.

  1. Сеансу присваивается уникальный идентификатор (session ID number). Обычно идентификатор представляет собой очень длинную строку, которая является уникальной для конкретного пользователя (например, 523afal5f4a8e05e95241481c0cbc71e). Такую строку подобрать практически невозможно. В окружении РНР это значение хранится в переменной $PHPSESSID.
  2. Все необходимые переменные сеанса сохраняются в файле, который размещается на сервере. Причем имя файла совпадает с идентификатором сеанса. Каталог, в котором хранятся файлы сеансов, определяется директивой session.save_path файла php.ini. Причем этот каталог должен быть создан предварительно.
  3. Интерпретатор РНР передает идентификатор сеанса каждой странице. Если у пользователя активизирован режим использования данных cookie, то передача требуемых данных между сервером и клиентским браузером осуществляется с использованием этого механизма. В противном случае работа модуля РНР определяется значением директивы trans-sid конфигурационного файла php.ini. (Более подробно этот механизм описывается ниже, в разделе "Поддержка сеансов при отключенном режиме использования данных cookie".)
  4. Файл с данными сеанса доступен для всех сценариев в рамках этого сеанса. При этом переменные хранятся также в массиве $_SESSION.

В версиях РНР 4.1.2 и более ранних директива trans-sid доступна только в том случае, если модуль РНР скомпилирован с параметром --enable-trans-sid.


Открытие и закрытие сеансов

Сеанс нужно открывать в начале каждой страницы, используя функцию session_start(). Эта функция сначала проверяет, был ли ранее создан сеанс. Если да, то выполняется установка переменных сеанса. В противном случае создается новый сеанс с уникальным идентификатором.

Поскольку механизм поддержки сеансов во многом зависит от режима поддержки данных cookie, то на использование функции session_start() накладываются те же ограничения. Другими словами, ее нужно вызывать до вывода какой-либо информации на Web-странице. Более подробно этот вопрос рассматривался ранее во врезке "Функции, которые следует вызывать первыми".

Интерпретатор РНР может автоматически добавлять функцию session_start() в начале каждой серверной страницы. Для этого необходимо внести соответствующие изменения в конфигурационный файл php.ini, а именно: задать для директивы session.auto_start значение 1. Для того чтобы внесенные изменения вступили в силу, нужно перезапустить Web-сервер. После этого добавлять функцию
session_start() в начало каждой страницы уже не понадобится.

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

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

unset($переменная1, $переменная2, ...);


Использование сеансовых переменных

Для того чтобы сохранить переменную в рамках сеанса и обеспечить ее доступность на других Web-страницах, нужно сохранить ее в массиве $_SESSION следующим образом:

$_SESSION['имя_переменной'] = "Джон Смит";

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

Для удаления переменной в любой момент можно воспользоваться функцией unset():

unset($_SESSION['имя_переменной'] );

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

Листинг А - Создание сеанса

‹?php
     / * Имя сценария: sessionTest1.php
        * Описание: создает сеанс и сохраняет связанные
        * с ним переменные.
        */
      session_start();
     $_SESSION['session_var'] = "тестирование";
?›
<html>
<head><title>Tecтовая страница 1 ceaнca</title></head>
<body>
     <р>Тестирование свойств сеансов.
     <form action="sessionTest2.php" method="POST">
          <input type="text" name="form_var" value="тестирование">
          <input type="submit" value="Перейти на следующую страницу">
     </form>
</body>
</html>

В приведенном сценарии с помощью функции session_start() создается сеанс с одной переменной session__var. На странице содержится также форма с одним текстовым
полем и кнопкой Перейти на следующую страницу, после щелчка на которой вызывается сценарий sessionTest2.php.

Листинг В - вторая страница сеанса

‹?php
     / * Имя сценария: sessionTest2.php
        * Описание: получение данных текущего сеанса.
        */
     session_start();
?›
<html>
<head><title>Tecтовая страница 2 ceaнca</title></head>
<body>
‹?php
     $session_var = $_SESSI0N['session_var'];
     $form_var = $_POST['form_var'];
     echo "session_var = $session_var<br>\n";
     echo "form_var = $form_var<br>\n";
?›
</body>
</html>

Этот сценарий отображает значения переменных, переданных из предыдущего сценария (sessionTest1.php).

Если пользователь загрузил в браузер страницу sessionTest1.php и щелкнул на кнопке Перейти на следующую страницу, то будет получен следующий результат:

session_var = тестирование
form_var = тестирование

Как можно увидеть, значения обеих переменных, session_var (связанная с сеансом) и form_var (из поля формы), можно получить из встроенных массивов $_SESSION и $_POST соответственно.


Поддержка сеансов при отключенном режиме использования данных cookie

Зачастую пользователи отключают в браузере режим использования данных cookie. При использовании механизма поддержки сеансов модуль РНР проверяет, допускает ли клиентский браузер использование данных cookie. Если соответствующий режим включен, выполняются следующие действия:

  • Переменной $PHPSESSID присваивается значение идентификатора сеанса.
  • Данные cookie используются для передачи $PHPSESSID между сценариями или страницами.

Если клиентский браузер запрещает использовать данные cookie, то модуль РНР функционирует по-другому:

  • Создается константа с именем SID, в которой содержится пара "переменная-значение" вида PHPSESSID=идентификатор-сеанса.
  • После этого использование идентификатора сеанса определяется значением директивы trans-sid в конфигурационном файле php.ini. Если эта директива включена, то идентификатор сеанса передается между страницами или сценариями, в противном случае — нет.

По умолчанию директива trans-sid отключена. Для ее включения следует внести соответствующие изменения в строку session.use_trans_sid= файла php.ini. Если в этой строке содержится значение 0, то директива trans-sid отключена, если 1— включена. После внесения изменений нужно перезапустить Web-сервер. Включение директивы trans-sid имеет как преимущества, так и недостатки:

  • Преимущества. Механизм поддержки сеансов функционирует корректно даже в том случае, если пользователь отключил режим использования данных cookie, т.е. при использовании директивы trans-sid можно создавать сценарии, не зависящие от настроек клиентского браузера.
  • Недостатки. Идентификатор сеанса передается в URL-адресе и, как следствие, отображается в адресной строке браузера. С точки зрения обеспечения безопасности этого следует избегать.

Использование сеансов с включенной директивой trans-sid

Если директива trans-sid включена и в клиентском браузере отключен режим использования данных cookie, то идентификатор сеанса автоматически пересылается с помощью URL или скрытых полей формы. При переходе на новую страницу с помощью ссылки, функции header() или формы с методом GET идентификатор сеанса размещается в URL-адресе. Если же новая страница отображается в результате заполнения полей формы, в которой для передачи данных на сервер указан метод POST, то идентификатор сеанса размещается в скрытых полях. При этом в обоих случаях идентификатор сеанса хранится в переменной $PHPSESSID.

Идентификатор сеанса добавляется только к URL-адресам, которые находятся в рамках одного Web-узла. Если же в URL содержится имя сервера, идентификатор сеанса не добавляется. Например, к ссылке

<а href="newpage.php">

интерпретатор РНР добавит идентификатор сеанса. Однако при обработке ссылки

<а href="HTTP://www.janetscompany.com/newpage.php">

идентификатор сеанса добавляться уже не будет.


Использование сеансов с отключенной директивой trans-sid

Если в директиве trans-sid содержится значение 0 и в клиентском браузере отключен режим использования данных cookie, то модуль РНР не будет пересылать идентификатор сеанса на следующую страницу или в сценарий. Разработчик должен сделать это самостоятельно. К счастью, в окружении РНР имеется соответствующая константа SID, значение которой можно пересылать на следующую страницу вручную. В этой константе содержится пара "имя-переменной=значение", которую к адресу URL можно добавить следующим образом:

<а href="nextpage.php?‹?php echo SID?›" > следующая страница </а>;

В приведенной ссылке после имени файла стоит вопросительный знак и константа SID с идентификатором сеанса. Выражение echo SID позволяет получить примерно следующий результат:

PHPSESSID=f8544042bf883ca93b5e2c5dc6794755

Таким образом, адрес URL будет выглядеть примерно так:

nextpage.php?PHPSESSID=f8544042bf883ca93b5e2c5dc6794755

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

‹?php
     $PHPSESSID = session_id();
     echo "<form action='nextpage.php' method='POST'>
                 <input type='hidden' name='PHPSESSID'
                               value='$PHPSESSID'>
                 <input type='submit' value='Следующая страница'>
</form>";
?›

В приведенном фрагменте выполняется следующее:

  1. Переменной $PHPSESSID присваивается значение идентификатора сеанса, возвращаемое функцией session_id().
  2. Затем с использованием скрытого поля формы значение $PHPSESSID передается на следующую страницу.

Таким образом, переменная $PHPSESSID автоматически будет доступна на следующей странице nextpage.php.


Создание сеансов для групп пользователей

Сеансы прекрасно подходят для обеспечения ограниченного доступа к ресурсам Web-yзлa и ввода регистрационных данных. На таких узлах обычно содержится большое количесгво страниц. Однако заставлять пользователя постоянно вводить регистрационные данные не желательно. К счастью, сеансы РНР позволяют отслеживать действия зарегистрированного пользователя и по необходимости предотвратить возможность доступа к той или иной странице тем пользователям, которые ранее не были зарегистрированы. С помощью механизма поддержки сеансов можно выполнить следующие действия:

  1. Отобразить страницу регистрации для ввода имени пользователя и пароля.
  2. После успешной регистрации создать и сохранить соответствующие переменные сеанса.
  3. При переходе пользователя на следующую страницу на основе переменных сеанса проверить факт успешно пройденной процедуры регистрации.
  4. Если пользователь зарегистрировался, отобразить Web-страницу.
  5. В противном случае предложить пользователю ввести регистрационное имя и пароль.

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

‹?php
     session_start()
     if (@$_SESSION['login'] != "go")
     {
          header("Location: loginPage.php");
          exit();
     }
?›

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

Форма входа

Мини-чат

Календарь новостей
«  Май 2024  »
ПнВтСрЧтПтСбВс
  12345
6789101112
13141516171819
20212223242526
2728293031

Поиск

Друзья сайта
Скажи сайту спасибо
ЯндексЯндекс. ДеньгиХочу такую же кнопку



Получить WMR-бонус на свой кошелек!

Статистика

Онлайн всего: 1
Гостей: 1
Пользователей: 0

Copyright MyCorp © 2024 Бесплатный конструктор сайтов - uCoz