Назад | Начало урока | Вперед
Содержание

Глава 23

Оформление заказа
Сценарий process_order.php получает данные из приведенной выше формы.

Подсказка

Листинг 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) {

$query = "SELECT $room_type FROM tours ". "WHERE id = $tour_id";
if ($result = $this->connection->query ($query)) {
while ($row = $result->fetch_assoc() ) {
return $row["$room_type"];
}
}
}

Порядок записи заказа зависит от того, есть ли уже заказчик в базе. Сначала
производится его поиск по базе методом find_client() класса customer:

function find_client($family_name,$passport) {

$query="SELECT id from customers ".
"WHERE family_name='$family_name'
AND passport='$passport'". " GROUP BY passport";

if ($result = $this->connection->query ($query)) {
while ($row = $result->fetch_assoc() ) {
echo "<p>Заказчик найден, его номер ".$row['id'];
return $row['id'];
}
}
}

Если заказчик найден, то заказ записывается в таблицы orders и order_items
методом write_order() класса order.

function write_order($segodnya,$c_id,$tour_id,$room_type,$num,$quantity) {

$query = "INSERT INTO orders (order_date, customer, quantity)".
"VALUES('$segodnya',$c_id, $quantity)";

if ($result = $this->connection->query ($query)) {
echo "Спасибо, ваш заказ принят.";

}
// Выбор номера послденего заказчика для записи в таблицу order_items
$query = "SELECT MAX(o.id) as zakaz ".
"FROM orders AS o, customers AS c ".
"WHERE o.customer=c.id and o.customer=$c_id";
echo $query."<br>";
if ($result = $this->connection->query ($query)) {
while ($row = $result->fetch_assoc() ) {
$zakaz = $row['zakaz'];
}
$query = "INSERT INTO order_items (order_id, tour_id, room_type) ".
"VALUES ($zakaz, $tour_id, '$room_type')";
echo $query;
if ( $result = $this->connection->query ($query)) {
echo "<p>Запись в order_items сделана.";
}
}
}

Теперь можно посмотреть на обе таблицы:

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, которой
передается значение идентификатора найденного клиента, предваряется оператором
подавления ошибок(@).

Если же клиент делает свой первый заказ, то к записи заказа добавляется запись данных
о новом клиенте методом insert_client(), и только потом выполняется регистрация заказа.

function insert_client($name,$family_name,$second_name,$address,$passport) {

// Запись нового заказчика в базу данных
$query="INSERT INTO customers(name,family_name,second_name, address,passport)
VALUES "."('$name', '$family_name','$second_name','$address','$passport')";
if ($result = $this->connection->query ($query)) {
echo "Запись нового заказчика выполнена";
}
// Чтение номера нового заказчика
$query="SELECT id from customers ".
"WHERE family_name='$family_name' AND passport='$passport'".
" GROUP BY passport";
if ($result = $this->connection->query ($query)) {
while ($row = mysqli_fetch_assoc($result) ) {
$c_id = $row['id'];
echo "<p>Заказчик записан и снова найден.";
return $c_id;
}
}
}


Назад | Начало урока | Вверх | Вперед
Содержание

Hosted by uCoz