67732

РАЗРАБОТКА БАЗЫ ДАННЫХ ДЛЯ ИНТЕРНЕТ-МАГАЗИНА СОТОВЫХ ТЕЛЕФОНОВ

Курсовая

Информатика, кибернетика и программирование

Перед созданием сайта необходимо разработать структуру будущей базы данных. Используя программный продукт ErWinDataModeller, создадим её. На рисунке 1 представлена структура базы данных интернет-магазина сотовых телефонов.

Русский

2014-09-14

1.38 MB

29 чел.

СОДЕРЖАНИЕ

ВВЕДЕНИЕ……………………………………………………………………4

1. ТЕОРЕТИЧЕСКАЯ ЧАСТЬ 5

1.1. История возникновения и развития 5

1.2. Виды баз данных 6

2. РАЗРАБОТКА МОДЕЛИ ДАННЫХ 6

3. РАЗРАБОТКА БАЗЫ ДАННЫХ 11

3.1. Примерсозданиятаблицы 11

3.2. Пример добавления информации в таблицу 13

4. РАЗРАБОТКА КЛИЕНТСКОГО ПРИЛОЖЕНИЯ 16

4.1. Код файла index.php 17

4.2. Кодконтроллера 18

4.3. Разметка основного файла вида 29

5. ОПИСАНИЕ ИНТЕРФЕЙСА 30

5.1. Интерфейс пользовательской части 30

Главная страница 30

Страница товаров по категориям 31

Страница оформления заказа 33

5.2. Интерфейс административной части 33

Главная страница 33

Страница товаров 35

Страница редактирования и добавления товара 36

6. СПИСОК ЛИТЕРАТУРЫ 38

  1.  ТЕОРЕТИЧЕСКАЯ ЧАСТЬ

База данных — представленная в объективной форме совокупность самостоятельных материалов (статей, расчётов, нормативных актов, судебных решений и иных подобных материалов), систематизированных таким образом, чтобы эти материалы могли быть найдены и обработаны с помощью электронной вычислительной машины (ЭВМ).

  1.  История возникновения и развития

История возникновения и развития технологий баз данных может рассматриваться как в широком, так и в узком аспекте.

В широком смысле понятие истории баз данных обобщается до истории любых средств, с помощью которых человечество хранило и обрабатывало данные. В таком контексте упоминаются, например, средства учёта царской казны и налогов в древнем Шумере (4000 г. до н. э.),узелковая письменность инков — кипу, клинописи, содержащие документы Ассирийского царства и т. п. Следует помнить, что недостатком этого подхода является размывание понятия «база данных» и фактическое его слияние с понятиями «архив» и даже «письменность».

История баз данных в узком смысле рассматривает базы данных в традиционном (современном) понимании. Эта история начинается с 1955 года, когда появилось программируемое оборудование обработки записей. Программное обеспечение этого времени поддерживало модель обработки записей на основе файлов. Для хранения данных использовались перфокарты.

Оперативные сетевые базы данных появились в середине 1960-х. Операции над оперативными базами данных обрабатывались в интерактивном режиме с помощью терминалов. Простые индексно-последовательные организации записей быстро развились к более мощной модели записей, ориентированной на наборы. За руководство работой DataBaseTaskGroup (DBTG), разработавшей стандартный язык описания данных и манипулирования данными, Чарльз Бахман получил Тьюринговскую премию.

В это же время в сообществе баз данных COBOL была проработана концепция схем баз данных и концепция независимости данных.

Следующий важный этап связан с появлением в начале 1970-х реляционной модели данных, благодаря работам Эдгара Ф. Кодда. Работы Кодда открыли путь к тесной связи прикладной технологии баз данных с математикой и логикой. За свой вклад в теорию и практику Эдгар Ф. Кодд также получил премию Тьюринга.

Сам термин база данных появился в начале 1960-х годов, и был введён в употребление на симпозиумах, организованных фирмой SDC (SystemDevelopmentCorporation) в 1964 и 1965 годах, хотя понимался сначала в довольно узком смысле, в контексте систем искусственного интеллекта. В широкое употребление в современном понимании термин вошёл лишь в 1970-е годы.

  1.  Виды баз данных
  2.  Иерархическая
  3.  Объектная и объектно-ориентированная
  4.  Объектно-реляционная
  5.  Реляционная
  6.  Сетевая
  7.  Функциональная.

  1.  РАЗРАБОТКА МОДЕЛИ ДАННЫХ

Перед созданием сайта необходимо разработать структуру будущей базы данных. Используя программный продукт ErWinDataModeller, создадим её. На рисунке 1 представлена структура базы данных интернет-магазина сотовых телефонов.

Рис. 1 Erwin диаграмма базы данных

База данных будет разрабатываться на сервере SQLServer 2008 и содержит 14 таблиц.В таблице 1 представлено описание всех таблиц и полей базы данных.

Таблица 1

GOODS

Таблица товаров: основные характеристики товаров

ПОЛЕ

ОПИСАНИЕ

ТИП ДАННЫХ

КЛЮЧ

Goods_id

Первичный ключ

INT

PK

Goods_brandid

Внешний ключ категории товара

INT

FK

name

Название товара

VARCHAR(20)

-

keywords

Ключевые слова

VARCHAR(255)

-

description

описание

VARCHAR(255)

-

Img

Путь к фото

VARCHAR(255)

-

Anons

Краткое описание товара

TEXT

-

content

Полное описание товара

TEXT

-

