Разработка интернет-магазина

Введение

Структура таблиц в БД

Применяем технологию MySQL. Выполним магазин на основе трех таблиц (до сегодняшнего момента мы использовали только одну таблицу):

  1. Таблица «Каталог». В ней будут содержаться поля: id, author, title, year, price. Для данной таблицы нам необходимо написать форму заполнения товарами. Также, на основе данной таблицы мы будем формировать вывод информации на витрину.
  2. Таблица «Корзина». Заранее определим, что под каждого пользователя, что зашел в магазин мы будем заводить отдельную сессию. У каждой сессии будет свой идентификатор. Данный идентификатор будет идентификатором пользователя. Данный id будет записываться в поле customer таблицы «Корзина». Помимо этого в таблице будет содержаться id записи, номер книги (catalogid), количество (quntity), время (datetime).
    Для корзины определим действия: пользователь может добавить товар, просматривать товары в корзине, удалять товары из корзины.
    Если пользователь нажимает кнопку «Оформить заказ», заполняет персональные данные, то вся информация записывается в таблицу «Заказы» и удаляется из корзины.
  3. Таблица «Заказы». Содержит поля: id, author, title, year, price, customer, quantity, datetime.

Замечание! В следующем коде нет возможности изменения добавленного товара. Для простоты мы упускаем часть функционала. Также, количество товаров на складе предполагаем равным «1».

Создание базы данных

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

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
  <?php
/*Создание базы данных*/
define("DB_HOST", "localhost");
define("DB_LOGIN", "root");
define("DB_PASSWORD", "password");
define("DB_NAME", "eshop");
/*Соединяемся с сервером*/
mysql_connect(DB_HOST, DB_LOGIN, DB_PASSWORD) or die(mysql_error());
/*Создаем базу данных*/
$sql = 'CREATE DATABASE '.DB_NAME;
mysql_query($sql) or die(mysql_error());
/*Выбираем нашу базу данных*/
mysql_select_db(DB_NAME) or die(mysql_error());
/*Создаем запрос на создание таблицы catalog*/
$sql = "
	CREATE TABLE catalog (
	id int(11) NOT NULL auto_increment,
	author varchar(50) NOT NULL default ”,
	title varchar(50) NOT NULL default ”,
	pubyear int(4) NOT NULL default 0,
	price int(11) NOT NULL default 0,
	PRIMARY KEY (id)
	)";
/*Выполняем запрос на создание таблицы catalog*/
mysql_query($sql) or die(mysql_error());
/*Создаем запрос на создание таблицы basket*/
$sql = "
	CREATE TABLE basket (
	id int(11) NOT NULL auto_increment,
	customer varchar(32) NOT NULL default ”,
	goodsid int(11) NOT NULL default 0,
	quantity int(4) NOT NULL default 0,
	datetime int(11) NOT NULL default 0,
	PRIMARY KEY (id)
	)";
/*Выполняем запрос на создание таблицы catalog*/
mysql_query($sql) or die(mysql_error());
/*Создаем запрос на создание таблицы orders*/
$sql = "
	CREATE TABLE orders (
	id int(11) NOT NULL auto_increment,
	author varchar(50) NOT NULL default ”,
	title varchar(50) NOT NULL default ”,
	pubyear int(4) NOT NULL default 0,
	price int(11) NOT NULL default 0,
	customer varchar(32) NOT NULL default ”,
	quantity int(4) NOT NULL default 0,
	datetime int(11) NOT NULL default 0,
	PRIMARY KEY (id)
	)";
/*Выполняем запрос на создание таблицы orders*/
mysql_query($sql) or die(mysql_error());
/*Закрываем соединение с сервером*/
mysql_close();
/*Если все сделано правильно, выводим сообщение*/
echo '<p>Структура базы данных успешно создана!</p>';
?>

Подключение к базе данных

Для соединения с базой данных создадим файл echo_db.inc.php:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
	<?php
/*Адрес сервера*/
define("DB_HOST", "localhost");
/*Логин для соединения с базой*/
define("DB_LOGIN", "root");
/*Пароль для соединения с базой*/
define("DB_PASSWORD", "");
/*Имя базы данных*/
define("DB_NAME", "eshop");
/*Имя файла с личными данными пользователей*/
define("ORDERS_LOG", "orders.log");
 
/*Количество товаров в корзине пользователя. Изначально ноль*/
$count = 0;
 
