Опубликован: 08.05.2007 | Доступ: свободный | Студентов: 12881 / 3013 | Оценка: 4.13 / 3.77 | Длительность: 12:58:00
Дополнительный материал 1:

Приложение PHP E-Commerce

< Лекция 12 || Дополнительный материал 1: 123456789101112 || Дополнительный материал 2 >

Отслеживание заказчиков

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

Генерация случайных чисел

Один метод создания уникального идентификатора состоит в генерации случайного числа. В PHP это делают с помощью следующего кода:

$RandomNumber = rand(int min, int max)

где min и max являются целыми значениями, которые определяют диапазон чисел, в котором должно находится случайно сгенерированное число. Результат присваивается переменной RandomNumber. Поэтому, если требуется получить случайное число между, скажем, 1111111111 и 9999999999, необходимо использовать оператор:

$OrderNo = rand(1111111111, 9999999999)

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

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

Итак, где же поместить процедуру генератор OrderNo? Возможно на начальной странице ( home.php ) сайта, так как мы хотим начинать отслеживать посетителей немедленно при их появлении. В таком случае можно ожидать, что можно будет отследить посетителей сайта, даже если они ничего не будут покупать. Мы здесь не будем это делать, но такая возможность существует.

Отслеживание заказчиков с помощью строки запроса

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

Вспомните из предыдущего обсуждения, что для сохранения информации при переходе со страницы на страницу можно задействовать для передачи этой информации строки запроса. Мы ранее показывали, как использовать строку запроса для передачи информации поиска между страницами search.php и detail.php. То же самое можно делать со значением OrderNo. Можно передавать его как строку запроса со страницы на страницу, чтобы сохранить его и, для решения текущей проблемы, получить способ узнать, что номер заказа уже был создан.

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

Все эти объяснения сводятся к некоторому очень простому коду. Мы помещаем процедуру генерации случайного числа внутри условного оператора проверки значения строки запроса:

<?php

if ($_GET[OrderNo]) == "")
{
  $OrderNo = rand(1111111111,9999999999);
}
?>

Если домашняя страница получает строку запроса со значением OrderNo, равным null, то будет создан новый номер заказа. Это будет происходить при первом посещении домашней страницы, так как на сайт в начале не передается никакой строки запроса. Однако, если домашняя страница получает строку запроса с OrderNo, отличным от null (номер существует), то эта процедура пропускается. Это будет происходить при всех последующих возвращениях на домашнюю страницу с любой другой страницы сайта.

Конечно, если посетитель покидает сайт и возвращается, будет создаваться новый номер заказа, так как внешний сайт не передает строку запроса с OrderNo. Такая ситуация вызывает серьезные проблемы при отслеживании заказов покупателя. Если человек уже поместил товары в свою корзину покупателя под одним номером, а затем покинул сайт и вернулся, то нет удобного способа узнать, что это тот же самый человек, добавляющий новые товары в свою корзину покупателя. Фактически первый вариант выбора товаров будет потерян.

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

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

В PHP посетители сайта Web создают "сеансы". Сеанс создается автоматически, когда посетитель впервые появляется на любой странице сайта. Сеанс автоматически завершается, если посетитель не осуществляет обращение к странице в течение 20-минутного интервала времени. Поэтому сеанс начинается, когда посетитель прибывает, и заканчивается через 20 минут после того, как посетитель покидает сайт. Этот 20-минутный интервал времени позволяет также посетителю покидать сайт и возвращаться позже, не становясь новым посетителем. (Между прочим, 20-минутный интервал времени можно увеличить, если понадобится. Мы этого делать не будем.)

С сеансом посетителя связан ассоциативный массив $_SESSION[]. Можно считать $_SESSION[] глобальной областью хранения, где поддерживается относящаяся к посетителю информация. Все посетители сайта имеют свой собственный индивидуальный объект сеанса ( Session ) для отслеживания индивидуальной активности. Как можно было бы предположить, объект сеанса посетителя может быть хорошим механизмом для отслеживания заказов покупателя, когда человек перемещается со страницы на страницу, уходит на другой сайт и возвращается. Если такое значение, как OrderNo, поместить в объект сеанса посетителя, когда он впервые приходит на сайт, то это значение будет доступно на любой странице, нет необходимости тащить это значение со страницы на страницу с помощью строки запроса.

Идентификатор (ID) сеанса

PHP отслеживает посетителя с помощью уникального идентификатора, который присваивается ему при создании сеанса. Это уникальное значение хранится в свойстве сеанса session_id() объекта сеанса. К этому значению можно обратиться после запуска нового сеанса:

<?php
session_start();
$_SESSION[OrderNo] = session_id();
?>

Функция session_id() автоматически генерирует id сеанса. Если желательно создать свой собственный случайный id, можно использовать функцию rand() для генерации значения, а затем сохранить его в переменной сеанса:

<?php
session_start();
$_SESSION[OrderNo] = rand(1111111111,9999999999)
?>

Возвращаясь к вопросу присваивания уникальных значений OrderNo для новых посетителей сайта и вопросу отслеживания этого номера при перемещении со страницы на страницу, мы можем с помощью переменной сеанса легко реализовать эти вещи. Делается это так: когда посетитель впервые появляется на сайте, мы присваиваем session_id() (или случайным образом созданный ID ) как OrderNo, и, чтобы сделать этот номер доступным всем страницам, мы сохраняем его в $_SESSION[], где он будет оставаться еще 20 минут после ухода посетителя с сайта. Конечно, когда посетитель решает стать заказчиком и оформляет покупку, мы просто "разрушим" этот сеанс с помощью session_destroy(), чтобы создать новый сеанс с другим номером заказа.

Отслеживание заказчиков с помощью массива $_SESSION[]

Итак, давайте применим все это для задачи присваивания уникального ID (переменной OrderNo ) посетителю и отслеживания этого номера при перемещении посетителя со страницы на страницу.

page1.php

<?php 
  session_start(); 
  $_SESSION[OrderNo] = session_id();
  header("Location:page2.php"); 
?>

Значение id сеанса доступно теперь на последующих страницах для задач отслеживания и идентификации. К нему можно обратиться с помощью $_SESSION[OrderNo]. Следующий пример показывает, как это значение будет извлекаться и выводиться на второй странице:

page2.php

<?php 
  session_start(); 
  echo "Привет! Ваш идентификационный номер " . $_SESSION[OrderNo]; 
?>

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

Поэтому необходимо будет сопоставить преимущества использования сеансов с неудобством наличия брошенных сеансов. Тем не менее, разумно предположить, что большинство посетителей не будут создавать перерывы активности, превышающие 20 минут, и что простота программирования с помощью объекта сеанса превышает другие соображения. Как отмечено выше, всегда можно изменить 20-минутный интервал, если он покажется слишком коротким.

ID посетителя и номер заказа

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

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

< Лекция 12 || Дополнительный материал 1: 123456789101112 || Дополнительный материал 2 >
Максим Матросов
Максим Матросов
Наталья Джабасова
Наталья Джабасова