visible

Видимость товара

ENUM(“0”,”1”)

-

hits

Категория «Хит»

ENUM(“0”,”1”)

-

new

Категория «Новый»

ENUM(“0”,”1”)

-

sale

Категория «Распродажа»

ENUM(“0”,”1”)

-

price

Цена

TINYINT

-

date

Дата добавления

DATE

-

Img_slide

Пути фото галереи

VARCHAR(255)

-

Field_1

Доп поле для персонализации товаров

INT

-

Field_2

Доп поле для персонализации товаров

INT

-

Field_3

Доп поле для персонализации товаров

INT

-

Field_4

Доп поле для персонализации товаров

VARCHAR(255)

-

Field_5

Доп поле для персонализации товаров

VARCHAR(255)

-

Field_6

Доп поле для персонализации товаров

VARCHAR(255)

-

Field_7

Доп поле для персонализации товаров

ENUM(“0”,”1”)

-

Field_8

Доп поле для персонализации товаров

ENUM(“0”,”1”)

-

Field_9

Доп поле для персонализации товаров

ENUM(“0”,”1”)

-

Field_10

Доп поле для персонализации товаров

VARCHAR(255)

-

BRANDS

Таблица категорий: характеристики категорий товаров

ПОЛЕ

ОПИСАНИЕ

ТИП ДАННЫХ

КЛЮЧ

brand_id

Первичный ключ

INT

PK

Brand_name

Имя категории

VARCHAR(30)

-

Parent_id

Родительская или дочерняя

INT

-

ZAKAZ_TOVAR

Таблица заказов: подробная информация о заказе

ПОЛЕ

ОПИСАНИЕ

ТИП ДАННЫХ

КЛЮЧ

Zakaz_tovar_id

Первичный ключ

INT

PK

Order_id

Внешний ключ заказа

INT

FK

Goods_id

Внешний ключ товара

INT

FK

Name

Название товара

VARCHAR(30)

-

Price

Цена товара

INT

-

Quantity

Количество

TINYINT

-

ORDERS

Таблица заказов: краткая информация о заказе

ПОЛЕ

ОПИСАНИЕ

ТИП ДАННЫХ

КЛЮЧ

Order_id

Первичный ключ

INT

PK

Customer_id

Внешний ключ пользователя

INT

FK

Prim

Примечание заказа

TEXT

-

Date

Дата заказа

DATE

-

Dostavka_id

Внешний ключ способа доставки

INT

FK

Status

Статус заказа

ENUM(“0”,”1”)

-

DOSTAVKA

Таблица типов доставки

ПОЛЕ

ОПИСАНИЕ

ТИП ДАННЫХ

КЛЮЧ

Dostavka_id

Первичный ключ

INT

PK

Name

Название доставки

VARCHAR(30)

-

INFORMERS

Таблица информеров

ПОЛЕ

ОПИСАНИЕ

ТИП ДАННЫХ

КЛЮЧ

Informer_id

Первичный ключ

INT

PK

Informer_name

Название информера

VARCHAR(30)

-

Informer_position

Позиция на странице

TINYINT

-

LINKS

Таблица ссылок информеров

ПОЛЕ

ОПИСАНИЕ

ТИП ДАННЫХ

КЛЮЧ

Link_id

Первичный ключ

INT

PK

Parent_informer

Внешний ключ информера

INT

FK

Link_name

Назание ссылки

VARCHAR(30)

-

Links_position

Позиция в информере

TINYINT

-

Keywords

Ключевые слова

VARCHAR(255)

-

Description

Описание

VARCHAR(255)

-

Text

Текст ссылки информера

TEXT

-

PAGES

Таблица основных страниц

ПОЛЕ

ОПИСАНИЕ

ТИП ДАННЫХ

КЛЮЧ

Page_id

Первичный ключ

INT

PK

Title

Название страницы

VARCHAR(30)

-

Keywords

Ключевые слова

VARCHAR(255)

-

Description

Описание

VARCHAR(255)

-

Position

Позиция страницы в меню

TINYINT

-

Text

Текст страницы

TEXT

-

BANNERS

Таблица рекламных баннеров

ПОЛЕ

ОПИСАНИЕ

ТИП ДАННЫХ

КЛЮЧ

Banner_id

Первичный ключ

INT

PK

Banner_title

Название баннера

VARCHAR(30)

-

Href

Ссылка

VARCHAR(255)

-

Img

Путь к фото

VARCHAR(255)

-

Visible

Видимость

ENUM(“0”,”1”)

-

Type

Тип баннера

ENUM(“side”,”top”)

-

SWITCHES

Таблица переключателей поиска

ПОЛЕ

ОПИСАНИЕ

ТИП ДАННЫХ

КЛЮЧ

Switch_id

Первичный ключ

INT

PK

Extended

Редактируемые и нередактируемые поля

INT

-

Switch_name

Название дополнительного поля

VARCHAR(30)

-

Switch_value

Значение для лёгкого поиска

ENUM(“0”,”1”)

-

Ext_value

Значение для тяжёлого поиска

ENUM(“0”,”1”)

-

NEWS

Таблица новостей

ПОЛЕ

ОПИСАНИЕ

ТИП ДАННЫХ

КЛЮЧ

News_id

Первичный ключ

INT

PK

Title

Название новости

VARCHAR(30)

Keywors

Ключевые слова

VARCHAR(255)

-

Description

Описание

VARCHAR(255)

-

Anons

Анонс новости

TEXT