/*Устанавливаем соединение с сервером базы данных*/
mysql_connect(DB_HOST, DB_LOGIN, DB_PASSWORD) or die("Не могу соединиться с сервером базы данных!");
/*Выбираем базу данных*/
mysql_select_db(DB_NAME) or die(mysql_error());
/*При добавлении товаров в корзину, счетчик $count будет меняться, то есть будет меняться количество товаров в корзине*/
$sql = "SELECT count(*) FROM basket WHERE customer=’".session_id()."’";
$result = mysql_query($sql) or die(mysql_error());
$count = mysql_result($result, 0, "count(*)");
?>

Добавление товаров в каталог

Для добавления товаров в каталог, разработаем файл add2cat.php :

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
<html>
<head>
<title>Форма добавления товара в каталог</title>
</head>
<body>
<h1>Добавить товары в каталог:</h1>
<form action="save2cat.php" method="post">
<p>Автор: <input type="text" name="author" size="50"></p>
<p>Название: <input type="text" name="title" size="100"></p>
<p>Год издания: <input type="text" name="pubyear" size="4"></p>
<p>Цена: <input type="text" name="price" size="6"> руб.</p>
<p><input type="submit" value="Добавить"></p>
</form>
<p>Посмотреть <a href="catalog.php">Каталог</a></p>
</body>
</html>

Создание файла с функциями

Создадим файл с функциями для работы сайта, назовем его eshop_lib.inc.php:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
	<?php
/*Сохраняет новый товар в таблицу catalog*/
function save($author, $title, $pubyear, $price){
	$sql = "INSERT INTO catalog(
	author,
	title,
	pubyear,
	price)
	VALUES(
	'$author',
	'$title',
	$pubyear,
	$price
	)";
	mysql_query($sql) or die(mysql_error());
}
 
/*Фильтрация полученных данных*/
function clearData($data, $type = "s"){
	switch($type){
	case "s":
		return mysql_real_escape_string(trim(strip_tags($data))); break;
	case "i":
		return (int)$data;
	/*Для фильтрации данных пользователя, который оформил заказ и эти данные уходят в файл*/
	case "string_file": return trim(strip_tags($data));
	}
}
 
/*Возвращение всего каталога товаров*/
function selectAll(){
	$sql = "SELECT * FROM catalog";
	$result = mysql_query($sql) or die(mysql_error());
	return dataBaseToArray($result);
}
 
/*Конвертируем данные в массив*/
function dataBaseToArray($result){
	$array = array();
	while($row = mysql_fetch_assoc($result)){
		$array[] = $row;
	}
	return $array;
}
 
/*Добавляем товары в корзину*/
function add2basket($customer, $goodsid, $quantity, $datetime){
$sql = "INSERT INTO basket(
	customer,
	goodsid,
	quantity,
	datetime)
	VALUES(
	'$customer',
	$goodsid,
	$quantity,
	$datetime
	)";
	mysql_query($sql) or die(mysql_error());
}
 
/*Возвращаем всю пользовательскую корзину
Так как часть данных у нас лежит в таблице catalog,
а другая часть в таблице basket, то функция отображения корзины
будет выглядеть так:
*/
function myBasket(){
	$sql = "SELECT
			author,
			title,
			pubyear,
			price,
			basket.id,
			goodsid,
			customer,
			quantity
		FROM catalog, basket
		WHERE customer='".session_id()."'
		AND catalog.id=basket.goodsid";
	$result = mysql_query($sql) or die(mysql_error());
	return dataBaseToArray($result);
}
 
/*Удаление данных из корзины*/
function basketDel($id){
	$sql = "DELETE FROM basket WHERE id=$id";
	mysql_query($sql) or die(mysql_error());
}
 
/*Пересохранение товаров из корзины в заказы*/
function resave($datetime){
	$goods = myBasket();
	foreach($goods as $item){
	$sql = "INSERT INTO orders(
						author,
						title,
						pubyear,
						price,
						customer,
						quantity,
						datetime)
						VALUES(
						'{$item["author"]}',
						'{$item["title"]}',
						{$item["pubyear"]},
						{$item["price"]},
						'{$item["customer"]}',
						{$item["quantity"]},
						$datetime)";
	mysql_query($sql) or die(mysql_error());
	}
	/*Запрос на удаление товаров из корзины*/
	$sql = "DELETE FROM basket WHERE customer=’".session_id()."’";
	mysql_query($sql) or die(mysql_error());
}
 
