Приложение PHP E-Commerce
Создание корзины покупателя
Нам потребуется корзина покупателя, с помощью которой заказчики могут выбирать продукты для покупки. Это делается с помощью кнопки "Buy Now" (Купить), появляющейся на странице detail.php. Когда происходит щелчок на кнопке, в корзину добавляется запись, идентифицирующая выбранный продукт. Выбранные продукты накапливаются, пока покупатель не оформит покупку, в этом случае объекты из корзины покупателя используются для подготовки заказа на покупку.
Создание таблицы корзины покупателя
Удобным способом создания корзины покупателя является использование таблицы базы данных. Записи добавляются в таблицу, когда заказчик выбирает объекты для покупки; записи удаляются из таблицы, когда заказчик решает не покупать выбранный ранее объект; и запись изменяется, когда заказчик выбирает другое количество товара для покупки. Таблица является динамической, ее записи добавляются, изменяются и удаляются во время процесса покупки.
Запись корзины покупателя должна содержать только минимальное количество информации. Она должна отслеживать заказчика, продукт и выбранное количество. Можно добавить дополнительные поля для поддержки других действий. Например, можно включить поле даты для отметки времени покупки (хорошая идея для очистки таблицы при отказе от покупки) и поле цены, если имеется риск, что цена объекта может измениться до окончательного оформления. Для текущих задач мы создаем следующую структуру таблицы ShopCart, которая добавляется в базу данных eCommerce.mdb.
Добавление объектов в корзину покупателя
Выбор продукта и добавление его в корзину покупателя происходят на странице detail.php. Когда покупатель щелкает на кнопке "Buy Now", информация о выбранном продукте записывается как новая запись в таблицу ShopCart. Объекты, накопленные в корзине покупателя, записываются как дополнительные покупки. После окончательного оформления и записи окончательного заказа корзину покупателя можно очистить от этих объектов.
Прежде всего, мы должны рассмотреть кнопку "Buy Now" на странице detail.php и запрограммировать ее для запуска процесса покупки.
<form action="detail.php?OrderItem=<?php echo $ItemNumber ?>" method="post"> <input type="submit" class="buttonL" name="BuyButton" value="Buy Now" onMouseOver="OverMouse(this)"; onMouseOut="OutMouse(this)"> </form>
Атрибут ACTION, конечно, указывает на текущую страницу detail.php, кроме того, нам нужно передать на эту страницу, когда она перезагружается, информацию об ItemNumber продукта, добавляемого в корзину покупателя. Эта информация передается через строку запроса ?OrderItem=<?php echo $ItemNumber ?> (вспомните, что переменная ItemNumber доступна на этой текущей странице). Для передачи используется метод POST.
Здесь есть над чем подумать. Обычно теги <FORM> окружают поля данных, которые передаются, когда делается щелчок на кнопке отправки. Однако в данном случае полей формы нет – только одна кнопка. Поэтому, когда форма посылается, передаются только имя и значение кнопки. Однако нам надо передать значение ItemNumber продукта, выбранного на этой странице, чтобы его можно было добавить в корзину покупателя. Поэтому мы просто добавляем его как строку запроса в URL из ACTION. Теперь обе переменные, POST[BuyButton] (содержащая BuyButton ) и $_GET[OrderItem] (содержащая OrderItem ), становятся доступными на получающей странице. Отметим, что мы использовали имя строки запроса OrderItem для покупаемого продукта, чтобы избежать путаницы с ItemNumber рассматриваемого продукта.
Когда форма посылается, сценарий в начале страницы detail.php записывает объект в корзину покупателя.
<?php session_start(); $ItemNumber = $_GET[ItemNumber]; $Category = $_GET[Category]; $Criterion =$_GET[Criterion]; $OrderNo = $_SESSION[OrderNo]; $OrderDate = date('n/d/y'); if ($_POST[BuyButton] == "Buy Now") { $OrderItem = $_GET[OrderItem]; $conn2 = odbc_connect('Driver={Microsoft Access Driver (*.mdb)};DBQ=c:\inetpub\wwwroot\PHPTutorial\Ecommerce\databases\ecommerce.mdb','',''); $sqlCart = "SELECT OrderNo,OrderItem FROM ShopCart WHERE OrderNo ='$OrderNo'"; $rsCart = odbc_exec($conn2,$sqlCart); while ($row = odbc_fetch_array($rsCart)) { if ($row[OrderNo] == $OrderNo && $row[OrderItem] == $OrderItem) { $update = true; } } if (!$update) { $sqlInsert = "INSERT INTO ShopCart (OrderNo,OrderItem,OrderDate,OrderQuantity) Values ('$OrderNo', '$OrderItem','$OrderDate,1)"; $rsInsert = odbc_exec($conn2,$sqlInsert); } else { $sqlUpdate = "Update ShopCart SET OrderQuantity = OrderQuantity + 1 WHERE OrderNo = '$OrderNo' AND OrderItem = '$OrderItem'"; $rsUpdate = odbc_exec($conn2,$sqlUpdate); } header("Location:shopcart.php"); } ?>Пример I.11.
Новая запись ShopCart заполняется четырьмя значениями. OrderNo получают из объекта сеанса — $_SESSION[OrderNo]. OrderItem передается на эту страницу через строку запроса. OrderDate определяется текущей датой системы, полученной с помощью функции date(). OrderQuantity задается как 1. Когда объект выбирается в начале для покупки, мы автоматически задаем заказанное количество как 1. Покупатель может изменить это количество на странице корзины покупателя.
Мы имеем здесь также дело с ситуацией, в которой заказчик может попытаться купить один и тот же продукт несколько раз, намеренно или по неосторожности. Наше "бизнес-правило" говорит, что единовременно может быть заказан только один объект (хотя покупатели будут иметь возможность изменить заказанное количество на странице корзины покупателя). Мы не хотим, чтобы один и тот же объект появлялся несколько раз в корзине покупателя.
Такая ситуация легко решается начальной проверкой того, что запись для этого продукта уже существует в таблице ShopCart. Оператор SQL SELECT и цикл по возвращаемому множеству записей выполняют нужную проверку:
$sqlCart = "SELECT OrderNo,OrderItem FROM ShopCart WHERE OrderNo ='$OrderNo'"; $rsCart = odbc_exec($conn2,$sqlCart); while ($row = odbc_fetch_array($rsCart)) { if ($row[OrderNo] == $OrderNo && $row[OrderItem] == $OrderItem) { $update = true; } }
Если найдены подходящие OrderNo и OrderItem, то потребуется оператор SQL UPDATE для обновления существующей записи. Если совпадений не найдено, требуется оператор SQL INSERT для создания новой записи. Для этого создается переменная ( $update ), которой присваивается значение true, если будут найдены подходящие OrderNo и OrderItem. Следующий блок кода содержит операторы INSERT и UPDATE. Значение переменной $update зависит от используемого оператора SQL:
if (!$update) { $sqlInsert = "INSERT INTO ShopCart (OrderNo,OrderItem,OrderDate,OrderQuantity) Values ('$OrderNo', '$OrderItem',$OrderDate,1)"; $rsInsert = odbc_exec($conn2,$sqlInsert); } else { $sqlUpdate = "Update ShopCart SET OrderQuantity = OrderQuantity + 1 WHERE OrderNo = = '$OrderNo' AND OrderItem = '$OrderItem'"; $rsUpdate = odbc_exec($conn2,$sqlUpdate); } header("Location:shopcart.php");
После добавления новой записи множество записей и соединение закрываются, и покупатель посылается прямо на страницу корзины покупателя с помощью метода header("Location:url"). Предполагается, что покупатель захочет после выбора просмотреть объекты корзины покупателя. Дальше мы перейдем к программированию страницы shopcart.php.