-

Text

Полный текст новости

TEXT

-

Date

Дата публикации

DATE

-

SLIDER

Таблица слайдера

ПОЛЕ

ОПИСАНИЕ

ТИП ДАННЫХ

КЛЮЧ

Slider_id

Первичный ключ

INT

PK

Name

Название слайда

VARCHAR(30)

-

Img

Путь к фото

VARCHAR(255)

-

Href

Ссылка

VARCHAR(255)

-

visible

Видимость

ENUM(“0”,”1”)

-

CUSTOMERS

Таблица пользователей

ПОЛЕ

ОПИСАНИЕ

ТИП ДАННЫХ

КЛЮЧ

Customer_id

Первичный ключ

INT

PK

Id_role

Внешний ключ типа пользователя

INT

FK

Name

Имя пользователя

VARCHAR(30)

-

Email

Почта

VARCHAR(30)

-

Phone

Телефон

VARCHAR(30)

-

Address

Адрес

TEXT

-

Login

Логин

VARCHAR(20)

-

Password

пароль

VARCHAR(32)

-

ROLES

Таблица типов пользователей

ПОЛЕ

ОПИСАНИЕ

ТИП ДАННЫХ

КЛЮЧ

Id_role

Первичный ключ

INT

PK

Name_role

Название типа пользователя

VARCHAR(20)

-

Поля KEYWORDS и DESCRIPTION служат для оптимизации под поисковые системы. Так как на сайте бует реализован поиск по товарам, то полю NAME таблицы GOODS присвоен полнотекстовый индекс.

  1.  РАЗРАБОТКА БАЗЫ ДАННЫХ

У любой базы данных есть пользователь, пароль и права доступа. Для администрирования необходимо установить полные права доступа. Подключение к базе данных будем осуществлять через функцию MYSQL_CONNECT() языка высокого уровня PHP, которая принимает 2 параметра: имя пользователя и пароль. Для выбора базы данных используем функцию MYSQL_SELECT_DB().

При создании таблицы нужно проверить её на существование. Если таблица существует, то нет смысла давать лишнюю нагрузку на сервер. В таком случае нужно использовать не просто оператор CREATETABLE, а его же вместе с приставкой IFNOTEXISTS.

  1.  Примерсозданиятаблицы:

CREATE TABLE IF NOT EXISTS `goods` (

 `goods_id` int(10) unsigned NOT NULL AUTO_INCREMENT,

 `name` varchar(255) NOT NULL,

 `keywords` varchar(255) NOT NULL,

 `description` varchar(255) NOT NULL,

 `img` varchar(255) NOT NULL DEFAULT 'no_image.jpg',

 `goods_brandid` tinyint(3) unsigned NOT NULL,

 `anons` text NOT NULL,

 `content` text NOT NULL,

 `visible` enum('0','1') NOT NULL DEFAULT '1',

 `hits` enum('0','1') NOT NULL DEFAULT '0',

 `new` enum('0','1') NOT NULL DEFAULT '0',

 `sale` enum('0','1') NOT NULL DEFAULT '0',

 `price` float NOT NULL DEFAULT '0',

 `date` date NOT NULL,

 `img_slide` varchar(255) DEFAULT NULL,

 `field_1` int(11) DEFAULT NULL,

 `field_2` int(11) DEFAULT NULL,

 `field_3` int(11) DEFAULT NULL,

 `field_4` varchar(255) DEFAULT NULL,

 `field_5` varchar(255) DEFAULT NULL,

 `field_6` varchar(255) DEFAULT NULL,

 `field_7` enum('0','1') NOT NULL DEFAULT '0',

 `field_8` enum('0','1') NOT NULL DEFAULT '0',

 `field_9` varchar(255) DEFAULT NULL,

 `field_10` varchar(255) DEFAULT NULL,

 PRIMARY KEY (`goods_id`),

 FULLTEXT KEY `name` (`name`)

) ENGINE=MyISAMDEFAULTCHARSET=utf8

Строка ENGINE=MyISAM устанавливает тип данных в таблице и нужна для индексированного поиска. Тип данных InnoDB не поддерживает полнотекстовый индекс.

Строка DEFAULTCHARSET=utf8 устанавливает кодировку по умолчанию. UTF8 – мультибайтная кодировка, размер символа равен 1 байт, если символ киррилический то 2 байта. Используется, когда необходимо хранить информацию в таблицах не только на английском языке.

Основное правило при запуске сайта – сайт не должен быть пустым. Поэтому нужно сразу добавлять контент, иначе поисковые системы не будут выводить его в верхние строки по ключевым словам и описанию.

  1.  Пример добавления информации в таблицу:

INSERT INTO `customers` (`customer_id`, `id_role`, `name`, `email`, `phone`, `address`, `login`, `password`) VALUES

(5, 2, 'Хакер', '3@3.com', '333-333', 'city3', 'user3', '202cb962ac59075b964b07152d234b70'),

(4, 1, 'ИвановИванИванович', '1@mail.com', '111-111', 'city', 'user1', '202cb962ac59075b964b07152d234b70'),

(3, 1, 'ПетровПётрПетрович', '1@mail.com', '222-222', 'city2', 'User1', '202cb962ac59075b964b07152d234b70'),

(6, 1, 'Хакер', '1@mail.com', '111-222', 'city4', 'user4', '202cb962ac59075b964b07152d234b70'),

(7, 1, 'Новыйпользователь', 'new@mail.ru', '555-555', 'newCity', 'New', '202cb962ac59075b964b07152d234b70'),