/*
Получение информации о заказах.
Заказы берутся из файла orders.log
*/
function getOrders(){
	if(!file_exists(ORDERS_LOG)) return false;
	$allorders = array();
	$orders = file(ORDERS_LOG);
	foreach($orders as $order){
		list($name, $email, $phone, $address, $customer, $datetime) = explode("|", $order);
		$orderinfo = array();
		$orderinfo["name"] = $name;
		$orderinfo["email"] = $email;
		$orderinfo["phone"] = $phone;
		$orderinfo["address"] = $address;
		$orderinfo["datetime"] = $datetime * 1;//приведем к числу, умножив на 1
		$sql = "SELECT * FROM orders
				WHERE customer=’$customer’
				AND datetime=".$orderinfo["datetime"];
		$result = mysql_query($sql) or die(mysql_error());
		$orderinfo["goods"] = dataBaseToArray($result);
		$allorders[] = $orderinfo;
	}
	return $allorders;
}
?>

Добавим сайт обработчик формы ввода товаров save2cat.php:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
<?php
/*подключение библиотек*/
require "eshop_db.inc.php";
require "eshop_lib.inc.php";
/*Получаем и фильтруем данные из формы. Функция clearData () находится в библиотеке функций eshop_lib.inc.php */
$author = clearData($_POST[‘author’]);
$title = clearData($_POST[‘title’]);
$pubyear = clearData($_POST[‘pubyear’], "i"); // "i" – это integer – число, т.к сюда передаются числовые данные
$price = clearData($_POST[‘price’], "i");
/*Сохранение нового товара в базе данных. Функция save () находится в библиотеке функций eshop_lib.inc.php */
save($author, $title, $pubyear, $price);
/*Переадресовываем пользователя на страницу добавления товара*/
header("Location: add2cat.php");
?>

Каталог товаров

Напишем скрипт выводящий каталог товаров catalog.php:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
	<?php
/*Запускаем сессию*/
session_start();
/*Подключаем библиотеки*/
require "eshop_db.inc.php";
require "eshop_lib.inc.php";
?>
<html>
<head>
<title>Каталог товаров</title>
</head>
<body>
<p>Товаров в <a href="basket.php">корзине</a>: <?=$count?></p>
<h1>Каталог товаров</h1>
<table border="1" cellpadding="5" cellspacing="0" width="100%">
<tr>
<th>Автор</th>
<th>Название</th>
<th>Год издания</th>
<th>Цена, руб.</th>
<th>В корзину</th>
</tr>
<?php
$goods = selectAll();
foreach($goods as $item){
?>
<tr>
<td><?=$item["author"]?></td>
<td><?=$item["title"]?></td>
<td><?=$item["pubyear"]?></td>
<td><?=$item["price"]?></td>
<td><a href="add2basket.php?id=<?=$item["id"]?>">В корзину</td>
</tr>
<?php
}
?>
</table>
<p><a href="add2cat.php">Добавить товар в Каталог</a></p>
<p><a href="orders.php">Оформленные заказы (только для администратора)</a></p>
</body>
</html>

Добавление товаров в корзину

Добавление товаров в корзину скрипт: add2basket.php

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
<?php
/*Запускаем сессию*/
session_start();
/*Подключяем библиотеки*/
require "eshop_db.inc.php";
require "eshop_lib.inc.php";
 
/*Получаем идентификатор пользователя*/
$customer = session_id();
/*Получаем id товара*/
$goodsid = clearData($_GET["id"], "i");
/*Количество товара, в данном случае у нас всегда будет одна единица одного товара*/
$quantity = 1;
/*Получаем время*/
$date = time();
/*Добавляем товар в корзину*/
add2basket($customer, $goodsid, $quantity, $date);
/*Переадресуем пользователя в каталог товаров*/
header("Location: catalog.php");
?>

Корзина магазина

Для корзины создадим файл basket.php. При работе скрипта будем проверять, пуста ли корзина. Если да — напишем это, если нет — выведем корзину в виде таблицы. Создадим переменные для подсчета порядкового номера и суммы заказа. Предусмотрим возможность удаления товаров из корзины.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
<?php
/*Запускаем сессию*/
session_start();
/*Подключаем библиотеки*/
require "eshop_db.inc.php";
require "eshop_lib.inc.php";
?>
<html>
<head>
<title>Корзина пользователя</title>
</head>
<body>
<?php
if($count){
echo "<p>Вернуться в <a href=’catalog.php’>каталог</a></p>";
}else{
echo "<p>Корзина пуста. Вернитесь в <a href=’catalog.php’>каталог</a></p>";
}
?>
<h1>Корзина</h1>
<table border="1" cellpadding="5" cellspacing="0" width="100%">
<tr>
<th>N п/п</th>
<th>Автор</th>
<th>Название</th>
<th>Год издания</th>
<th>Цена, руб.</th>
<th>Количество</th>
<th>Удалить</th>
</tr>
<?php
/*Получаем товары*/
$goods = myBasket();// myBasket() – функция из eshop_lib.inc.php
/*Порядковый номер*/
$i = 1;
/*Сумма*/
$sum = 0;
foreach($goods as $item){
?>
<tr>
<td><?=$i?></td>
<td><?=$item["author"]?></td>
<td><?=$item["title"]?></td>
<td><?=$item["pubyear"]?></td>
<td><?=$item["price"]?></td>
<td><?=$item["quantity"]?></td>
<td><a href="delete_from_basket.php?id=<?=$item["id"]?>">Удалить</td>
</tr>
<?php
/*Общая сумма товаров в корзине*/
$i++;
$sum += $item["price"]*$item["quantity"];
}
?>
</table>
 
