Добавил:
Upload Опубликованный материал нарушает ваши авторские права? Сообщите нам.
Вуз: Предмет: Файл:
Экзамен / web / example1 / Введение в PHP.doc
Скачиваний:
107
Добавлен:
18.05.2015
Размер:
3 Mб
Скачать

Работа с сеансовыми переменными

Другая необходимость, возникающая при работе с сеансами — определить, были ли зарегистрированы сеансовые переменные. Это можно сделать с помощью оператора isset, позволяющего проверить существование соответствующего ключа в массиве $_SESSION, или функции session_is_registered($name), где $name — строка, представляющая имя сеан­совой переменной, которую нужно проверить. Эта функция возвращает true, если пере­менная была зарегистрирована, и false — если нет.

Для того чтобы реально продемонстрировать работу сеансов в РНР, сначала нужно создать ситуацию, в которой пользовательские данные должны быть сохранены во время запроса к серверу. Идеальным примером, удовлетворяющим таким требованиям, является пример с тележкой для покупок. Предположим, что вся функциональность тележки за­ключена в одном PHP-классе ShoppingCart. В этой ситуации для каждого покупателя соз­дается единственный экземпляр тележки, который регистрируется как сеансовая перемен­ная, сохраняемая в массиве $_SESSION. Для каждого последующего запроса экземпляр (и все его данные) пересоздаются РНР. Пример с тележкой для покупок на РНР

Файл ShoppingCart.class.php

<?php

class ShoppingCart { private Scart;

function construct() (

$this->cart = array));

public function addltem($id, Sname, $cost) {

foreach($this->cart as $key=>$items) {

if(Sitemsfid'] == Sid) {

Sthis->cart[Skey]['quantity']++; return;

}

)

$this->cart[] = array('id' => Sid,'name' => 'cost' => 'quantity'

' => Sname, ' => Scost, tity' => 1);

public function delltem(Sid) {

foreach(Sthis->cart as $key => Sitems) (

if<Sitems['id'] == $id) {

if($items['quantity'] > 1) (

Sthis->cartt$key]('quantity']—; } else {

unset($this->cart[Skey));

)

return true;

}

]

return false;

)

public function getCartO ( return $this->cart;

}

public function clearCartf) { $this->cart = array ();

?>

Файл Listing68.php

<?php

require_once("ShoppingCart.class.php");

session_start();

if(lisset($_SESSI0NI'cart']) || !is_object($_SESSI0N[1 cart'])) ( S_SESSI0N['cart'] = new ShoppingCart();

/*Добавить книгу в тележку(элемент #43 стоимостью $49.95) */

$_SESST0N['cart']->addltem(43,"Book:PHP Unleashed",49.95);)

?>

Для объектов, пересоздаваемых внутри сеанса, в РНР должен быть определен начальный класс. Это означает, что определение класса ShoppingCart должно быть включено в сценарий для переменной $_SESSION [' cart' ], чтобы она могла быть корректно пересозданной.

Постоянные данные, использующие сеансы и cookie-наборы

Поскольку иногда формат, предлагаемый $ID, может быть неприемлемым (как будет показано, при передаче информации о сеансе через HTML-форму), в РНР предусмотрены две функции session_name() и session_id(), которые возвращают, соответственно, имя се­анса и его идентификатор. Независимо от используемого метода, идентификатор сеанса должен использоваться каждый раз, когда URL ссылается на внутренний ресурс. Напри­мер, при использовании гиперссылки обычно прекрасно работает константа $ID:

<А HREF="checkout.php?<?php echo $ID; ?> ">Перейти к окончательному рас­чету</А>

С другой стороны, при работе с HTML-формами, идентификатор сеанса передается с помощью скрытых элементов формы. В следующей ситуации для присваивания соответ­ствующих значений должны использоваться функции session_name() и session_id().

<FORM ACTION="order.php" METHOD=GET>

<INPUT TYPE="hidden" NAME="<?php echo session_name(); ?>"

VALUE="<?php echo session_id(); ?>"> <!— Остальной HTML-код формы //—> </FORM>

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

В большинстве случаев URL может быть автоматически пересоздан за счет включения режима прозрачной передачи идентификатора сеанса, активизировав ди­рективу конфигурации session.use_trans_sid. Когда режим прозрачной передачи иденти­фикатора сеанса включен, РНР пытается автоматически добавлять идентификатор сеанса к соответствующим HTML-дескрипторам.

Какие URL переписаны и будут посылаться в браузер, РНР определяет с помощью директивы конфигурации url_rewriter .tags. В этой директиве задается разделяемый запя­тыми список, имеющий следующий формат:

<HTML tag>=<Attribute>

где <HTML tag> — это HTML-дескриптор, который должен быть обработан, a <Attribute> — это атрибут того HTML-дескриптора, который содержит URL для переза­писи. Значение по умолчанию для директивы url_rewriter. tags выглядит так:

url_rewr iter.tags = "a=href,area=href,frame=src,input=src,form=fakeentrу"

Соседние файлы в папке example1