(22, 1, 'СтроговАртёмАртемьевич', '555@mail.com', '555-666', 'city-ryazan''', 'user5', '202cb962ac59075b964b07152d234b70'),

(21, 1, 'Гость 11', 'serega.46rus@mail.ru', '1111', 'newCity', NULL, NULL),

(20, 1, 'Гость 1', '1@mail.com', '111-111', 'г москва', NULL, NULL),

(23, 1, 'Прохожий1', 'passer@mail.ru', '777-777', 'UNKNOW', NULL, NULL),

(24, 1, 'd''Artanian', 'mmm@mmm.ru', '\\555\\555\\555', 'город', 'O"Raily', '54c1fb59efe1b48ee8cda5581e6ef04f'),

(25, 2, 'Администратор', 'admin@ishop.ru', NULL, NULL, 'admin', '202cb962ac59075b964b07152d234b70'),

(26, 1, 'Клиент', 'client@com', '123', 'просто город', NULL, NULL),

(29, 1, 'Asp', 'As@ya.ru', '9878745451521', 'Rehcr', 'qwert', 'a384b6463fc216a5f8ecb6670f86456a')

Оператор INSERTINTO выполняет вставку данных в таблицу. Важно соблюдать соотношение полей и информации для вставки. В первой скобке перечисляются через запятую все поля, в которые необходимо записать информацию. Далее идёт зарезервированное слово VALUES и уже во второй скобке указываются данные через запятую, которые необходимо вставить. На рисунке 2 представлен пример вставки данных.

Рис. 2 Соотношение полей

В первом случае случае в поле CUSTOMER_ID будет записана строка ‘Хакер’, что является ошибкой. Поле CUSTOMER_ID числовое типа INT и принимает только числа. Во втором случае поля и их значения записаны слева направо. Такой запрос будет успешно выполнен на сервере SQL.

Так как на сайте должна быть административная панель, то необходимо обезопасить авторизацию администраторов. На рисунке 3 представлен:

  1.  Пример формы авторизации
  2.  Пример SQL инъекции
  3.  Способ проверки введённых данных

Рис. 3 Пример формы авторизации, SQL инъекции и способа проверки данных

На втором кадре рисунка 3 приведён пример SQL инъекции. Конструкция в поле «Логин» встраивается в код кадра 3. На рисунке 4 показан результат инъекции.

Рис. 4 Результат SQL инъекции

В итоге будет найдено совпадение по условию поле login равно пустоте или поле password равно пустоте. Всё что после точки с запятой не будет учавствовать в запросе, следовательно любой сможет зайти в административную панель. Для предотвращения этого будем обрабатывать входящие данные функцией MYSQL_REAL_ESCAPE_STRING(). Данная функция экранирует все символы кавычек и слэшей для подстановки в SQL выражение. Так же необходимо шифровать любые пароли, поэтому будем использовать одностороннее шифрование MD5. Шифрование MD5 получает хэш-строку длиной 32 символа, которую нельзя расшифровать в обратную сторону. Но обычного шифрования будет недостаточно, так как в сети интернет существует множество баз данных хэшей часто используемых паролей. В хэш-стрку необходимо добавить так называемые «соли» - любые символы включаемые в часть строки с целью усложнения хэш-строки.

  1.  РАЗРАБОТКА КЛИЕНТСКОГО ПРИЛОЖЕНИЯ

Для разработки сайта необходимо установить и настроить ApacheHTTPserver, SQLserver, модули PHP и PHPMyAdminPanel. После установки можно приступить, собственно, к написанию сайта.

Интернет-магазин будет разрабатываться на модели программирования MVC – модель, вид, контроллер. Данныйшаблон программирования позволяет максимально разделить обязанности разных языков программирования, происходит максимально возможное разделение HTML разметки и PHP кода. Модель занимается запросами к базе данных, получением данных и их обработке для передачи в контроллер. Контроллер в зависимости от вида манипулирует данными, посылая их в модель и принимая обратно, для вывода в определённый файл вида. Вид – это файл HTML разметки, в который будет выводиться динамическая информация из базы данных. Конечный пользователь на странице браузера видит только вид. На рисунке 5 показано графическое представление шаблона MVC.

Рис. 5 Шаблон MVC

Необходимо заблокироать доступ к файлам кода на сервере, поэтому создадим в каждом каталоге пустой файл index.php. Так как в любом каталоге первым запускается index.php, то необходимо объявить константу с произвольным значением define(“SITE”, TRUE); и вставить строку  <?phpdefined("SITE") ordie("Accessdenied"); ?> в каждый файл кода, что закроет прямой доступ. Такой подход используется во многих современных системах управления контентом: WordPress, Joomla, DrupAl. Единой точкой входа на сайт будет служить файл index.php корня сайта – на нём будет выполняться весь код.

На рисунке 6 показана файловая система сайта.

Рис. 6 Файловая система сайта

  1.  Код файла index.php:

<?php

// запрет прямого доступа

define("ISHOP", TRUE);

require_once "config.php"; // конфигурационныйфайл

// подключениеконтроллера

require_once CONTROLLER;

?>

Так же необходимо создать страницу для ошибки 404 – страница не найдена. Для этого в файле .htaccessнастроеек сервера apache необходимо прописать строку ErrorDocument 404 /page404.html. Если страница не будет найдена, то произойдёт перенаправление на файл  page404.html.