<p>Всего товаров в корзине на сумму: <?=$sum?> руб.
 
<div align="center">
<input type="button" value="Оформить заказ!"
onClick="location.href=’orderform.php’">
</div>
 
</body>
</html>

Удаление данных из корзины

Для удаления товаров создадим скрипт delete_from_basket.php который будет удалять товары из нашей корзины. Получаем идентификатор товара, вызывываем функцию basketDell() из функций и переадресовываем пользователя на корзину заказов.

1
2
3
4
5
6
7
8
9
10
11
12
13
<?php
/*Запускаем сессии*/
session_start();
/*Подключаем библиотеки*/
require "eshop_db.inc.php";
require "eshop_lib.inc.php";
/*Получаем идентификатор*/
$id = clearData($_GET["id"], "i");
/*Вызываем функцию basketDel и передаем ей идентификатор*/
basketDel($id);
/*Перенаправляем пользователя обратно в корзину*/
header("Location: basket.php");
?>

Оформление заказа

Для оформления заказа пользователь заполняет форму orderform.php и отправляет ее на сервер.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
<html>
<head>
<title>Форма оформления заказа</title>
</head>
<body>
<h1>Форма оформления заказа:</h1>
<form action="saveorder.php" method="post">
<p>Заказчик: <input type="text" name="name" size="50">
<p>Email заказчика: <input type="text" name="email"
size="50">
<p>Телефон для связи: <input type="text" name="phone"
size="50">
<p>Адрес доставки: <br><textarea name="address"
cols="50" rows="5"></textarea>
<p><input type="submit" value="Заказать">
</form>
<p>Вернуться в <a href="basket.php">корзину</a></p>
</body>
</html>

Вывод информации о заказчиках

Создадим файл orders.php в котором будем выводить информацию о заказе и заказчике.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
<?php
/*Запускаем сессии*/
session_start();
/*Подключаем библиотеки*/
require "eshop_db.inc.php";
require "eshop_lib.inc.php";
?>
<html>
<head>
<title>Поступившие заказы</title>
</head>
<body>
<h2>Поступившие заказы:</h2>
<p>Вернуться в <a href="catalog.php">каталог</a></p>
<?php
$orders = getOrders();
/*проверяем, в переменную $orders пришел массив или нет*/
if(is_array($orders)){
foreach($orders as $order){
?>
<hr>
<p><b>Заказчик</b>: <?=$order["name"]?></p>
<p><b>Email</b>: <?=$order["email"]?></p>
<p><b>Телефон</b>: <?=$order["phone"]?></p>
<p><b>Адрес доставки</b>: <?=$order["address"]?></p>
<p><b>Дата размещения заказа</b>: <?=date("d-m-Y H:i:s", $order["datetime"])?></p>
<h3>Купленные товары:</h3>
<table border="1" cellpadding="5" cellspacing="0" width="90%">
<tr>
<th>N п/п</th>
<th>Автор</th>
<th>Название</th>
<th>Год издания</th>
<th>Цена, руб.</th>
<th>Количество</th>
</tr>
<?php
$i = 1;
$sum = 0;
foreach($order["goods"] as $item){
?>
<tr>
<td><?=$i?></td>
<td><?=$item["author"]?></td>
<td><?=$item["title"]?></td>
<td><?=$item["pubyear"]?></td>
<td><?=$item["price"]?></td>
<td><?=$item["quantity"]?></td>
</tr>
<?php
$i++;
$sum += $item["price"] * $item["quantity"];
}
?>
</table>
<p>Всего товаров в заказе на сумму: <?=$sum?>руб.
 
<?php
}
}
?>
</body>
</html>

Добавить комментарий

Ваш e-mail не будет опубликован. Обязательные поля помечены *