Чтобы повторить сказанное Синаном, корзина должна быть сделана с использованием сессий.
Я попытаюсь объяснить немного больше о том, как все это работает, поскольку ваш вопрос, по-видимому, подразумевает, что вы хотели бы понять детали.
Есть две концепции, которые задействованы: Файл cookie сеанса и база данных сеансов на стороне сервера.
Ваш веб-сервер имеет внутреннюю базу данных "сеансов", которая в основном представляет собой сопоставление между длинной строкой, известной как "ключ сеанса", и большим двоичным объектом.данных.Эта база данных может быть встроена в веб-сервер или, в случае Perl CGI, реализована с помощью специального модуля Perl.
Что хранится в этом блоке данных в базе данных Session?Все, что ваш CGI-скрипт решит сохранить - в вашем случае текущее состояние корзины покупок.
Как информация распределяется между страницами?Специальный модуль Session Cookie генерируется вашим сеансовым модулем, при этом значение cookie является тем же «ключом сеанса», который используется для хранения большого объема данных на сервере в базе данных сеансов.Затем он сохраняется браузером пользователя, как и все остальные файлы cookie, за исключением того, что его значение действительно только «на время сеанса» - срок его действия истекает через короткий промежуток времени или если вы закрываете браузер.Затем, когда пользователь продолжает работу с веб-приложением, значение файла cookie отправляется обратно на сервер, и поэтому ваш сценарий CGI знает, как повторно использовать этот ключ сеанса.
ПРИМЕЧАНИЕ : альтернативаПодход (вместо использования cookie) заключается в передаче значения идентификатора сеанса между всеми вашими запросами (например, кодирование его во все URL-адреса GET и формы POST).
Что касается реализации Perl CGI, то это зависитна конкретной веб-платформе Perl, которую вы используете - базовую сессионную работу можно выполнить с помощью CGI::Session
CPAN-модуля (для него также есть хорошее руководство ).Другим частым вариантом для тех, кто использует веб-сервер Apache, является Apache::Session
.
. Общий модуль, связанный с Session, предоставляет вам API для:
- Управление базой данных Session
- Сохранение / извлечение данных в базе данных сеанса с использованием ключа сеанса (он же Session ID)
- Получение идентификатора текущего сеанса пользователя (из значения cookie сеанса), если есть
- Создание нового сеансаИдентификатор пользователя, при необходимости
- Отправьте значение идентификатора сеанса в виде файла cookie для сохранения в HTTP-ответе в браузер пользователя.
Любой приличный веб-каркас Perl имеет встроенные возможности сеанса(они по-прежнему реализованы с использованием какого-либо Perl-модуля управления сеансом, но инфраструктура предоставляет простые в использовании API-интерфейсы.
В качестве примера «простого в использовании» в Embperl для сохранения значения всеанс, все, что вы делаете, это $udat{shopping_cart} = \%shopping_cart_data
и для его извлечения вы делаете %shopping_cart_data = %$udat{shopping_cart}
- %udat
(специальное хеш-имя).Вот и все.Все детали скрыты от вас рамками.
ОБНОВЛЕНИЕ:
Это в значительной степени не имеет ничего общего с тем, что мне кажется фактическим задаваемым вопросом, но, тем не менее, это верный момент, о котором я вспомнил комментарий к этому ответу.
В интересах улучшения общего качества вашего кода вы всегда должны абстрагироваться от основной бизнес-логики.В этом случае, если у вас есть какая-либо общая логика для работы с данными корзины покупок, которые совместно используются вашими различными Perl CGI-скриптами, эту логику следует абстрагировать в отдельный модуль Perl.
Кроме того, для дальнейшегоулучшения:
Вы должны рассмотреть дизайн MVC (модель-представление-контроллер) для любого сложного веб-приложения.Чтобы сделать это проще, выберите MVC-совместимый веб-фреймворк Perl (я думаю, что Catalyst считается основным вариантом в наши дни, но сделайте свое собственное исследование, прежде чем устанавливать его.
У вас также должен быть дизайн, который позволяет вам модульно использовать и повторно использовать веб-элементы (представления) - например, верхний вариант приложения, который, вероятно, будет отображать количество элементов в корзине, всегда будет в значительной степениодин и тот же HTML, и вы не должны дублировать этот HTML в разных представлениях.(если вы не уверены, о чем я говорю, посмотрите две верхние строчки на веб-странице Amazon).Существуют различные методы для достижения этой цели, которые выходят далеко за рамки вашего вопроса (фреймы, веб-фреймворки с объединенными представлениями, модуль Perl для печати View и т. Д.).