Для того, чтобы различать страницы необходимо посылать GET или POST запросы на сервер. Отличие POST от GET в том, что POSTзапрос

закодирован. На рисунке 7 показан пример GET запроса.

Рис. 7GET запрос

После знака «?»следуют параметры и значения. На рисунке 7 параметром является «VIEW», а значением «ARCHIVE». Будем использовать параметр view в качестве контроллера, что позволит подключать файлы вида в зависимости от значения.

  1.  Кодконтроллера:

<?php

defined("ISHOP") or die("Access denied");

session_start();

// подключениемодели

require_once MODEL;

// подключениебиблиотекифункций

require_once "functions/functions.php";

// получение массива каталога

$cat = catalog();

// массив информеров

$informers = informers();

// получение массива страниц

$pages = pages();

// заголовкиновостей

$news = get_title_news();

// регистрация

if ($_POST['reg']) {

   registration();

   redirect();

}

// авторизация

if ($_POST['auth']) {

   authorization();

   if ($_SESSION['auth']['user']) {

// успешно авторизовался

echo "<p>Добро пожаловать, ".$_SESSION['auth']['user']."</p>";

exit();

   }else {

       echo $_SESSION['auth']['error'];

       unset($_SESSION['auth']);

       exit();

   }

   //redirect();

}

// выход пользователя

if ($_GET['do'] == "logout") {

logout();

   redirect();

}

$view = empty($_GET['view']) ? 'hits' : $_GET['view'];

$head_title = TITLE;

$head_keywords = "SHOP,новейшие,товары,низкие,цены,качественно,надёжно,доставка,Россия";

$head_description = "SHOP - интернет-магазин сотовых телефонов. Простота и удобство, большой выбор и, как всегда, скидки. Заказводинклик!";

$_SESSION['switches'] = get_switch();

// получениебаннеров

$banners = get_banners();

