Глава 23
Листинг 23.4 process_order.php - оформление заказа
<?php
// Автозагрузка класса
function __autoload($class)
{
// Подключение файла с именем "class_имя_класса.php"
include("class_" . $class . ".php");
}
$page= new hat_foot;
$page->hat();
$family_name= htmlspecialchars($_POST['fname']);
$name= htmlspecialchars($_POST['name']);
$second_name= htmlspecialchars($_POST['sname']);
$address = htmlspecialchars($_POST['ad']);
$passport = htmlspecialchars($_POST['pas']);
$room_type = htmlspecialchars($_POST['room']);
$num = intval(htmlspecialchars($_POST['many']));
$tour_id = htmlspecialchars($_POST['tour_id']);
$tur=new tour();
$price = doubleval($tur->find_price($room_type, $tour_id));
// Рачет стоимости заказа
$quantity = $price*$num;
$segodnya = date("Y-m-d");
$client=new customer;
@$nomer=$client->find_client($family_name,$passport);
$zakaz= new order();
if (isset($nomer))
{
$zakaz->write_order($segodnya,$nomer,$tour_id,$room_type,$num,$quantity);
}
else
{
@$nomer = $client->insert_client($name,$family_name,$second_name,$address,$passport);
$zakaz->write_order($segodnya,$nomer,$tour_id,$room_type,$num,$quantity);
}
$page->footer();
$zakaz->connect_close();
?>
Анализ:
Сценарий process_order.php получает данные из приведенной выше формы.
Данные передаются методом POST, затем из них удаляются html-теги с помощью
функции htmlspecialchars()
Метод find_price() класса tour возвращает стоимость заказанного тура.
/*
Поиск стоимости тура по его номеру и типу команты
*/
function find_price($room_type, $tour_id)
{
if ($result = $this->connection->query
($query))
{
Порядок записи заказа зависит от того, есть ли уже заказчик в базе. Сначала
производится его поиск по базе методом find_client() класса customer:
function find_client($family_name,$passport)
{
AND passport='$passport'".
" GROUP BY passport";
if ($result = $this->connection->query
($query))
{
return $row['id'];
Если заказчик найден, то заказ записывается в таблицы orders и order_items function write_order($segodnya,$c_id,$tour_id,$room_type,$num,$quantity)
{
методом write_order() класса order.
if ($result = $this->connection->query
($query))
{
// Выбор номера послденего заказчика для записи в таблицу order_items
$query = "SELECT MAX(o.id) as zakaz ".
"WHERE o.customer=c.id and o.customer=$c_id";
if ($result = $this->connection->query
($query))
{
$query = "INSERT INTO order_items (order_id, tour_id, room_type) ".
if (
$result = $this->connection->query
($query))
{
Теперь можно посмотреть на обе таблицы:
mysql> SELECT * FROM orders;
id | order_date | customer | quantity | payment |
1 | 2009-08-04 | 1 | 1400.00 | cash |
2 | 2009-08-05 | 2 | 1300.00 | card |
5 | 2009-11-05 | 3 | 1200.00 | NULL |
mysql> SELECT * FROM order_items;
id | order_id | tour_id | room_type |
1 | 1 | 1 | dbl |
2 | 2 | 3 | sngl |
3 | 5 | 3 | sngl |
Как видим, после заполнения заказчиком формы (на предыдущей странице), программа нашла
заказчика в базе (его номер 3), оформила заказ (номер заказа 3), проставила дату, сумму
платежа, способ оплаты. Далее в таб order_items проставила номер заказа, номер тура и
тип комнаты.
Поскольку поиск клиента может завершиться неудачей, то переменная $nomer, которой
передается значение идентификатора найденного клиента, предваряется оператором
подавления ошибок(@).
Если же клиент делает свой первый заказ, то к записи заказа добавляется запись данных
function insert_client($name,$family_name,$second_name,$address,$passport)
{
о новом клиенте методом insert_client(), и только потом выполняется регистрация заказа.
$query="INSERT INTO customers(name,family_name,second_name, address,passport)
// Чтение номера нового заказчика
$query="SELECT id from customers ".
" GROUP BY passport";
echo "<p>Заказчик записан и снова найден.";
return $c_id;
Назад |
Начало урока |
Вверх |
Вперед
Содержание