switch ($view) {

   case ('hits') :

       $eyestoppers = eyestopper($view); // лидерыпродаж

$head_title .= " | Лидеры продаж";

       $head_keywords = "SHOP,лидеры,продаж,самые,продаваемые,товары";

$head_description = "Лидерыпродаж";

   break;

   case ('new') :

       $eyestoppers = eyestopper($view); // новинки

       $head_title .= " | Новинки";

       $head_keywords = "новые,товары";

       $head_description = "новыетовары";

   break;

   case ('sale') :

       $eyestoppers = eyestopper($view); // распродажа

       $head_title .= " | Скидки";

$head_keywords = "распродажа,скидки,акции";

$head_description = "распродажатехники";

   break;

   case ('cat') :

       $category = abs((int)$_GET['category']);

       // сортировка

       $order_p = array(

                       "price_a" => array("отдешёвыхкдорогим", "price ASC"),

                       "price_d" => array("отдорогихкдешёвым", "price DESC"),

                       "date_a" => array("отстарыхкновым", "date ASC"),

                       "date_d" => array("отновыхкстарым", "date DESC"),

                       "name_a" => array("отАдоЯ", "name ASC"),

                       "name_d" => array("отЯдоА", "name DESC")

                       );

       $order_get = clear($_GET['order']);

       if (array_key_exists($order_get, $order_p)) {

           $order = $order_p[$order_get][0];

           $order_db = $order_p[$order_get][1];

}else {

           // по умолчанию сортировка по имени (ASC)

$order = $order_p['date_d'][0];

           $order_db = $order_p['date_d'][1];

}

       // параметры для навигации

       $per_page = PERPAGE; // кол-во товаров на страницу

if ($_GET['page']) {

           $page = (int)$_GET['page'];

           if ($page < 1) $page = 1;

       }else $page = 1;

       $count_rows = count_rows($category); // кол-вотоваров

       $pages_count = ceil($count_rows/$per_page); // кол-востраниц

       if (!$pages_count)$pages_count = 1; // минимум 1 страница

       if ($page > $pages_count) $page = $pages_count;

       // стартоваяпозиция

       $start_pos = ($page - 1)*$per_page;

       $brand_name = brand_name($category); // крохи

       $products = products($category, $order_db, $start_pos, $per_page); // получаеммассивизмодели

       $head_title .= " | покатегориям | ";

       $head_title .= (count($brand_name) > 1) ? $brand_name[0]['brand_name']." | ".$brand_name[1]['brand_name'] : $brand_name[0]['brand_name'];

       $head_keywords = "товары,категории";

       $head_keywords .= (count($brand_name) > 1) ? ",".$brand_name[0]['brand_name'].",".$brand_name[1]['brand_name'] : ",".$brand_name[0]['brand_name'];

$head_description = "товары по категориям";

$head_description .= (count($brand_name) > 1) ? " - ".$brand_name[0]['brand_name'].", ".$brand_name[1]['brand_name'] : " - ".$brand_name[0]['brand_name'];

break;

case ('addtocard') :

       // добавление в корзину

$goods_id =abs((int)$_GET['goods_id']);

addtocard($goods_id);

       $_SESSION['total_summ'] = total_summ($_SESSION['card']);

// колличество товаров в корзине + защита от нес-го товара

total_quantity();

       redirect();

   break;

   case ("reg") :

// регистрация

       $head_title .= " | Регистрация";

       $head_keywords = "регистрация";

       $head_description = "регистрация на сайте для удобства покупок.";

break;

   case ("card") :

       /* корзина */

       $head_title .= " | корзина";

       $head_keywords = "SHOP, корзина";

       $head_description = "корзиназаказанныхтоваров";

// способы доставки

       $dostavka = get_dostavka();

// пересчёттоваров

       if ($_GET['id'] && $_GET['qty']) {

           $goods_id = abs((int)$_GET['id']);

           $qty = abs((int)$_GET['qty']);

           $qty = $qty - $_SESSION['card'][$goods_id]['qty'];

addtocard($goods_id, $qty);

           $_SESSION['total_summ'] = total_summ($_SESSION['card']); // суммазаказа

total_quantity(); // избавимся от несуществующего товара

redirect();

       }

       // удаление товара из корзины

if ($_GET['delete']) {

$id = abs((int)$_GET['delete']);

           if ($id) {

delete_from_card($id);

           }

           redirect();

       }

       if ($_POST['order_x']) {

add_order();

           redirect();

       }

   break;

   case ("search") :

       // поиск

       $result_search = search();

       $head_title .= " | Результатыпоиска: ".htmlspecialchars($_GET['search']);

       $head_keywords = "результаты,поиска";

       $head_description = "результатыпоиска: ".htmlspecialchars($_GET['search']);

$per_page = 30; // кол-во товаров на страницу

if ($_GET['page']) {

           $page = (int)$_GET['page'];

           if ($page < 1) $page = 1;

       }else $page = 1;

       $count_rows = count($result_search); // кол-вотоваров

       $pages_count = ceil($count_rows/$per_page); // кол-востраниц

       if (!$pages_count)$pages_count = 1; // минимум 1 страница

       if ($page > $pages_count) $page = $pages_count;

       // стартоваяпозиция

       $start_pos = ($page - 1)*$per_page;

       $end_pos = $start_pos + $per_page; // конечныйиндексвмассиве

       if ($end_pos> $count_rows) $end_pos = $count_rows;

       if ($page > 1) {

           $head_title .= " страница ".$page;

           $head_keywords .= ",страница,".$page;

           $head_description .= " страница ".$page;

}

break;

case ("filter") :

       // выбор по параметрам

/////

       if ($_GET['field_1_from']) $fields[1]["f"] = floatval(preg_replace("/,/i", ".", $_GET['field_1_from'])); else $fields[1]["f"] = 0;

       if ($_GET['field_1_to']) $fields[1]["t"] = floatval(preg_replace("/,/i", ".", $_GET['field_1_to']));

           if ($fields[1]['t']) $fields[1]['query'] = " AND `field_1` BETWEEN ".$fields[1]['f']." AND ".$fields[1]["t"];

       if ($_GET['field_2_from']) $fields[2]["f"] = floatval(preg_replace("/,/i", ".", $_GET['field_2_from']));  else $fields[2]["f"] = 0;

       if ($_GET['field_2_to']) $fields[2]["t"] = floatval(preg_replace("/,/i", ".", $_GET['field_2_to']));

           if ($fields[2]['t']) $fields[2]['query'] = " AND `field_2` BETWEEN ".$fields[2]['f']." AND ".$fields[2]["t"];

       if ($_GET['field_3_from']) $fields[3]["f"] = floatval(preg_replace("/,/i", ".", $_GET['field_3_from']));  else $fields[3]["f"] = 0;

       if ($_GET['field_3_to']) $fields[3]["t"] = floatval(preg_replace("/,/i", ".",

$_GET['field_3_to']));

           if ($fields[3]['t']) $fields[3]['query'] = " AND `field_3` BETWEEN ".$fields[3]['f']." AND ".$fields[3]["t"];

       if ($_GET['field_4']) {

           $fields[4]["val"] = clear($_GET['field_4']);

           $fields[4]["query"] = " AND `field_4` = '".$fields[4]["val"]."'";

       }

       if ($_GET['field_5']) {

           $fields[5]["val"] = clear($_GET['field_5']);

           $fields[5]["query"] = " AND `field_5` = '".$fields[5]["val"]."'";

       }

       if ($_GET['field_6']) {

           $fields[6]["val"] = clear($_GET['field_6']);

           $fields[6]["query"] = " AND `field_6` = '".$fields[6]["val"]."'";

       }

       if ($_GET['field_9']) {

           $fields[9]["val"] = clear($_GET['field_9']);

           $fields[9]["query"] = " AND `field_9` = '".$fields[9]["val"]."'";

       }

       if ($_GET['field_10']) {

           $fields[10]["val"] = clear($_GET['field_10']);

           $fields[10]["query"] = " AND `field_10` = '".$fields[10]["val"]."'";

       }

       if ($_GET['field_7']) {

           $fields[7]["val"] = clear($_GET['field_7']);

           $fields[7]['query'] = " AND `field_7` = '".$fields[7]["val"]."'";

       }

       if ($_GET['field_8']) {

           $fields[8]["val"] = clear($_GET['field_8']);

           $fields[8]['query'] = " AND `field_8` = '".$fields[8]["val"]."'";

       }

       /////

       $start_price = (int)$_GET['startprice'];

       $end_price = (int)$_GET['endprice'];

       $brand = array();

       if ($_GET['brand']) {

foreach ($_GET['brand'] as $value) {

               $value = (int)$value;

               $brand[$value] = $value;

           }

       }

       if ($brand) {

           $category = implode(",", $brand);

}

       $head_title .= " | Поиск по фильтрам";

       $head_keywords = "поиск,фильтры";

       $head_description = "поиск по фильтрам";

$head_keywords .= ($start_price&& $end_price) ? ",".$start_price.",".$end_price : "";

       $head_description .= ($start_price&& $end_price) ? " от ".$start_price." до ".$end_price." рублей" : "";

       $products = filter($category, $start_price, $end_price, $fields);

   break;

   case ("product") :

       // полныйвидтовара

       $goods_id = abs((int)$_GET['goods_id']);

       if ($goods_id) {

           $goods = get_goods($goods_id);

           if ($goods) $brand_name = brand_name($goods['goods_brandid']); // крохи

           $head_title .= " | ".$goods['name'];

           $head_keywords = $goods['name'].",цена,".$goods['price'].",".$goods['keywords'];

           $head_description = $goods['name']." за ".$goods['price']." рублей."." ".$goods['description'];

       }

   break;

   case ("page") :

       // страницыменю

       $page_id = clear($_GET['page_id']);

       $get_page = get_page($page_id);

       $head_title .= " | ".$get_page['title'];

       $head_keywords = $get_page['keywords'];

       $head_description = $get_page['description'];

   break;

   case ("news") :

       // отдельнаяновость

       $news_id = clear($_GET['news_id']);

       $news_text = get_news_text($news_id);

       $head_title .= ($news_id) ? " | ".$news_text['title'] : "";

       $head_keywords = ($news_id) ? $news_text['keywords'] : "";

       $head_description = ($news_id) ? $news_text['description'] : "";

   break;

   case ("archive") :

// все новости (архив)

       $per_page = 2; // кол-во товаров на страницу

if ($_GET['page']) {

           $page = (int)$_GET['page'];

           if ($page < 1) $page = 1;

       }else $page = 1;

       $count_rows = count_news(); // кол-вотоваров

       $pages_count = ceil($count_rows/$per_page); // кол-востраниц

       if (!$pages_count)$pages_count = 1; // минимум 1 страница

       if ($page > $pages_count) $page = $pages_count;

       $start_pos = ($page - 1)*$per_page;

       $head_title .= " | Архивновостей";

       $head_keywords = "архив,новостей";

       $head_description = "архивновостей";

       if ($page > 1) {

           $head_title .= " страница ".$page;

           $head_keywords .= ",страница,".$page;

           $head_description .= " страница ".$page;

       }

       $all_news = get_all_news($start_pos, $per_page);

   break;

   case ("informer") :

       // информеры

       $inf_id = clear($_GET['informer_id']);

       $text_informer = get_text_informer($inf_id);

       $head_title .= " | ".$text_informer['informer_name'];

       $head_keywords = $text_informer['informer_name'];

       $head_description = $text_informer['informer_name'];

   break;

   case ("ext_search") :

       $head_title .= " | Расширенный поиск";

       $head_keywords = "расширенный поиск";

       $head_description = "расширенный поиск";

break;

   default :

       $view = 'hits';

       $eyestoppers = eyestopper($view);

}

// подключениевида

require_once TEMPLATE."index.php";

?>

 Все функции, вызываемые в контроллере делятся на 2 вида:

  1.  Работающие с моделью
  2.  Функции-обработчики данных

Большинство функций работающих с моделью расположены в блоке

switch($view) {

}

Переменная $view – переменная контроллера, подключающая файлы вида.

  1.  Разметка основного файла вида:

<?php require_once "inc/header.php";?>

<div id="contentwrapper">

 <div id="content">

<?php include $view.".php"; ?>

</div>

</div>

<?phprequire_once "inc/leftbar.php";?>

<?phprequire_once "inc/rightbar.php";?>

<div class="clr"></div>

<?phprequire_once "inc/footer.php";?>

</div>

</body>

</html>

Переменная $view формируется в контроллере выражением

$view = empty($_GET['view']) ? 'hits' : $_GET['view'];

Если запрос GET пуст, то в переменную записывается строка ‘hits’ иначе то, что лежит в глобальном массиве $_GET в ячейке [‘view’].

Строка<?phpinclude $view.".php"; ?> подключает файл расширения PHP с именем переменной $view.

  1.  ОПИСАНИЕ ИНТЕРФЕЙСА
  2.  Интерфейс пользовательской части:

Рис. 8 Интерфейс главной страницы

Главная страница:

  1.  Поле лёгкого и расширенного поиска
  2.  Меню страниц
  3.  Рекламные баннеры
  4.  Категории особых предложений – айстопперы
  5.  Меню категорий тоаров
  6.  Поле авторизации / регистрации
  7.  Корзина
  8.  Поле товара
  9.  Слайдер специальных предложений

Рис. 9 Интерфейс страницы товаров по категориям

Страница товаров по категориям:

  1.  Хлебные крошки – система ссылок навигации
  2.  Переключатель табличного и линейного видов
  3.  Сортировка товаров
  4.  Индикаторы специальных предложений
  5.  Блок новостей
  6.  Информеры – блоки с дополнительной информацией для пользоателя
  7.  Постраничная навигация

Рис. 10 Интерфейс страницы оформления заказа

Страница оформления заказа:

  1.  Наименование и фото товара
  2.  Количество
  3.  Стоимость каждого товара
  4.  Кнопка удаления товара из списка
  5.  Общая информация
  6.  Способы доставки
  7.  Информация для доставки
  8.  Интерфейс административной части:

Рис. 11 Интерфейс главной старница

Главная страница:

  1.  Функция бэкапа базы данных и замены текущего содержимого посредством EXCEL
  2.  Переход на основной сайт, редактирование профиля, выход из административной панели
  3.  Кнопка добавления основных страниц горизонтального меню
  4.  Основное меню навигации панели администратора
  5.  Редактирование, добавление, удаление страниц
  6.  Редактирование, добавление, удаление информеров
  7.  Редактирование, добавление, удаление категорий
  8.  Редактирование, добавление, удаление новостей
  9.  Настройка расширенного поиска
  10.  Редактирование, добавление, удаление баннеров
  11.  Редактирование, подтверждение, удаление заказов
  12.  Редактирование, добавление, удаление слайдов основного слайдера
  13.  Редактирование, добавление, удаление пользователей

Рис. 12 Интерфейс страницы товаров

Страница товаров:

  1.  Манипуляции с категориями
  2.  Хлебные крошки
  3.  Кнопка добавления товара
  4.  Карточка товара
  5.  Постраничная навигация


Рис. 13 Интерфейс редактирования
/ добавления товара

Страница редактирования и добавления товара:

  1.  Наименование
  2.  Цена
  3.  Категория
  4.  Ключевые слова
  5.  Описание
  6.  Фото товара
  7.  Краткое описание
  8.  Полное описание
  9.  Асинхронная загрузка фото галереи
  10.  Специальные предложения
  11.  Видимость товара на странице
  12.  Кнопка добавления/ сохранения данных

 

  1.  СПИСОК ЛИТЕРАТУРЫ
  2.  Щеглов, А.Ю. Вопросы защиты информации от несанкционированного доступа [Текст] / А.Ю. Щеглов, К.А. Щеглов // Вопросы защиты информации. – 2004. – №3. –С. 2 – 7.
  3. Виейра, Р.Программирование баз данных Microsoft SQL Server 2005 [Текст] / 2008. – 1066 с.
  4.  Справочник HTML тегов и стилей CSS [Электронный ресурс]. – http://htmlbook.ru
  5.  Электронный учебник программированию на PHP [Электронный ресурс]. – http://webformyself.com

Из   м.

Лист

№докум.

Подп.

Дата

Лист

5

КП 090900.502.13


 

А также другие работы, которые могут Вас заинтересовать

67154. ПЕРЕЛИВАНИЕ КРОВИ И ЕЕ КОМПОНЕНТОВ 273 KB
  Знать: противопоказания к донорству; антигенные системы крови АВО и Rh; показания противопоказания осложнения технику гемотрансфузий. Уметь: Определять группы крови по системе АВО прямым способом ставить пробы на совместимость при гемтрансфузии оказывать первую...
67155. Становлення української національної культури у першій половині XIX століття 190 KB
  Українське національне відродження розпочалося на східноукраїнських землях на межі ХVІІІ – ХІХ ст. Воно стимулювалося, з одного боку, природними процесами загальнокультурного розвитку, з іншого – необхідністю протидії упосліджувальній політиці російського царизму.
67156. Ценообразование в маркетинге 30.85 KB
  Фирма изучает цены конкурентов для использования их в качестве основы при ценовом позиционировании собственного товара. Фирма выбирает для себя один из следующих методов ценообразования: средние издержки плюс прибыль; анализ безубыточности и обеспечение целевой прибыли...
67157. Присвоєння об’єктів. Передача об’єктів функціям 62.5 KB
  Якщо два об'єкти мають однаковий тип (тобто обидва вони – об'єкти одного класу), то значення членів-даних одного об'єкта можна присвоїти іншому. Проте, для виконання операції присвоєння недостатньо, щоб два класи були фізично подібними; імена класів, об'єкти яких беруть участь в операції присвоєння, повинні збігатися.
67158. Английская журналистика 19 века 29 KB
  Ежедневные новости Daily News. Образована была в 1846 году. Основатели Чарльз Диккенс и Д. Форстер. Либеральная политическая программа: за свободу вероисповеданий и политических взглядов. Сначала печаталась на 8 страницах, потом на 4х. Цена на газеты была снижена из-за уменьшения шрифта. Печатались Герберт Уэлс, Бернар Шоу.
67159. Россия в период правления Николая I (1825-1855) 35 KB
  Крестьянская реформа. В 1837-1841 реформа государственной деревни. Денежная реформа Многочисленные войны России расстроили бюджет для преодоления дефицита правительство Николая 1 в 30е годы проводит денежную реформу: введение серебряного рубля государственных казначейских билетов и кредитные билеты.
67160. Идеологическая полемика в культуре 19 века 43 KB
  Результатом просвещения также исторических событий начала 19 века стала обострение национального самосознания в России. Вторым аргументом он называет не рациональность России умом Россию не понять. За подобные идеи в России Чаадаев был назван сумасшедшим.
67161. Психоаналитическая теория культурогенеза 41 KB
  Была разработана в начале 20-го века австрийским психиатром и философом Зигмундом Фрейдом. Наиболее подробно он пишет о причинах генезиса культуры в работе «Тотем и табу», опираясь на идею о тождестве онто и филогенеза, Фрейд стремится увидеть истоки культуры и некоторые особенности ее современного развития во взаимоотношениях первобытного человека с природой и обществом.
67162. Николай Васильевич Гоголь (1809 – 1852) 37.5 KB
  Отец Гоголя был образованным человеком но рано умирает Гоголь к тому времени учился в 6 классе Нежинской гимназии. Гоголь погружается в изучении Украинского фольклора. В 1831 году Гоголь публикует 2 тома рассказов под общим названием Вечера на хуторе близ Диканьки.