Разработка электронного магазина на ASP и MS SQL Server

advertisement
КАЗАНСКИЙ ГОСУДАРСТВЕННЫЙ УНИВЕРСИТЕТ
ФАКУЛЬТЕТ ВЫЧИСЛИТЕЛЬНОЙ МАТЕМАТИКИ И КИБЕРНЕТИКИ
КАФЕДРА ЭКОНОМИЧЕСКОЙ КИБЕРНЕТИКИ
ПИНЯГИНА О.В.
Разработка
электронного
магазина
на ASP и
MS SQL Server
Казань – 2007
О.В. Пинягина
УДК 004.738.5
ББК 32.973.26-018.02
Печатается по постановлению редакционно-издательского совета
факультета вычислительной математики и кибернетики
Казанского государственного университета
Рецензенты:
…………………………………..
………………………………….
Пинягина О.В. Разработка электронного магазина на ASP и MS SQL Server/
О.В. Пинягина – Казань: Казанский государственный университет, 2007. –
84 с.
Данное учебно-методическое пособие разработано в поддержку курса
"Электронная коммерция" и предназначено для проведения компьютерных
лабораторных занятий и для самостоятельной работы студентов,
обучающихся по специальности “Бизнес-информатика”.
В пособии поэтапно рассматривается процесс создания электронного
магазина на базе web-сервера MS IIS, языка серверных сценариев ASP и
СУБД MS SQL server.
Электронный ресурс по данному курсу находится на сайте кафедры
экономической кибернетики Казанского государственного университета по
адресу: http://kek.ksu.ru/EOS/ITE/index.html
 Казанский государственный
университет, 2007
 Пинягина О.В., 2007
2
Разработка электронного магазина на ASP и MS SQL Server
Содержание
СОДЕРЖАНИЕ............................................................................................................................3
ПРЕДИСЛОВИЕ..........................................................................................................................5
ЭТАП 1. РАЗРАБОТКА АРХИТЕКТУРЫ ЭЛЕКТРОННОГО МАГАЗИНА..................6
ОСНОВЫ HTML .......................................................................................................................12
ОСНОВНЫЕ ТЭГИ ........................................................................................................................12
ТАБЛИЦЫ ....................................................................................................................................15
ФОРМЫ .......................................................................................................................................17
ЭТАП 2. РАЗРАБОТКА СТРУКТУРЫ БАЗЫ ДАННЫХ.................................................20
ER-МОДЕЛЬ ................................................................................................................................20
РЕЛЯЦИОННАЯ МОДЕЛЬ ..............................................................................................................21
СОЗДАНИЕ БД В MS SQL SERVER .............................................................................................22
ОСНОВЫ ЯЗЫКА СЕРВЕРНЫХ СЦЕНАРИЕВ ASP .......................................................27
INTERNET INFORMATION SERVICES .............................................................................................27
ЧТО ТАКОЕ ASP..........................................................................................................................27
ТИПЫ ДАННЫХ И ПЕРЕМЕННЫЕ .................................................................................................28
ОПЕРАЦИИ И ОПЕРАТОРЫ ...........................................................................................................29
КЛАСС DATE ...............................................................................................................................31
КЛАСС STRING ............................................................................................................................33
ОБЪЕКТ MATH ............................................................................................................................33
ОБЪЕКТ REQUEST .......................................................................................................................33
ОБЪЕКТ RESPONSE ......................................................................................................................34
ЭТАП 3. РАЗРАБОТКА ШАБЛОНОВ И ГЛАВНОЙ СТРАНИЦЫ ...............................36
ШАБЛОНЫ ..................................................................................................................................36
ГЛАВНАЯ СТРАНИЦА ..................................................................................................................38
ЭТАП 4. РАЗРАБОТКА ВИТРИНЫ ЭЛЕКТРОННОГО МАГАЗИНА ..........................40
ASP И БАЗЫ ДАННЫХ .................................................................................................................40
ПРОСМОТР ИЗДАТЕЛЕЙ И КАТЕГОРИЙ ........................................................................................42
ПРОСМОТР СПИСКА КНИГ ...........................................................................................................44
ЭТАП 5. РАЗРАБОТКА КОРЗИНЫ ПОКУПАТЕЛЯ ........................................................48
COOKIES ......................................................................................................................................48
СОЗДАНИЕ КЛЮЧИКА ДЛЯ ИДЕНТИФИКАТОРА КОРЗИНЫ ...........................................................50
ПРОСМОТР КОРЗИНЫ ..................................................................................................................51
ДОБАВЛЕНИЕ ТОВАРА В КОРЗИНУ ..............................................................................................53
УМЕНЬШЕНИЕ И УВЕЛИЧЕНИЕ КОЛИЧЕСТВА .............................................................................54
УДАЛЕНИЕ ТОВАРА ИЗ КОРЗИНЫ ................................................................................................55
ЭТАП 6. РАЗРАБОТКА СИСТЕМЫ РЕГИСТРАЦИИ И АВТОРИЗАЦИИ
ПОСЕТИТЕЛЕЙ........................................................................................................................57
РЕГИСТРАЦИЯ .............................................................................................................................57
АВТОРИЗАЦИЯ ............................................................................................................................60
ЭТАП 7. РАЗРАБОТКА СИСТЕМЫ ЗАКАЗА ....................................................................64
3
О.В. Пинягина
БОНУС: ПРАЙС-ЛИСТ ПО ИЗДАТЕЛЯМ В ФОРМАТЕ XML.....................................67
НЕКОТОРЫЕ ЗАМЕЧАНИЯ .................................................................................................70
ПРИЛОЖЕНИЕ. КОДЫ СЦЕНАРИЕВ................................................................................71
ШАБЛОН ДЛЯ ЗАГОЛОВКА И МЕНЮ (HEADER.ASP) .....................................................................71
ШАБЛОН ДЛЯ НИЖНЕЙ ЧАСТИ СТРАНИЦЫ (FOOTER.ASP) ..........................................................72
ГЛАВНАЯ СТРАНИЦА (INDEX.ASP) .............................................................................................72
ШАБЛОН ДЛЯ ПОДКЛЮЧЕНИЯ К БАЗЕ ДАННЫХ (CONNECT.ASP) .................................................73
ПРОСМОТР СПИСКА ИЗДАТЕЛЕЙ И КАТЕГОРИЙ (CATALOG.ASP) .................................................73
ПРОСМОТР СПИСКА КНИГ ПО ВЫБРАННОМУ ИЗДАТЕЛЮ ИЛИ КАТЕГОРИИ (SHOW.ASP).............74
ПРОСМОТР КОРЗИНЫ (BASKET.ASP) .........................................................................................76
ДЕЙСТВИЯ С КОРЗИНОЙ (DOBASKET.ASP) ...................................................................................77
РЕГИСТРАЦИЯ (REG.ASP)............................................................................................................78
АВТОРИЗАЦИЯ (AUTO.ASP) .........................................................................................................81
ИЗМЕНЕНИЕ ЛИЧНЫХ ДАННЫХ (CHANGE.ASP)............................................................................82
ВЫХОД – ОТМЕНА АВТОРИЗАЦИИ (EXIT.ASP) ...........................................................................83
ПРОСМОТР ЗАКАЗА (ORDER.ASP) ................................................................................................83
ОТПРАВКА ЗАКАЗА (DOORDER.ASP) ............................................................................................84
ПРАЙС-ЛИСТ В ФОРМАТЕ XML (PRICE.ASP).............................................................................85
ЛИТЕРАТУРА............................................................................................................................86
4
Разработка электронного магазина на ASP и MS SQL Server
Предисловие
В узком смысле электронную коммерцию обычно представляют себе
просто как торговлю через Интернет. В самом широком смысле электронную
коммерцию следует понимать как электронный бизнес, т.е., любой вид
деятельности, в той или иной степени использующий информационные
системы и глобальные сети передачи данных.
Но так или иначе,
электронные магазины – это то, с чего начала развиваться электронная
коммерция.
В данном учебном пособии подробно и поэтапно рассматривается
процесс разработки книжного электронного магазина на базе web-сервера
IIS, языка серверных сценариев ASP и системы управления базами данных
SQL Server. Процесс разработки магазина включает следующие этапы.
1. Разработка архитектуры электронного магазина.
2. Разработка структуры базы данных.
3. Разработка шаблонов и главной страницы
4. Разработка витрины магазина.
5. Разработка корзины покупателя.
6. Разработка системы регистрации и авторизации посетителей.
7. Разработка системы заказа.
От
читателя
не
требуется
предварительных
знаний
по
программированию для Интернет. В пособии имеется отдельная глава,
посвященная основам языка гипертекстовой разметки HTML. Основная
часть учебного пособия посвящена изучению серверной технологии ASP.
C другой стороны, предполагается, что читатель прослушал курс "Базы
данных" и имеет представление о проектировании баз данных, системах
управления базами данных и языке SQL. В пособии эти вопросы
рассматриваются очень кратко – только в той степени, которая необходима
для текущей задачи создания электронного магазина.
5
О.В. Пинягина
Этап 1. Разработка архитектуры электронного магазина
Разработка любого проекта начинается с формулировки требований.
Итак, сформулируем в произвольной форме постановку нашей задачи.
Требуется создать электронный книжный магазин, в котором
потенциальные покупатели могли бы просматривать, выбирать и заказывать
книги.
Книги должны быть сгруппированы по двум признакам – по
издательству и по категории (компьютерная литература, художественная
литература, справочники и т. п.). Для каждой книги должна быть
представлена информация о названии, авторе, цене, количестве страниц, а
также внешний вид обложки.
В процессе просмотра каталога посетители должны иметь возможность
отложить понравившуюся книгу в корзину. При этом не требуется
предварительной регистрации. Книги в корзину можно добавлять, удалять и
изменять их количество.
Перед тем как оформить заказ, покупатель должен зарегистрироваться,
т.е., заполнить форму с личной информацией. Эта форма должна содержать
фамилию, имя, адрес, электронный адрес, логин и пароль. Предполагается,
что логины являются уникальными. Информация о зарегистрированных
покупателях хранится, и при следующем посещении магазина покупателю
будет достаточно только авторизоваться, т.е., набрать свой логин и пароль.
Итак, для оформления заказа покупателю следует авторизоваться,
после этого список выбранных книг можно просмотреть еще раз и
подтвердить заказ. При этом корзина должна очищаться.
Таким образом, в нашем электронном магазине предполагается
единственный тип пользователей – покупатель. Общую архитектуру сайта
представим на схеме 1, где отражены основные режимы работы
пользователя. Более подробно каждый режим представлен на схемах 2-6.
6
Разработка электронного магазина на ASP и MS SQL Server
Схема 1. Архитектура сайта – основные режимы работы
Покупатель
Главное меню
Выход
Работа с
каталогом
Работа с
заказом
Регистрация
Работа с
корзиной
Авторизация
При работе с каталогом должна иметься возможность просмотра
списка издателей и списка категорий (оба режима можно реализовать в
пределах одной страницы). Каждое название издателя и каждая категория
будут представлять собой ссылку, при щелчке по которой будет выведен
список книг выбранного издателя или выбранной категории.
Схема 2. Работа с каталогом
Покупатель
Главное меню
Просмотр
списка
издателей
Просмотр
книг выбранного
издателя
Просмотр
списка
категорий
Просмотр
книг выбранной
категории
При просмотре каталога рядом с каждой книгой должна быть
гиперссылка или кнопка "Положить в корзину". При щелчке на ней книга
добавляется в корзину и на экран выдается состав корзины. В корзине рядом
7
О.В. Пинягина
с каждой книгой выводится ее количество и кнопки или гиперссылки с
надписями "Увеличить количество",
"Уменьшить количество" и
"Удалить". Кроме того, должна быть гиперссылка "Очистить корзину".
После выполнения действий с корзиной происходит автоматический возврат
в режим просмотра корзины – на схеме это изображено пунктирными
стрелками.
Схема 3. Работа с корзиной
Покупатель
Главное меню
Просмотр
списка книг
Просмотр
корзины
Очистка
корзины
Добавление в
корзину
Удаление из
корзины
Изменение
количества в
корзине
К работе с заказом можно перейти как из главного меню, так и из
корзины. При этом на экран выдается состав заказа (уже без возможности
редактирования) и имеется кнопка или гиперссылка "Оформить заказ".
Схема 4. Работа с заказом
Покупатель
Главное меню
Просмотр
корзины
Просмотр
заказа
Оформление
заказа
Для регистрации новых покупателей из главного меню можно вызвать
форму регистрации. После заполнения полей формы должна быть
8
Разработка электронного магазина на ASP и MS SQL Server
произведена проверка правильности – все ли обязательные поля заполнены,
нет ли в базе данных уже пользователя с данным логином, и т.п. В случае
неверно введенных данных пользователю следует выдать сообщение и снова
вывести на экран форму (возможно, уже частично заполненную).
Схема 5. Регистрация
Покупатель
Главное меню
Форма
регистрации
Успешная
регистрация
Неуспешная
регистрация
Для пользователей, которые уже зарегистрированы в нашем магазине,
должна быть предусмотрена возможность авторизации, т.е., входа в магазин
по логину и паролю. Если введены неверный логин и/или пароль, следует
сообщить об этом. Если логин и пароль верные, пользователю следует
вывести на экран его данные (ФИО, адрес, e-mail и т.п.) для возможной
корректировки.
Схема 6. Авторизация
Покупатель
Главное меню
Форма
авторизации
Успешная
авторизация
Неуспешная
авторизация
Просмотр и
корректировка
личных данных
9
О.В. Пинягина
Главная страница нашего электронного магазина может иметь
примерно такой вид:
HTML-код этой страницы выглядит таким образом:
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>КНИЖНЫЙ МАГАЗИН</title>
</head>
<body background="EULA.jpg" style="background-repeat:repeat-y"
leftmargin="130" rightmargin="5" bgProperties=fixed>
<table border="0" align="right" width="90%" cellpadding="0"
cellspacing="0">
<tr><td>
<table border="0" align="right" width="100%" >
<tr>
<td align="center" bgcolor="#cccccc">
<form action="auto.asp" method="post">
<table>
<tr><td align="right"><font size=-2>Логин:</font></td>
<td align="left"><input type=text style="width:60; height:20;"
name=login></td></tr>
<tr><td align="right"><font size=-2>Пароль:</font></td>
10
Разработка электронного магазина на ASP и MS SQL Server
<td align="left"><input type=password style="width:60;
height:20;" name=pass>
<input type=submit value=ok style="height:20;"></td></tr>
</table>
</td>
</form>
<td colspan="4" align="center" bgcolor="#ccccff">
<font face="Arial" size="+3"><i><b>Книжный
магазин</b></i></font></td></tr>
<tr><td align="center" bgcolor="#aaddff" width="20%">
<a href="catalog.asp"><b>Каталог</b></a></td>
<td align="center" bgcolor="#ddaaff" width="20%">
<a href="basket.asp"><b>Корзина</b></a></td>
<td align="center" bgcolor="#aaaaff" width="20%">
<a href="reg.asp"><b>Регистрация</b></a></td>
<td align="center" bgcolor="#ffaaff" width="20%">
<a href="order.asp"><b>Заказ</b></a></td>
<td align="center" bgcolor="#aaffee" width="20%">
<a href="exit.asp"><b>Выход</b></a></td>
</tr>
</table>
</td></tr>
<tr><td align="center">Welcome!<font face="Arial"
size="+2"><i></i></font><br>
</td></tr>
<tr><td>
<center><h2><font color="#555599"><br>Добро пожаловать в наш
электронный книжный магазин! <br><br>Здесь представлена
литература самых известных российских издательств. Любой
читатель обязательно найдет себе книгу по вкусу! Мы предлагаем
компьютерную литературу, энциклопедии, справочники, самые
известные художественные произведения классиков и современников
и многое-многое другое!</font></h2></center>
</td></tr>
<tr><td><center><hr><br>
<a href="index.asp">На главную страницу</a></center></td></tr>
</table>
</body>
</html>
Для создания web-страниц нам не обойтись без знания языка HTML,
основы которого и будут рассмотрены в следующей главе.
11
О.В. Пинягина
Основы HTML
Основные тэги
HTML (HyperText Markup Language) – это язык гипертекстовой
разметки, на котором написаны практически все страницы Всемирной
паутины. Команды этого языка называются тэгами и представляют собой
ключевые слова в угловых скобках. Регистр букв не имеет значения.
Большинство команд являются контейнерами, имеющими открывающий и
закрывающий тэги. Базовая структура HTML-документа представлена
следующими командами:
<html>
<header>
<title>Заголовок окна</title>
</header>
<body>Содержимое документа</body>
</html>
Как видно, тэг <html></html> является тэгом самого верхнего уровня в
документе. Внутри него имеются заголовочная часть (<header>, содержащая,
в частности, строку заголовка документа <title>) и тело документа
(<body>).
Язык HTML, как следует из его названия, предназначен прежде всего
для
разметки,
или
форматирования
документа.
Наиболее
распространенными являются следующие команды форматирования:
<b> Жирный </b> шрифт
<i>курсив</i>
<u>подчеркнутый</u> шрифт
верхний индекс: А<sub>i</sub>
нижний индекс: А<sup>i</sup>
<center>центрирование</center>
Жирный шрифт
курсив
подчеркнутый шрифт
верхний индекс: Аi
нижний индекс: Аi
центрирование
Для переноса на следующую строку используется команда <br> (без
закрывающего тэга).
Для рисования горизонтальной линии – команда <hr> (также без
закрывающего тэга).
12
Разработка электронного магазина на ASP и MS SQL Server
Для задания заголовков различного размера существуют шесть команд:
от <h1></h1> (самый крупный) до <h6></h6> (самый мелкий).
Для создания маркированных и нумерованных списков используются
следующие команды:
<ul>
<li>понедельник
• понедельник
<li>вторник
• вторник
<li>среда
• среда
</ul>
<ol>
<li>понедельник
<li>вторник
<li>среда
1. понедельник
2. вторник
3. среда
</ol>
Многие тэги могут содержать внутри себя дополнительные параметры.
Параметр имеет имя и значение. Так, например, тег
<body bgcolor="red">
задает цвет фона документа (красный), а тег
<body background="EULA.jpg">
задает графический файл, который будет использован в качестве фона для
документа (в данном примере предполагается, что графический файл
расположен в том же каталоге. что и HTML-документ).
Параметров внутри тэга может быть несколько. В примере
<body background="EULA.jpg" leftmargin="130" rightmargin="5"
bgProperties=fixed>
13
О.В. Пинягина
параметры leftmargin="130" и rightmargin="5" задают отступ тела
документа от границ рабочей области слева и справа (в пикселах), а
параметр bgProperties=fixed фиксирует фон документа, т.е., заставляет
его быть неподвижным при прокрутке документа.
Другой пример с несколькими параметрами: тег
<font face="Arial" size="+2" color="green">
будет выводить заданный текст зеленым цветом, шрифтом Arial и размером
на 2 больше, чем текущий шрифт.
Кстати, для задания цвета удобно использовать формат #rrggbb, где rr,
gg и bb – это двузначные шестнадцатеричные числа, представляющие собой
интенсивность красной, зеленой и синей компонент цвета, соответственно.
Например, #000000 – черный цвет, #ffffff – белый цвет, #ff0000 – яркокрасный, #880088 – умеренно-фиолетовый (смесь красного и синего).
Для размещения картинок используется тег <img>, например,
<img src="Logotype.gif" alt="Наш логотип" width=300 height=300>
Параметр src задает имя графического файла, в качестве имени может быть
использован и HTTP-адрес, например:
<img src="http://kek.ksu.ru/EOS/ITE/Logotype.gif">
Параметр alt задает альтернативный текст, который будет выводиться при
наведении курсора мыши на картинку.
Самой полезной командой, которая и позволила логически связать
разрозненные документы в единую Всемирную паутину, является тег <a>
"гиперссылка". Например, команда
<a href="http://kek.ksu.ru/index.html">Кафедра экономической
кибернетики</a>
14
Разработка электронного магазина на ASP и MS SQL Server
создает гиперссылку Кафедра экономической кибернетики, которая выглядит
как подчеркнутый текст синего (по умолчанию) цвета, при щелчке мышью по
ней загружается страница с адресом, заданным в параметре href. Если
требуется загрузить страницу из текущего каталога, то можно указывать
только имя файла, например:
<a href="basket.asp">Корзина</a>
В этом тэге можно также передавать параметры в вызываемую страницу
следующим образом:
href="имяФайла?параметр1=значение1&параметр2=значение2" , например,
<a href="basket.asp?type=1&id_Book=25">Положить в корзину</a>
Эти параметры можно использовать в вызываемой странице. Более подробно
о передаче параметров мы будем говорить при изучении языка серверных
сценариев ASP.
Таблицы
Как вы уже поняли, текст и другие элементы страницы выводятся в
HTML-документ сплошным потоком, слева направо, сверху вниз. Для того
чтобы упорядочить элементы страницы друг относительно друга, самым
удобным способом являются таблицы (обрамление ячеек можно убрать).
Таблица создается тэгом <table></table>. Полезными параметрами
для таблицы являются:
• border – ширина рамки (если 0, то рамки нет),
• align
–
выравнивание самой таблицы по горизонтали ("right",
"left" или "center"),
• width – ширина таблицы в процентах относительно ширины страницы
("100%") или в пикселах ("500"),
• bgcolor – цвет фона в таблице.
Например, таблица без рамки, шириной в 80% страницы и
выравниванием по правому краю может быть задана так:
15
О.В. Пинягина
<table border="0" align="right" width="80%">
Для создания строки внутри таблицы используется тэг <tr></tr>.
Для создания ячейки внутри строки используется тэг <td></td>.
Выравнивание содержимого ячейки, ширину ячейки и цвет фона
можно задавать теми же параметрами align, width и bgcolor. Кроме
того, иногда бывает удобно объединить несколько ячеек по горизонтали или
вертикали: например, параметр colspan=3 объединяет 3 ячейки по
горизонтали, rowspan=2 – объединяет 2 ячейки по вертикали.
Таким образом, например, таблица
Расписание
Понедельник 8:00-12:00
Вторник 12:00-16:00
Среда 8:00-12:00
Четверг 8:00-12:00
Пятница 12:00-16:00
Суббота 9:00-13:00
Воскресенье выходной
может быть создана с помощью следующего кода
<TABLE BORDER=1 WIDTH=100%>
<TR><TD COLSPAN=2 ALIGN="CENTER">Расписание</TD>
</TR>
<TR><TD ALIGN="RIGHT" WIDTH="50%">Понедельник</TD>
<TD WIDTH="50%">8:00-12:00</TD></TR>
<TR><TD ALIGN="RIGHT">Вторник</TD>
<TD>12:00-16:00</TD></TR>
<TR><TD ALIGN="RIGHT">Среда</TD>
<TD>8:00-12:00</TD></TR>
<TR><TD ALIGN="RIGHT">Четверг</TD>
<TD>8:00-12:00</TD></TR>
<TR><TD ALIGN="RIGHT">Пятница</TD>
<TD>12:00-16:00</TD></TR>
<TR><TD ALIGN="RIGHT">Суббота</TD>
<TD>9:00-13:00</TD></TR>
<TR><TD ALIGN="RIGHT">Воскресенье</TD>
<TD>выходной</TD></TR>
</TABLE>
16
Разработка электронного магазина на ASP и MS SQL Server
Формы
Иногда web-страницам следует передавать параметры: например, логин
и пароль при авторизации, номер книги при добавлении ее в корзину и т.п.
Как уже говорилось, параметры иногда можно передавать непосредственно в
гиперссылке после имени файла через знак вопроса. Но этот способ не всегда
удобен: во-первых потому, что эти параметры будут отображаться в
адресной строке браузера вместе с именем файла, а для пароля это
недопустимо; а во-вторых потому, что объем информации при этом
ограничен и вообще через адресную строку не все типы данных можно
передать – например, таким образом нельзя переслать целый файл.
Поэтому в языке HTML существует такое понятие, как форма.
Форма – это контейнер, содержащий элементы управления (текстовые
поля, кнопки, флажки, радиокнопки, списки). Форма имеет следующие
полезные параметры:
•
method – способ (GET или POST), которым данные передаются не сервер
(при использовании метода GET параметры передаются в адресной
строке, как и в гиперссылке, а при использовании метода POST
параметры передаются в теле запроса);
•
action – файл, который будет загружаться как реакция на нажатие
кнопки типа Submit (об этой кнопке см. ниже).
Внутри контейнера могут располагаться следующие элементы. Каждый
элемент должен иметь имя.
Текстовые поля:
<input type="text" name="login"> - обычное текстовое поле;
<input type="password" name="pass"> - поле для ввода пароля, при вводе
символов в это поле на экране будут видны только "звездочки".
<input type="hidden" name="id_book"> - скрытое поле, на экране его не
видно, оно полезно для передачи служебной информации, которую
пользователю видеть не следует.
17
О.В. Пинягина
Кнопки:
<input type="button" name="mybutton" value="OK"> - обычная кнопка;
<input
type="reset"
name="reset"
value="очистить">
-
кнопка,
очищающая все поля формы;
<input type="submit" name="submit" value="отправить"> - кнопка
для отправки данных на сервер: при нажатии этой кнопки вызывается webстраница, имя которой задано в параметре action формы, при этом на
сервер передаются значения элементов управления формы.
Флажки:
<input type="checkbox" name="cCard" value="1"> Кредитная карта
- независимый переключатель, имеющий два состояния – "включен" и
"выключен". Если переключатель выключен, то его значение на сервер
передаваться не будет.
Радиокнопки:
<input type="radio" name="rCard" value="1">Visa
<input type="radio" name="rCard" value="2">MasterCard
<input type="radio" name="rCard" value="3">American Express
- зависимые переключатели. Для того чтобы зависимые переключатели
рассматривались, как единая группа, следует называть их одним именем.
Списки:
<select size="1" name="sCard">
<option value='1'> Visa </option>
<option value='2'> MasterCard </option>
<option value='3'> American Express </option>
</select>
- обычный выпадающий список из 3-х элементов.
Каким образом переданные данные анализируются не сервере, мы
будем подробно рассматривать при изучении серверной технологии ASP.
18
Разработка электронного магазина на ASP и MS SQL Server
Итак, мы рассмотрели все тэги и их параметры, которые используются
в нашем учебном пособии. Единственное исключение – параметр style,
который служит для более тонкой настройки стиля. Рассмотрение стилей
выходит за рамки нашей книги. Заинтересованный читатель может
обратиться к специальной литературе по CSS (каскадным таблицам стилей).
В частности, стили рассматриваются в электронном учебнике по
Web-программированию (http://kek.ksu.ru/EOS/TESTS/index.html)
19
О.В. Пинягина
Этап 2. Разработка структуры базы данных
ER-модель
На основе описания требований к электронному магазину составим
модель сущностей–связей для базы данных.
Центральным объектом в нашей модели данных является товар
(книги). Каждая книга, кроме простых атрибутов, характеризуется связью с
объектами издатель и категория. Тип связей – "многие к одному".
Для каждого потенциального покупателя создается анонимный объект
корзина, который характеризуется только уникальным номером. Между
объектом корзина и объектом товар существует связь "многие ко многим",
НомИзд
НазИзд
НомКат
Издатель
Категория
НазКат
Относится
к
Издан
НомТов
Автор
НазТов
Цена
Товар
КолСтр
НазТов
Колво
НомКорз
Обложка
Цена
Состав
корзины
Состав
заказа
Корзина
Колво
НомЗак
Заказ
ДатаЗак
Принад
лежит
Логин
НомПок
Пароль
Покупатель
E-mail
Фамилия
20
Имя
Адрес
Разработка электронного магазина на ASP и MS SQL Server
то есть каждая книга может быть положена в разные корзины, и в каждой
корзине может быть много книг, при этом в каждой корзине учитывается
количество одинаковых книг.
Объект заказ во многом похож на объект корзина. Отличие состоит в
том, что у каждого заказа имеется дата и владелец заказа. Таким образом,
объект покупатель связан с заказом связью "один ко многим".
Реляционная модель
Преобразуем ER-модель в реляционную модель. Получим следующие
таблицы.
Товар(НомТов, НазТов,КолСтр, Автор, Цена, Обложка, НомИзд, НомКат) столбец НомТов будет внешним ключом для таблиц СоставКорзины и
СоставЗаказа.
Издатель(НомИзд, НазИзд) - столбец НомИзд является внешним ключом
для таблицы Товар.
Категория(НомКат, НазКат) - столбец НомКат является внешним ключом
для таблицы Товар.
СоставКорзины(НомКорз, НомТов, Колво) – отдельную таблицу Корзина не
создаем. т.к., у объекта Корзина нет ничего, кроме идентификатора.
Заказ(НомЗак, ДатаЗак) столбец НомЗак является внешним ключом для
таблицы СоставЗаказа.
СоставЗаказа(НомЗак, НомТов, Колво)
21
О.В. Пинягина
Создание БД в MS SQL Server
MS SQL Server - это хорошо масштабируемый, полностью
реляционный, быстродействующий многопользовательский сервер баз
данных масштаба предприятия, способный обрабатывать большие объемы
данных для клиент-серверных приложений. Нам, разумеется, потребуются
далеко не все из его обширных возможностей.
Установка SQL Server, как правило, не вызывает особых трудностей.
Следует только заметить, что для установки нужно входить в систему с
правами администратора и желательно, чтобы логин не содержал русских
букв – иногда русские буквы в логине приводят к проблемам.
Для работы в SQL Server чаще всего применяются следующие
компоненты:
•
Books Online - справочная система;
•
Enterprise Manager - основное средство для администрирования;
•
Query Analyzer - среда для выполнения запросов;
•
Service Manager - утилита для запуска и останова системы.
Чтобы запустить SQL Server, запустите Service Manager и нажмите
на кнопку “Start/Continue”. На панели задач отобразится значок –
компьютер с красным квадратиком (если сервер остановлен) или зеленой
стрелкой (если сервер запущен).
Создать базу данных можно в визуальном режиме в Enterprise
Manager. Но я настоятельно советую не использовать эту возможность, так
как вам будет сложно переносить базу на другие компьютеры.
Удобнее всего для создания базы использовать Query Analyzer. Для
создания и заполнения базы данных нужно, как минимум:
1. создать базу данных командой CREATE DATABASE имя_БД,
2. выбрать текущую базу данных командой USE имя_БД,
3. создать таблицы командой CREATE TABLE ... ,
22
Разработка электронного магазина на ASP и MS SQL Server
4. заполнить таблицы данными командой INSERT INTO ...
Удобнее всего написать один или несколько сценариев, выполняющих
вышеуказанные действия. В этом случае у вас не будет проблем с переносом
базы на другие компьютеры.
Более подробную информацию о SQL Server, диалекте языка SQL,
применяемом в данной СУБД, и т.п., можно прочитать, например, на
странице
курса
«Базы
данных»,
расположенной
по
адресу
(http://kek.ksu.ru/EOS/BD/index.html).
Сценарий создания и заполнения базы данных
электронного магазина может выглядеть следующим образом.
для
нашего
create database books;
use books;
create table publishers
( id_publ int primary key identity,
name_publ varchar(50));
insert
insert
insert
insert
insert
into
into
into
into
into
publishers
publishers
publishers
publishers
publishers
(name_publ)
(name_publ)
(name_publ)
(name_publ)
(name_publ)
values
values
values
values
values
("Питер");
("BHV");
("ЛОРИ");
("Диалог-МИФИ");
("Que");
create table categories
( id_cat int primary key identity,
name_cat varchar(50));
insert into
values
insert into
values
insert into
values
insert into
values
insert into
values
categories (name_cat)
("Компьютерная литература");
categories (name_cat)
("Художественная литература");
categories (name_cat)
("Справочники");
categories (name_cat)
("Иностранные языки");
categories (name_cat)
("Кулинария");
create table books
( id_book int primary key identity,
name_book varchar(100),
id_publ int,
23
О.В. Пинягина
id_cat int,
author varchar(50),
pages int,
price int,
image varchar(50)
);
insert into books
(name_book,id_publ,id_cat,author,pages,price,image)
values ("Microsoft SQL Server 7.0. Разработка приложений", 2, 1,
"Ю. Тихомиров", 150, 100, "5-8206-0016-9.gif");
insert into books
(name_book,id_publ,id_cat,author,pages,price,image) values
("Справочник web-мастера. XML", 2, 1, "И. Шапошников", 298, 100,
"noimage.gif");
insert into books
(name_book,id_publ,id_cat,author,pages,price,image) values
("Microsoft SQL Server 7.0 в подлиннике", 2, 1, "Ю. Тихомиров",
530, 140, "5-8206-0032-0.gif");
insert into books
(name_book,id_publ,id_cat,author,pages,price,image) values
("Эффективная работа: PHP 4", 1, 1, "В. Водолазкий", 430, 140,
"noimage.gif");
insert into books
(name_book,id_publ,id_cat,author,pages,price,image) values
("РНР4.Учебный курс", 1, 1, "В.Гилмор", 390, 140,
"noimage.gif");
create table basket_books
( id_bask char(15),
id_book int,
kolvo int);
create table customers
( id_cust int primary key identity,
fam varchar(30),
im varchar(30),
addr varchar(100),
mail varchar(30),
login varchar(10),
pass varchar(10));
create table orders
( id_order char(15),
date_ord datetime,
id_cust int);
create table order_books
( id_order char(15),
id_book int,
kolvo int);
24
Разработка электронного магазина на ASP и MS SQL Server
Заметим, что ограничения внешних ключей в этом сценарии не заданы. При
желании можете их добавить самостоятельно.
Далее настроим доступ в SQL server. Запустите Enterprise Manager,
щелкните правой кнопкой мыши по имени сервера, выберите закладку
"Security" и назначьте аутентификацию "SQL server and Windows".
Теперь создайте в Enterprise Manager своего пользователя. В левом
окне откройте папку "Security" и выберите пункт "Logins". Создайте нового
пользователя, на закладке "General" назначьте ему имя, выберите для него
"SQL Server Authentification", назначьте пароль и выберите вашу базу
данных по умолчанию. Затем на закладке "Database acсess" в верхнем
списке в столбце "Permit" включите доступ к вашей базе данных. Далее в
нижнем списке выберите роль Public и нажмите на кнопку "Properties". В
появившемся окне нажмите на кнопку "Permissions". Появится окно
настройки доступа к таблицам. В этом окне включите нужные режимы
доступа (SELECT, INSERT, UPDATE или DELETE) для всех ваших таблиц.
Подсказка: если таблица используется только для чтения, включите режим
доступа SELECT; если таблица используется для записи, включите режимы
доступа SELECT, INSERT, UPDATE и DELETE.
Для доступа к базе данных из серверных сценариев сразу же настроим
источник данных ODBC. Для этого следует выбрать "Пуск" – "Настройка"
– "Панель управления" – "Адмнистрирование" – "Источники данных
(ODBC)". Перейдите на закладку "Системный DSN" и нажмите кнопку
"Добавить". В списке драйверов выберите SQL Server. Далее придумайте
имя для источника данных (например, books), выберите сервер из списка
серверов (или вручную наберите "(local)"). На следующей странице
назначьте режим "проверка подлинности учетной записи SQL server".
Все остальные настройки можно оставить по умолчанию. На последнем шагу
настройки можно протестировать соединение с источником данных.
Примечание: Если вы создаете базу данных в СУБД MS Access, у вас может
возникнуть проблема с доступом, особенно при модификации данных. Для
решения этой проблемы запустите программу администрирования IIS,
выберите каталог с базой данных, щелкните по нему правой кнопкой мыши и
25
О.В. Пинягина
выберите пункт меню "Свойства", перейдите на закладку "Безопасность
каталога", нажмите кнопку "Изменить", и в появившемся окне отключите
"Анонимный доступ" и включите "Встроенная проверка подлинности
Windows".
26
Разработка электронного магазина на ASP и MS SQL Server
Основы языка серверных сценариев ASP
Internet Information Services
Технология ASP тесно связана с web-сервером IIS (Internet
Information Services). Этот сервер является составной частью операционной
системы Windows XP Professional. Если по умолчанию IIS не установлен,
запустите "Панель управления", зайдите в "Установку и удаление
программ", выберите режим "Установка Windows" и установите IIS.
Затем запустите браузер и наберите в адресной строке
http://localhost
Если все нормально, будет запущена стартовая страница IIS. (Вместо имени
localhost для обращения к локальному хосту также можно использовать
числовой адрес 127.0.0.1)
В дальнейшем до IIS можно будет добраться через "Панель
управления" – "Администрирование" – "Internet information services".
Заметим, что корневым каталогом документов по умолчанию является
каталог C:\Inetpub\wwwroot. Именно сюда следует помещать подкаталоги с
вашими разработками. Пусть, например, подкаталог с нашим книжным
магазином называется book и размещен как C:\Inetpub\wwwroot\book. Тогда
в адресной строке браузера следует набрать, например,
http://localhost/book/index.asp
Будет запущена страница index.asp.
Что такое ASP
Технология ASP расшифровывается как Active Server Pages, т.е.,
активные серверные страницы.
Существенным преимуществом технологии ASP является тот факт, что
в пределах одного web-документа можно перемешивать HTML-тэги и ASPкоманды. Для того чтобы отделить ASP-код от HTML-тэгов, его
ограничивают символами <% %>.
Работает все это так. Сначала на сервере выполняются ASP-команды.
Они могут содержать обращение к базам данных, работу с файлами,
27
О.В. Пинягина
динамическое формирование HTML-кода и прочие виды обработки
информации. После того как документ полностью обработан на сервере, он
отправляется пользователю и отображается у него в браузере. Таким
образом, пользователь никаких серверных команд уже не увидит – он увидит
только результаты их работы.
Рассмотрим простой пример:
<%@ Language="JScript" %>
<%
d = new Date();
str= "Привет! Сейчас "+d.getHours()+":"+d.getMinutes();
%>
<html>
<head><title>Пример ASP</title></head>
<body>
<h2><%=str%></h2>
</body>
</html>
В этом примере первая команда является обязательной и указывает
используемый язык. Наряду с JScript (это серверный аналог JavaScript)
часто применяется VBScript (производный от Visual Basic). В дальнейшем
мы будем использовать только JScript.
Затем инициализируются две переменные. Одна из них содержит
ссылку на объект класса Date, другая – символьную строку. Из объекта Date
получаем текущее время (часы и минуты). В стандартную структуру HTMLдокумента выводим символьную строку,
содержащую приветствие и
текущее (серверное) время. Для этого используется команда <%= %>.
ASP представляет собой объектно-ориентированную технологию.
Здесь практически все основано на объектах – и получение запроса из
браузера, и формирование ответа браузеру, и обращение к базам данных, и
много другое.
Типы данных и переменные
Имя переменной в JScript может содержать буквы, цифры и некоторые
специальные символы и должно начинаться с буквы или знака
подчеркивания. Регистр букв учитывается.
28
Разработка электронного магазина на ASP и MS SQL Server
Переменные не обязательно объявлять. Любая переменная объявляется
неявно при первом использовании. Тип переменной также неявно
определяется по типу хранящегося в ней значения, т.е., переменные слабо
типизированы. Явно переменную можно объявить с помощью ключевого
слова var.
В JScript используются следующие стандартные типы данных:
• целые числа
• вещественные числа
• строки
• логические величины
Целые числа
Так же, как и в языке C, для целых чисел кроме десятичного
представления (1, 16, 255), допустимы восьмеричное (01, 020, 0377) и
шестнадцатеричное (0x1, 0x10, 0xff).
Вещественные числа
Для числе с десятичной точкой используется стандартная запись с
фиксированной точкой (1.5, 0.999) и так называемая научная запись - с
плавающей точкой (0.15e1, 9.99e-1).
Строки
Строки могут заключаться в двойные кавычки или в апострофы. Для
сцепления строк используется операция "+". На самом деле при
использовании строк неявно создаются объекты класса String, о которых мы
будем говорить чуть позже.
Логические величины
Нетрудно догадаться, что логический тип представлен значениями true
и false.
Операции и операторы
В JScript используются следующие операции (унаследованные из С):
29
О.В. Пинягина
Обозначение
Ассоциатив
ность
Описание
()
-
Изменение приоритета
new
-
Создание экземпляра объекта
! ~
П
Логическое и поразрядное отрицания
П
Инкремент, декремент
++
--
/
%
*
Л
Деление, остаток, умножение
+
-
+
Л
Сложение, вычитание, сцепление строк
Л
Поразрядный сдвиг влево и вправо
-
Меньше, меньше или равно, больше,
больше или равно
-
Равно, идентично, не равно
Л
Поразрядные И, Исключающее ИЛИ, ИЛИ
Л
Логические И, ИЛИ
?:
П
Тернарная операция
= += -= /= %= *=
.= &= |= <<= >>=
П
Присваивание
//
-
Однострочные комментарии
/* */
-
Многострочные комментарии
<<
<
>>
<=
>
=>
== !=
&
&&
^
|
||
Основные операторы также унаследованы из C. В конце оператора
обычно ставится точка с запятой. Точку с запятой:
• не нужно ставить после составного оператора (блока), который
выделяется фигурными скобками;
• нельзя ставить в команде <%= %>;
• не обязательно ставить, если в блоке <% %> оператор является
единственным.
Условный оператор
if (условие) {
30
Разработка электронного магазина на ASP и MS SQL Server
блок
}
else {
блок
}
Цикл с предусловием
while (условие) {
блок
}
Цикл с постусловием
do {
блок
} while (условие);
Цикл со счетчиком
for (инициализация; условие выхода; действие по окончании
итерации) {
блок
}
Оператор выбора
switch (выражение) {
case (условие1):
блок
case (условие2):
блок
...
case (условиеN):
блок
default:
блок
}
Оператор прерывания
break;
Оператор прерывания итерации
continue;
Класс Date
31
О.В. Пинягина
Как вы уже поняли, для работы с датами и временем используется
класс Date. Объект Date обязательно создавать явно:
d = new Date();
По умолчанию создается объект, содержащий информацию о текущем
времени и дате. Есть ряд полезных методов для получения частей даты и
времени:
getDate()
возвращает день месяца
getMonth()
возвращает номер месяца (от 0 до 11)
getYear()
возвращает год
getHours()
возвращает часы
getMinutes()
возвращает минуты
getTime()
возвращает время (в миллисекундах),
прошедшее с 1 января 1970 г.
и т.п.
Есть также методы, которые устанавливают части даты и времени:
setDate(целое_число)
устанавливает день месяца
setMonth(целое_число)
устанавливает номер месяца (от 0 до 11)
setYear(целое_число)
устанавливает год
setHours(целое_число)
устанавливает часы
setMinutes(целое_число)
устанавливает минуты
setTime(целое_число)
устанавливает время (в миллисекундах),
прошедшее с 1 января 1970 г.
и т.п.
Некоторые из этих функций мы будем использовать, когда будем назначать
срок хранения корзины.
32
Разработка электронного магазина на ASP и MS SQL Server
Класс String
Класс String используется для работы со строками. Явно объекты
такого типа мы создавать не будем, но при необходимости их можно создать
командой new.
Для сцепления строк используется операция "+". Со строкой можно
также сцеплять числа, например:
d = new Date();
str = "Сейчас "+d.getHours()+":"+d.getMinutes();
Иногда при присвоении строке содержимого какого-либо объекта,
например:
mypass = Request("password");
можно столкнуться со следующей проблемой. Неявно строке был присвоен
адрес объекта, а затем объект был удален или вышел из области видимости.
Следовательно, его значение уже недоступно, и возможна ошибка. Чтобы
быть уверенным, что в строку копируется не адрес , а именно значение
объекта, следует его сцепить слева с пустой строкой:
mypass = "" + Request("password");
Объект Math
Объект Math содержит полезные математические константы и
функции. Создавать его явно не обязательно, можно обращаться к его
элементам по имени класса, например:
str="Число пи:"+Math.PI
Объект Request
Объект Request (запрос) является основным средством для передачи
информации от браузера серверу.
33
О.В. Пинягина
Как вы уже знаете, информация может передаваться методом GET или
POST. Метод GET передает данные в адресной строке, метод POST – в теле
запроса. Гиперссылка (тэг <a>) всегда использует метод GET, в форме (тэг
<form>) можно использовать либо GET, либо POST.
Если данные переданы методом GET (в строке запроса), их можно
оттуда извлечь с помощью метода QueryString, например:
var mylogin=Request.QueryString("login");
Если данные переданы методом POST (в теле запроса), их можно
оттуда извлечь с помощью метода Form, например:
var mylogin=Request.Form("login");
И в том, и в другом случае можно использовать упрощенную запись и
обращаться прямо к объекту Request:
var mylogin=Request("login");
Кроме того, объект Request содержит коллекцию так называемых
"ключиков" (cookies), которые также используются для обмена информации
между браузером и сервером. К каждому ключику можно обращаться по
имени:
var id =Request.Cookies("is_bask");
Подробнее о ключиках мы будем говорить при обсуждении работы с
корзиной.
Объект Response
Объект Response (ответ) является основным средством для передачи
информации от сервера браузеру.
Для того чтобы напечатать что-либо в выходной поток (в HTMLдокумент), используется метод Write, например:
d = new Date();
34
Разработка электронного магазина на ASP и MS SQL Server
str = "Сейчас "+d.getHours()+":"+d.getMinutes();
Response.Write(str);
Можно также использовать сокращенную запись, которую вы уже
встречали:
<%=str%>
Объект Response, как и Request, тоже содержит коллекцию
"ключиков".
Кроме того, мы будем использовать следующие возможности объекта
Response.
При загрузке некоторых страниц может случиться так, что браузер не
захочет запрашивать страницу у сервера заново, а загрузит результат
предыдущего выполнения того же сценария из собственного временного
хранилища – из так называемого "кэша". Для того чтобы предотвратить такие
ситуации, следует в серверном сценарии (в самом начале) выполнить
команду:
Response.Expires=0;
Таким образом мы задаем срок хранения документа в кэше браузера (0
секунд).
Еще одна полезная возможность состоит в переадресации браузера на
другую страницу. Это можно сделать с помощью метода Redirect:
Response.Redirect("имя_страницы.тип_страницы");
35
О.В. Пинягина
Этап 3. Разработка шаблонов и главной страницы
Шаблоны
Шаблоном, применительно к web-программированию, можно назвать
часть web-документа, которая используется в нескольких страницах.
Шаблоны позволяют быстро проводить модификацию всего сайта достаточно изменить информацию или оформление в шаблоне, и это
отразится на всех страницах, использующих данный шаблон.
Для включения текста шаблона в документ используется технология
SSI (server side includes).
Команда
<!-- #include file="имя_файла.тип_файла" -->
включает содержимое файла в сценарий.
Обычно в отдельный шаблон удобно выделить шапку страницы, а в
другой шаблон - нижний колонтитул или средства навигации.
<!-- #include file="shapka.asp" -->
текст HTML-документа
<!-- #include file="bottomMenu.asp" -->
Проанализируем, какие элементы оформления в нашем электронном
магазине обязательно будут появляться на каждой странице.
К верхнему шаблону можно отнести фоновый рисунок, логотип вместе
с маленькой формой для авторизации, а также строку меню. Обратите
внимание, что заголовок текущего режима работы – "Welcome!", "Каталог",
"Корзина" и.т.п., на полоске соответствующего цвета также можно вынести в
шаблон. Для этого заведем ASP-переменные color и title, которые будем
инициализировать в соответствующих страницах, а распечатывать – в
верхнем шаблоне.
Итак, верхний шаблон header.asp будет выглядеть следующим образом
36
Разработка электронного магазина на ASP и MS SQL Server
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>КНИЖНЫЙ МАГАЗИН</title>
<meta HTTP-EQUIV="Content-Type" Content="text-html;
charset=windows-1251">
</head>
<body background="EULA.jpg" style="background-repeat:repeat-y"
leftmargin="130" rightmargin="5" bgProperties=fixed>
<table border="0" align="right" width="90%" cellpadding="0"
cellspacing="0">
<tr><td>
<table border="0" align="right" width="100%" >
<tr>
<td align="center" bgcolor="#cccccc">
<form action="auto.asp" method="post">
<table>
<tr><td align="right"><font size=-2>Логин:</font></td><td
align="left"><input type=text style="width:60; height:20;"
name=login></td></tr>
<tr><td align="right"><font size=-2>Пароль:</font></td><td
align="left"><input type=password style="width:60; height:20;"
name=pass>
<input type=submit value=ok style="height:20;"></td></tr>
</table>
</td>
</form>
37
О.В. Пинягина
<td colspan="4" align="center" bgcolor="#ccccff"><font
face="Arial" size="+3"><i><b>Книжный
магазин</b></i></font></td></tr>
<tr><td align="center" bgcolor="#aaddff" width="20%"><a
href="catalog.asp"><b>Каталог</b></a></td>
<td align="center" bgcolor="#ddaaff" width="20%"><a
href="basket.asp"><b>Корзина</b></a></td>
<td align="center" bgcolor="#aaaaff" width="20%"><a
href="reg.asp"><b>Регистрация</b></a></td>
<td align="center" bgcolor="#ffaaff" width="20%"><a
href="order.asp"><b>Заказ</b></a></td>
<td align="center" bgcolor="#aaffee" width="20%"><a
href="exit.asp"><b>Выход</b></a></td>
</tr>
</table>
</td></tr>
<tr><td align="center" bgcolor=<%=color%>><font face="Arial"
size="+2"><i><%=title%></i></font><br>
</td></tr>
В нижний шаблон footer.asp вынесем гиперссылку "На главную
страницу" и закрывающие тэги документа.
<tr><td><center><hr><br>
<a href="index.asp">На главную страницу</a></center></td></tr>
</table>
</body>
</html>
Главная страница
Таким образом, код главной страницы
лаконично.
будет выглядеть довольно
<%@ Language="JScript" %>
<% Response.Expires=0 %>
<%
var title="Welcome!";
var color="#ccccff";
%>
<!-- #include file="header.asp" -->
<tr><td>
<center><h2><font color="#555599"><br>Добро пожаловать в наш
электронный книжный магазин! <br><br>Здесь представлена
литература самых известных российских издательств. Любой
читатель обязательно найдет себе книгу по вкусу! Мы предлагаем
компьютерную литературу, энциклопедии, справочники, самые
38
Разработка электронного магазина на ASP и MS SQL Server
известные художественные произведения классиков и современников
и многое-многое другое!</font></h2>
</center>
</td></tr>
<!-- #include file="footer.asp" -->
Обратите внимание, что для удобства размещения элементов
оформления используется таблица, которая открывается в верхнем шаблоне,
закрывается в нижнем шаблоне, а ее основная часть будет разной в разных
режимах работы. Может быть, такая структура покажется вам довольно
запутанной, но со временем вы сможете ее оценить, в особенности, если вам
придется изменять общее оформление всего сайта.
39
О.В. Пинягина
Этап 4. Разработка витрины электронного магазина
ASP и базы данных
Поскольку технология ASP является объектно-ориентированной, для
доступа к базам данных разработаны специальные классы. Для создания
объектов этих классов используется метод CreateObject стандартного
объекта Server (имеется в виду сам сервер IIS).
1. Подключение к серверу.
Для подключения к серверу используется класс ADODB.Connection.
Сначала требуется создать объект такого типа:
MyCon=Server.CreateObject("ADODB.Connection");
Затем следует открыть соединение. Вспомним, что при создании базы
данных в SQL Server мы создали источник данных ODBC и назвали его
books. Теперь он нам пригодится. Вызовем метод open:
MyCon.Open("books","sa","");
В этом методе первый параметр означает имя источника данных ODBC,
второй параметр – логин, третий параметр – пароль для подключения к
СУБД.
Другой способ подключения (без использования источника данных ODBC)
состоит в применении так называемой строки подключения. Например,
подключимся к базе данных MS Access, которая называется book.mdb и
располагается в том же каталоге, что и asp-файлы:
MyCon.Open("Provider=Microsoft.Jet.OLEDB.4.0;"+
"Data Source="+Server.mappath("book.mdb"));
2. Выполнение запросов SELECT.
Для хранения результатов запроса SELECT используется
ADODB.Recordset. Сначала требуется создать объект такого типа:
MyRec1=Server.CreateObject("ADODB.Recordset");
Затем можно выполнять сам запрос:
40
класс
Разработка электронного магазина на ASP и MS SQL Server
MyRec1.Open("SELECT
MyCon);
*
FROM
publishers
ORDER
BY
name_publ",
Как видим, для выполнения запроса на выборку данных используется
метод open класса Recordset, первым его параметром является строка,
содержащая формулировку запроса, второй параметр – это объект типа
Connection.
3. Действия с результатами выборки.
Предположим, мы хотим распечатать результат вышеуказанного запроса
(список издателей). Для этого организуем следующий цикл:
while(!MyRec1.EOF)
{
Response.write(MyRec1("name_publ")+"<br>");
MyRec1.MoveNext();
}
Цикл будет работать, пока не закончится набор записей MyRec1. Для
проверки этого условия используется свойство EOF. В теле цикла мы
обращаемся к полю name_publ (название издателя) и записываем его
значение в выходной поток. Для перемещения на следующую строку
используется метод MoveNext.
4. Запрос на модификацию данных (INSERT, UPDATE, DELETE)
Для выполнения запросов на изменение данных применяется метод execute
класса Connection. Например, мы хотим удалить содержимое корзины с
номером 1:
MyCon.Execute("DELETE FROM basket_books WHERE id_bask=’1’");
Таким же образом можно выполнить запросы INSERT и UPDATE, а также
вызов хранимых процедур.
41
О.В. Пинягина
5. Закрытие наборов строк и соединений.
По окончании работы с объектами типов Connection и Recordset следует их
закрывать и, на всякий случай, обнулять:
MyRec1.Close(); MyRec1=null;
MyCon.Close(); MyCon=null;
Просмотр издателей и категорий
Итак, приступим к разработке витрины нашего электронного магазина.
Вспомним схему 2 со стр. 7 – действия с каталогом.
Схема 2. Работа с каталогом
Покупатель
Главное меню
Просмотр
списка
издателей
Просмотр
книг выбранного
издателя
Просмотр
списка
категорий
Просмотр
книг выбранной
категории
Мы предполагали, что у читателя должна быть возможность выбора
издателя и категории, поэтому самое удобное, что мы можем сделать –
вывести список издательств и список категорий, как показано на следующей
картинке.
42
Разработка электронного магазина на ASP и MS SQL Server
Подключение к базе данных выглядит следующим образом (кстати,
этот код удобно выделить в отдельный шаблон connect.asp):
MyCon=Server.CreateObject("ADODB.Connection");
MyCon.Open("books","sa","");
Выполнение двух запросов выглядит так:
var MyRec1=Server.CreateObject("ADODB.Recordset");
var strSQL1="SELECT * FROM publishers ORDER BY name_publ";
MyRec1.Open(strSQL1, MyCon);
var MyRec2=Server.CreateObject("ADODB.Recordset");
var strSQL2="SELECT * FROM categories ORDER BY name_cat";
MyRec2.Open(strSQL2, MyCon);
Осталось вывести результаты запросов в две ячейки таблицы. В следующем
листинге перемешаны HTML-тэги и ASP-команды.
<tr><td>
<table border=0 width=100%>
<tr><td width="50%"><center><h3>Издатели</h3></center><ul>
<%
while(!MyRec1.EOF)
{%>
<li><a href="show.asp?type=1&id_publ=<%=MyRec1("id_publ")%>">
<%=MyRec1("name_publ")%></a>
<% MyRec1.MoveNext();
}%>
</ul></td>
<td width="50%"><center><h3>Категории</h3></center><ul>
<%
43
О.В. Пинягина
while(!MyRec2.EOF)
{%>
<li><a href="show.asp?type=2&id_cat=<%=MyRec2("id_cat")%>">
<%=MyRec2("name_cat")%></a>
<% MyRec2.MoveNext();
}%>
</ul></td>
</tr>
</table>
</td></tr>
Обратите внимание, как из названий издательств и категорий формируются
гиперссылки, например:
<a href="show.asp?type=1&id_publ=<%=MyRec1("id_publ")%>">
<%=MyRec1("name_publ")%></a>
Поскольку при щелчке по гиперссылке следует получить список книг по
заданному издателю или категории, то в сценарий show.asp передаются
параметры type (если он равен 1, то выбран издатель, если 2 – то категория) и
id_publ (код издателя) или id_cat (код категории).
Полный код сценария catalog.asp приведен в Приложении.
Просмотр списка книг
44
Разработка электронного магазина на ASP и MS SQL Server
Сценарий show.asp предназначен для просмотра списка книг. Если мы
хотим выбрать книги определенного издательства, мы передаем параметр
type=1, и обращение к базе данных выглядит следующим образом:
var type=Request.QueryString("type");
var MyRec=Server.CreateObject("ADODB.Recordset");
var MyRec2=Server.CreateObject("ADODB.Recordset");
if (type==1)
{
strSQL="SELECT name_publ FROM publishers WHERE
id_publ="+Request.QueryString("id_publ");
MyRec.Open(strSQL, MyCon);
if(!MyRec.EOF)
title=MyRec("name_publ");
strSQL2="SELECT id_book, image, author, name_book,
books.id_publ, name_publ, pages, price, books.id_cat,
name_cat FROM books, publishers, categories WHERE
books.id_cat=categories.id_cat AND
books.id_publ=publishers.id_publ AND
books.id_publ="+Request.QueryString("id_publ");
MyRec2.Open(strSQL2, MyCon);
}
Если же мы хотим выбрать книги определенной категории, мы передаем
параметр type=2, и обращение к базе данных выглядит следующим образом:
if (type==2)
{
strSQL="SELECT name_cat FROM categories WHERE
id_cat="+Request.QueryString("id_cat");
MyRec.Open(strSQL, MyCon);
if(!MyRec.EOF)
title=MyRec("name_cat");
strSQL2="SELECT id_book, image, author, name_book,
books.id_publ, name_publ, pages, price, books.id_cat,
name_cat FROM books, publishers, categories WHERE
books.id_cat=categories.id_cat AND
books.id_publ=publishers.id_publ AND
books.id_cat="+Request.QueryString("id_cat");
MyRec2.Open(strSQL2, MyCon);
}
45
О.В. Пинягина
Затем формируем HTML-таблицу с информацией о книгах. Обратите
внимание, как формируются тэги <img> для изображения обложек книг:
<img src="images/<%=MyRec2("image")%>"
alt="<%=MyRec2("name_book")%>" border="0">
Под обложкой книги расположена гиперссылка "положить в
корзину". Эта гиперссылка вызывает сценарий dobasket.asp, в котором
объединены несколько режимов работы с корзиной. Для добавления книги в
корзину мы передаем параметры type=1 и id_book (код книги).
Кроме того, обратите внимание, что название издательства и категории
представляют собой гиперссылки, с помощью которых можно быстро
переключиться на другую классификацию.
<table border="1" width="100%" align="right" >
<%
while(!MyRec2.EOF)
{%>
<tr>
<td align="center"><img src="images/<%=MyRec2("image")%>"
alt="<%=MyRec2("name_book")%>" border="0">
<center><a href="dobasket.asp?type=1&id_book=
<%=MyRec2("id_book")%>">
<font size=-1>положить в корзину</font></a></center></td>
<td>
<table>
<tr><td align="right"><i>Автор: </i></td>
<td><%=MyRec2("author")%></td></tr>
<tr><td align="right"><i>Название: </i></td>
<td><%=MyRec2("name_book")%></td></tr>
<tr><td align="right"><i>Издательство: </i></td>
<td><a href="show.asp?type=1&id_publ=<%=MyRec2("id_publ")%>">
<%=MyRec2("name_publ")%></a></td></tr>
<tr><td align="right"><i>Количество страниц: </i></td>
<td><%=MyRec2("pages")%></td></tr>
<tr><td align="right"><i>Цена: </i></td>
<td><%=MyRec2("price")%></td></tr>
<tr><td align="right"><i>Категория: </i></td>
<td><a href="show.asp?type=2&id_cat=<%=MyRec2("id_cat")%>">
<%=MyRec2("name_cat")%></a></td></tr>
</table>
</td>
46
Разработка электронного магазина на ASP и MS SQL Server
</tr>
<%MyRec2.MoveNext();
}
MyRec.Close();
MyRec2.Close();
MyCon.Close();
MyRec=null;
MyRec2=null;
MyCon=null;
%>
</table>
Полностью код сценария приведен в Приложении.
47
О.В. Пинягина
Этап 5. Разработка корзины покупателя
Вспомним схему 3 со стр. 8 – действия с корзиной.
Схема 3. Работа с корзиной
Покупатель
Главное меню
Просмотр
списка книг
Просмотр
корзины
Очистка
корзины
Добавление в
корзину
Удаление из
корзины
Изменение
количества в
корзине
При просмотре каталога покупатели непременно захотят отложить
понравившиеся книги в корзину. При этом предварительной регистрации мы
не требуем. Как же отличить корзину одного покупателя от корзины
другого?
В таких случаях обычно используется стандартный подход анонимных
корзин, предусматривающий хранение идентификатора корзины в ключике
(cookie) на компьютере пользователя.
Cookies
Cookies, или, как их называют по-русски, ключики, представляют
собой именованные кусочки информации, которые web-сервер может
сохранить на клиентском компьютере. Рассмотрим коротко процесс передачи
ключиков между сервером и клиентом. Он состоит из следующих шагов:
1. Сервер передает информацию о ключике, который он хочет создать:
имя, значение, срок действия, имя домена (ключик всегда создается для
конкретного домена) в служебной части HTML-страницы, в виде
строки заголовка (header).
48
Разработка электронного магазина на ASP и MS SQL Server
2. Браузер клиента записывает ключик в специальный файл на
компьютере клиента. Ключик будет храниться там, пока не истечет
срок его действия (для хранимых ключиков), либо пока браузер не
будет закрыт (для временных ключиков).
3. При формировании запроса к web-серверу о получении какой-либо
страницы браузер отправляет в заголовке запроса все ключики этого
домена, которые хранятся на клиентском компьютере.
4. Сервер вместе с запросом страницы получает информацию о ключиках
и может ее использовать по собственному усмотрению.
Ключики являются единственным средством сохранения информации
из web-страницы на компьютере клиента. Необходимость в сохранении
информации возникает, например, в том случае, если нужно отслеживать
сеанс пользователя и однозначно его идентифицировать. Проблема здесь
состоит в том, что отдельные HTML-страницы сайта очень слабо связаны
друг с другом и для передачи информации между ними существует не так уж
много способов.
Вернемся к электронному магазину. Пользователь, перемещаясь по
страницам магазина, выбирает товары и кладет их в корзину. Для сохранения
этой информации можно использовать следующие подходы:
• Использовать фреймовую структуру и хранить информацию в
глобальных переменных на уровне frameset с помощью клиентских
сценариев JavaScript или VBScript. Эти переменные будут доступны
из любого фрейма, но, разумеется, будут уничтожены при закрытии
окна браузера и даже просто при переходе на другой сайт (по поводу
фреймов и языка клиентских сценариев JavaScript – см. подробнее в
электронном
учебнике
по
Web-программированию
(http://kek.ksu.ru/EOS/TESTS/index.html) ).
•
Хранить информацию о корзине на сервере в базе данных. Этот способ
позволяет сохранять информацию в течение любого срока. Для
однозначной идентификации корзины пользователя нужно только
присвоить ей уникальный номер. Этот номер можно передавать между
49
О.В. Пинягина
HTML-страницами в виде скрытого поля, а можно записать его в
cookies. Именно этот подход мы и будем здесь использовать.
Создание ключика для идентификатора корзины
Итак, казалось бы, ключик для корзины разумно создавать при входе
на главную страницу. Но пользователь может зайти на любую страницу
нашего сайта, просто набрав ее адрес в адресной строке! Поэтому любая
страница нашего сайта должна содержать следующие действия: следует либо
создавать ключик, если он не существует, либо продлевать срок хранения
ключика на заданный интервал, начиная с текущего момента. Установим, что
срок хранения корзины равен двум неделям. Соответствующий сценарий
удобно поместить в верхний шаблон header.asp, тогда он наверняка будет
выполняться при загрузке любой страницы сайта.
var id_bask=Request.cookies("id_bask");
var d = new Date();
if (id_bask=="")
{
id_bask=d.getTime();
}
d.setTime(d.getTime()+1000*60*60*24*14);
s=""+d.getDate()+"."+(d.getMonth()+1)+"."+d.getYear()+"
"+d.getHours()+":"+d.getMinutes();
Response.Cookies("id_bask")=id_bask;
Response.Cookies("id_bask").Expires=s;
Рассмотрим более подробно этот сценарий. Прежде всего, серверный
сценарий пытается прочесть ключик с именем id_bask из коллекции
ключиков объекта Request:
var id_bask=Request.cookies("id_bask");
Если такого ключика не было, в переменную id_bask будет записана
пустая строка. Итак, если ключика не было, то для него нужно создать болееменее уникальное значение. Для этого используем текущее время (в
миллисекундах).
if (id_bask=="")
{ id_bask=d.getTime(); }
50
Разработка электронного магазина на ASP и MS SQL Server
Теперь нам надо подготовить переменную для установки срока хранения
ключика (две недели). С помощью объекта типа Date это можно сделать так:
d.setTime(d.getTime()+1000*60*60*24*14);
s=""+d.getDate()+"."+(d.getMonth()+1)+"."+d.getYear()+"
"+d.getHours()+":"+d.getMinutes();
Здесь мы во-первых назначаем время плюс две недели, начиная с текущего
момента. Затем мы формируем из полученного объекта Date символьную
строку следующего формата:
День.Месяц.Год Часы:Минуты
Именно в таком формате нужно будет передавать срок хранения ключика.
Для создания (либо пересоздания) ключика с именем id_bask и значением,
сгенерированным выше, обращаемся к коллекции cookies объекта Response:
Response.Cookies("id_bask")=id_bask;
И, наконец, назначаем этому ключику срок хранения:
Response.Cookies("id_bask").Expires=s;
Обратите внимание, как в последнем операторе мы обращаемся к свойству
Expires ключика с именем id_bask из коллекции ключиков объекта
Response.
Просмотр корзины
В сценарии просмотра корзины basket.asp прежде всего проверяем, не
является ли корзина пустой:
<%
var id_bask=Request.cookies("id_bask");
var strSQL1="SELECT COUNT(*) AS cnt FROM basket_books
WHERE id_bask='"+id_bask+"'";
var MyRec1=Server.CreateObject("ADODB.Recordset");
var MyRec2=Server.CreateObject("ADODB.Recordset");
MyRec1.Open(strSQL1, MyCon);
51
О.В. Пинягина
if(MyRec1("cnt")==0)
{
%>
<tr><td bgcolor='#ff9999' align='center'>
<b>Ваша корзина пуста!</b></td></tr>
<%
}
%>
Если корзина не пуста, выдаем ее содержимое на экран. Обратите внимание,
как подсчитывается итоговая сумма. Обратите также внимание, как
создаются гиперссылки «+» и «-».
<%
else
{
strSQL1="SELECT image, author, name_book, pages, price, kolvo,
id_bask, books.id_book FROM books, basket_books WHERE
books.id_book=basket_books.id_book AND id_bask='"+id_bask+"'";
MyRec2.Open(strSQL1, MyCon);
%>
<tr><td>
<table border="1" width="100%" align="right" >
<tr><td align="right"><i>Автор: </i></td>
<td align="right"><i>Название: </i></td>
<td align="right"><i>Цена: </i></td>
<td align="right"><i>Количество: </i></td><td></td></tr>
<%
52
Разработка электронного магазина на ASP и MS SQL Server
var sum=0;
while(!MyRec2.EOF)
{
%>
<tr>
<td><%=MyRec2("author")%></td>
<td><b><%=MyRec2("name_book")%></b></td>
<td><%=MyRec2("price")%></td>
<td><%=MyRec2("kolvo")%>
<input type="hidden" name="id_book"
value=<%=MyRec2("id_book")%>>
<a href="dobasket.asp?type=1&id_book=<%=MyRec2("id_book")%>"
title="Увеличить">[ + ]</a>
<a href="dobasket.asp?type=2&id_book=<%=MyRec2("id_book")%>"
title="Уменьшить">[ - ]</a></td>
<td><a href="dobasket.asp?type=3&id_book=
<%=MyRec2("id_book")%>">Удалить</a></td>
</tr>
<%
sum+=MyRec2("price")*MyRec2("kolvo");
MyRec2.MoveNext();
}%>
<tr><td align="right"></td><td align="right"><i>ИТОГО:
</i></td><td align="right"><%=sum%></td><td
align="right"></td></tr>
</table>
<%
}
%>
Добавление товара в корзину
Когда в каталоге книг пользователь выбирает понравившуюся книгу и
щелкает по ссылке "положить в корзину", вызывается сценарий
dobasket.asp, в который передаются параметры type=1 и id_book (код
выбранной книги). Мы читаем эти параметры и записываем в переменные:
var type=Request.QueryString("type");
var id_book=Request.QueryString("id_book");
Кроме того, нужно прочитать значение ключика-идентификатора корзины:
var id_bask=Request.Cookies("id_bask");
53
О.В. Пинягина
Алгоритм при добавления товара в корзину выглядит следующим
образом. Если эта книга уже присутствует в корзине, то мы только
увеличиваем количество на единицу. В противном случае в корзину
добавляем новую строку.
Обратите внимание, что при динамическом формировании запросов
значения строковых констант (которые используются, например, в опции
WHERE) следует помещать в одинарные кавычки.
if(type==1) // положить в корзину
{
strSQL="SELECT * FROM basket_books WHERE
id_book="+id_book+" AND id_bask='"+id_bask+"'";
MyRec.Open(strSQL, MyCon);
if (!MyRec.EOF)
{
strSQL="UPDATE basket_books SET kolvo=kolvo+1 WHERE
id_book="+id_book+" AND id_bask='"+id_bask+"'";
}
else
{
strSQL="INSERT INTO basket_books (id_bask, id_book,
kolvo) VALUES ('"+id_bask+"',"+id_book+",1)";
}
MyCon.Execute(strSQL);
MyRec.close();
}
После выполнения действий с базой данных мы хотим выдать
пользователю на экран состав его корзины. Соответствующий сценарий
просмотра корзины у нас уже есть. Поэтому последняя команда в сценарии
dobasket.asp заключается в переадресации на страницу basket.asp:
Response.Redirect("basket.asp");
Уменьшение и увеличение количества
Как видим при просмотре корзины, рядом с каждым товаром есть две
гиперссылки – со значками "плюс" и "минус". Эти гиперссылки означают
"увеличить количество товара в корзине на одну штуку" и "уменьшить
количество товара в корзине на одну штуку".
54
Разработка электронного магазина на ASP и MS SQL Server
При щелчке по гиперссылке "+" вызывается сценарий dobasket.asp с
параметром type=1, соответствующий код сценария мы уже рассмотрели при
добавлении товара в корзину.
При щелчке по гиперссылке "-" вызывается сценарий dobasket.asp с
параметром type=2. Если количество было равно 1, то мы полностью удаляем
данную книгу из корзины. Если же количество было больше 1, то мы просто
переписываем строку в корзине, уменьшая количество на единицу.
if(type==2) // уменьшить количество
{
strSQL="SELECT * FROM basket_books WHERE
id_book="+id_book+" AND id_bask='"+id_bask+"'";
MyRec.Open(strSQL, MyCon);
if (!MyRec.EOF)
{
if (MyRec("kolvo")>1)
{
strSQL="UPDATE basket_books SET kolvo=kolvo-1 WHERE
id_book="+id_book+" AND id_bask='"+id_bask+"'";
}
else
{
strSQL="DELETE FROM basket_books WHERE
id_book="+id_book+" AND id_bask='"+id_bask+"'";
}
}
MyCon.Execute(strSQL);
MyRec.close();
}
Удаление товара из корзины
При просмотре корзины также можно удалить любой товар из нее. Для
этого служит гиперссылка "Удалить", по которой вызывается тот же
сценарий dobasket.asp, но уже с параметром type=3:
if(type==3) // удалить из корзины
{
strSQL="DELETE FROM basket_books WHERE id_book="+id_book+
" AND id_bask='"+id_bask+"'";
MyCon.Execute(strSQL);
}
55
О.В. Пинягина
Кроме того, корзину можно полностью очистить, щелкнув по
гиперссылке "Очистить корзину". В этом случае опять вызывается тот же
сценарий dobasket.asp, но с параметром type=4:
if(type==4) // очистить корзину
{
strSQL="DELETE FROM basket_books WHERE
id_bask='"+id_bask+"'";
MyCon.Execute(strSQL);
}
Полностью код сценария приведен в Приложении.
56
Разработка электронного магазина на ASP и MS SQL Server
Этап 6. Разработка системы регистрации и авторизации
посетителей
Регистрация
Вспомним схему 5 со стр. 9 – регистрация покупателя.
Схема 5. Регистрация
Покупатель
Главное меню
Форма
регистрации
Успешная
регистрация
Неуспешная
регистрация
После того как посетитель нашего магазина отложил понравившиеся
ему книги в корзину, возможно, он захочет их действительно купить. Для
этого пользователь должен сообщить информацию о себе, т.е,
зарегистрироваться.
Для регистрации используется следующая форма (reg.asp).
57
О.В. Пинягина
При щелчке на кнопке "отправить" будет вызываться тот же сценарий
reg.asp, в который передаются все значения полей этой формы, включая
скрытое поле с именем type и значением 1. Это скрытое поле нужно для того,
чтобы при первой загрузке формы регистрации не выполнялось никаких
проверок. В сценарии проверяется корректность заполнения полей формы:
<%
var
var
var
var
var
var
var
var
var
var
var
type=Request("type");
fam=Request.Form("fam");
im=Request.Form("im");
addr=Request.Form("addr");
mail=Request.Form("mail");
login=Request.Form("login");
pass=0; pass=''+Request.Form("pass");
pass2=0; pass2=''+Request.Form("pass2");
message;
success;
strSQL;
var MyRec=Server.CreateObject("ADODB.Recordset");
// была нажата кнопка "отправить" ?
if(type==1)
{%>
<!-- #include file="connect.asp" -->
<%
// все поля не пустые ?
if(fam!="" && im!="" && addr!="" && mail!="" && login!=""
&& pass!="" && pass2!="")
{
// поля пароля и повтора пароля не совпадают ?
if(!(pass==pass2))
{
message="<tr><td bgcolor='#ff9999' align='center'>
<b>Поля пароля и повтора пароля не совпадают!!!</b>
</td></tr>";
}
else
{
// ищем, нет ли в базе данных пользователя с таким логином
strSQL1="SELECT id_cust FROM customers
WHERE login='"+login+"'";
MyRec.Open(strSQL1, MyCon);
// такой логин уже есть ?
if(!MyRec.EOF)
{
message="<tr><td bgcolor='#ff9999' align='center'>
<b>Такой логин уже существует!!! Выберите другой логин</b>
</td></tr>";
}
58
Разработка электронного магазина на ASP и MS SQL Server
else
{
// создаем нового пользователя
strSQL1="INSERT INTO customers
(fam, im, addr, mail, login, pass)
VALUES('"+fam+"','"+im+"','"+addr+"','"+
mail+"','"+login+"','"+pass+"')";
MyCon.Execute(strSQL1);
message="<tr><td bgcolor='#66cc66' align='center'>
<b>Вы успешно зарегистрированы</b></td></tr>";
success=true;
}
}
}
else
message="<tr><td bgcolor='#ff9999' align='center'>
<b>Не все поля заполнены!!!</b></td></tr><td>";
}
%>
В том случае, если пользователь заполнил форму с какими-либо ошибками,
она снова выводится на экран для корректировки этих ошибок:
<form action=reg.asp method=post>
<tr><td>
<table border="0" width="100%" align="right" >
<tr><td align="right"><i>Фамилия: </i></td>
<td><input type=text name=fam value="<%=fam%>"></td></tr>
<tr><td align="right"><i>Имя: </i></td>
<td><input type=text name=im value="<%=im%>"></td></tr>
<tr><td align="right"><i>Адрес: </i></td>
<td><input type=text name=addr value="<%=addr%>"></td></tr>
<tr><td align="right"><i>E-mail: </i></td>
<td><input type=text name=mail value="<%=mail%>"></td></tr>
<tr><td align="right"><i>Логин: </i></td>
<td><input type=text name=login value="<%=login%>"></td></tr>
<tr><td align="right"><i>Пароль: </i></td>
<td><input type=password name=pass value=""></td></tr>
<tr><td align="right"><i>Повтор пароля: </i></td>
<td><input type=password name=pass2 value=""></td></tr>
<input type=hidden value=1 name=type>
<tr><td align="right"></td>
<td><input type=submit value="отправить"></td></tr>
</table>
</form>
Полностью код сценария приведен в Приложении.
59
О.В. Пинягина
Авторизация
Вспомним схему 6 со стр. 9 – авторизация покупателя. Для
посетителей, зарегистрированных в нашем магазине, в дальнейшем не
требуется заново вводить информацию о себе – достаточно просто набрать
логин и пароль, т.е., авторизоваться. Для авторизации предназначена форма
рядом с логотипом магазина. При нажатии на кнопку "ok" вызывается
сценарий auto.asp, в котором проверяется корректность введенных логина и
пароля.
Схема 6. Авторизация
Покупатель
Главное меню
Форма
авторизации
Успешная
авторизация
Неуспешная
авторизация
Просмотр и
корректировка
личных данных
<%
var MyRec=Server.CreateObject("ADODB.Recordset");
var login=Request.Form("login");
var pass=Request.Form("pass");
var strSQL1="SELECT * FROM customers WHERE login='"+login+"' AND
pass='"+pass+"'";
var message;
var success;
MyRec.Open(strSQL1, MyCon);
if(!MyRec.EOF)
{
Response.Cookies("log")=MyRec("fam")+" "+MyRec("im");
Response.Cookies("id")=MyRec("id_cust");
message="<tr><td bgcolor='#66cc66' align='center'>
60
Разработка электронного магазина на ASP и MS SQL Server
<b>Вы успешно авторизованы</b></td></tr>";
success=true;
}
else
{
message="<tr><td bgcolor='#ff9999' align='center'>
<b>Таких логина/ пароля не существует!!!</b></td></tr>";
}
%>
<!-- #include file="header.asp" -->
<%=message%>
Если данные введены неверно, пользователь получит сообщение об
ошибке:
Обратите внимание, что в случае успешной авторизации создаются
ключики с именами id (идентификатор) и log (фамилия, имя). Содержимое
ключика log будет в дальнейшем выводиться под формой авторизации, а
значение ключика id будет нужно для оформления заказа.
В случае успешной авторизации пользователь также получает
возможность откорректировать информацию о себе:
<form action=change.asp method=post>
<tr><td>
<table border="0" width="100%" align="right" >
<tr><td align="right"><i>Фамилия: </i></td><td>
<input type=text name=fam value="<%=MyRec("fam")%>"></td></tr>
<tr><td align="right"><i>Имя: </i></td><td>
<input type=text name=im value="<%=MyRec("im")%>"></td></tr>
<tr><td align="right"><i>Адрес: </i></td><td>
<input type=text name=addr value="<%=MyRec("addr")%>">
</td></tr>
<tr><td align="right"><i>E-mail: </i></td><td>
61
О.В. Пинягина
<input type=text name=mail value="<%=MyRec("mail")%>">
</td></tr>
<input type=hidden value=<%=MyRec("id_cust")%> name=id_cust>
<tr><td align="right"></td>
<td><input type=submit value="сохранить"></td></tr>
</table>
</form>
При нажатии на кнопку "сохранить" вызывается сценарий change.asp,
в котором производится изменение личных данных пользователя:
<%
var
var
var
var
var
var
MyRec=Server.CreateObject("ADODB.Recordset");
fam=Request.Form("fam");
im=Request.Form("im");
addr=Request.Form("addr");
mail=Request.Form("mail");
id_cust=Request.Form("id_cust");
if(fam!="" && im!="" && addr!="" && mail!="")
{
var strSQL1="UPDATE customers SET fam='"+fam+"',im='"+
im+"',addr='"+addr+"', mail='"+mail+
"' WHERE id_cust="+id_cust;
MyRec.Open(strSQL1,MyCon);
Response.Cookies("log")=fam+" "+im;
// создадим временный ключик
message="<tr><td bgcolor='#66cc66' align='center'>
<b>Изменения данных выполнены</b></td></tr>";
}
else
message="<tr><td bgcolor='#ff9999' align='center'>
62
Разработка электронного магазина на ASP и MS SQL Server
<b>Не все поля заполнены!!!</b></td></tr>";
%>
<!-- #include file="header.asp" -->
<%=message%>
<!-- #include file="footer.asp" -->
Далее пользователь сможет оформить заказ, а также продолжать работу
с корзиной и просмотр каталога.
Когда пользователь захочет выйти из магазина, ему следует щелкнуть
по гиперссылке "Выход". При этом будет вызван сценарий exit.asp,
основное действие которого заключается в уничтожении ключиков,
связанных с логином и идентификатором пользователя. Обратите внимание,
что задается уже прошедший момент времени. Затем переадресуем браузер
на главную страницу.
<%
var d = new Date();
var s;
d.setTime(d.getTime()-1000);
s=""+d.getDate()+"."+(d.getMonth()+1)+"."+d.getYear()+"
"+d.getHours()+":"+d.getMinutes();
Response.Cookies("id")=1;
Response.Cookies("id").Expires=s;
Response.Cookies("log")=1;
Response.Cookies("log").Expires=s;
Response.Redirect("index.asp");
%>
Полностью коды сценариев приведены в Приложении.
63
О.В. Пинягина
Этап 7. Разработка системы заказа
Вспомним схему 4 со стр. 8 – действия с заказом.
Схема 4. Работа с заказом
Покупатель
Главное меню
Просмотр
корзины
Просмотр
заказа
Оформление
заказа
Когда пользователь решился совершить покупку, он должен выбрать
пункт меню "Заказ" или щелкнуть по гиперссылке "Оформить заказ" в
корзине. В обоих случаях будет вызван сценарий order.asp, который
позволит покупателю в последний раз проверить состав заказа (уже без
возможности редактирования):
Сценарий представляет собой упрощенную версию сценария
просмотра корзины. В этом сценарии нет ничего нового, поэтому его код мы
здесь не приводим. Полностью код сценария приведен в Приложении.
64
Разработка электронного магазина на ASP и MS SQL Server
При щелчке на гиперссылке "Отправить заказ" будет вызван
сценарий doorder.asp. Здесь прежде всего проверяется. авторизован ли
покупатель:
var log=Request.cookies("log");
if(log=="")
message="<tr><td bgcolor='#ff9999' align='center'>
<b>Вы не авторизованы!!!</b></td></tr>";
В том случае, когда покупатель авторизован, можно оформлять заказ.
Оформление заказа с точки зрения данных заключается в следующих
действиях.
Создается новый заказ для нашего покупателя в таблице Заказ c тем же
кодом, что и корзина:
var order=id_bask;
strSQL="INSERT INTO orders (id_order, date_ord, id_cust)
VALUES ('"+order+"',DATE(),"+id+")";
MyCon.Execute(strSQL);
Выбираются строки из корзины покупателя и переписываются в
таблицу СоставЗаказа:
strSQL="SELECT * FROM basket_books
WHERE id_bask='"+id_bask+"'";
MyRec.Open(strSQL,MyCon);
while (!MyRec.EOF)
{
strSQL="INSERT INTO order_books
(id_order, id_book, kolvo) VALUES
65
О.В. Пинягина
('"+order+"',"+MyRec("id_book")+","
+MyRec("kolvo")+")";
MyCon.Execute(strSQL);
MyRec.MoveNext();
}
Удаляется корзина покупателя:
strSQL="DELETE FROM basket_books
WHERE id_bask='"+id_bask+"'";
MyCon.Execute(strSQL);
Покупателю выдается сообщение об успешной отправке заказа:
Полностью коды сценариев приведены в Приложении.
66
Разработка электронного магазина на ASP и MS SQL Server
Бонус: прайс-лист по издателям в формате XML
Каким образом можно создать следующий прайс-лист по всем книгам,
сгруппированный по издателям, в формате XML? В примере приведен
внешний вид XML-файла в браузере Internet Explorer.
<?xml version="1.0" encoding="windows-1251" ?>
-<прайс-лист>
-<издатель код="2">
BHV
-<книга Автор="Ю. Тихомиров"
Название="Microsoft SQL Server 7.0.
Разработка приложений">
<страниц>150</страниц>
<цена>100</цена>
<категория>Компьютерная литература</категория>
</книга>
-<книга Автор="И. Шапошников"
Название="Справочник web-мастера. XML">
<страниц>298</страниц>
<цена>100</цена>
<категория>Компьютерная литература</категория>
</книга>
-<книга Автор="Ю. Тихомиров"
Название="Microsoft SQL Server 7.0 в подлиннике">
<страниц>530</страниц>
<цена>140</цена>
<категория>Компьютерная литература</категория>
</книга>
</издатель>
<издатель код="5">Que</издатель>
<издатель код="4">Диалог-МИФИ</издатель>
<издатель код="3">ЛОРИ</издатель>
-<издатель код="1">
Питер
-<книга Автор="В. Водолазкий"
Название="Эффективная работа: PHP 4">
<страниц>430</страниц>
<цена>140</цена>
<категория>Компьютерная литература</категория>
</книга>
-<книга Автор="В.Гилмор"
Название="РНР4.Учебный курс">
<страниц>390</страниц>
<цена>140</цена>
<категория>Компьютерная литература</категория>
</книга>
</издатель>
</прайс-лист>
67
О.В. Пинягина
Прежде всего, следует сообщить браузеру, что дальнейший текст
представляет собой XML-документ:
Response.ContentType="text/xml";
Первая строка любого XML-документа имеет стандартный вид и
формируется следующим образом. Здесь мы явно указываем русскую
кодировку Windows для того, чтобы корректно воспринимался русский текст.
Response.write('<?xml version="1.0"
encoding="windows-1251" ?>');
Далее выбираем из базы всех издателей и все книги по каждому
издателю. К выбранным данным добавляем нужные тэги и выводим
результат на печать:
<%
var MyRec1=Server.CreateObject("ADODB.Recordset");
var MyRec2=Server.CreateObject("ADODB.Recordset");
var strSQL, strSQL2;
strSQL1="SELECT * FROM publishers ORDER BY name_publ";
MyRec1.Open(strSQL1, MyCon);
%>
<прайс-лист>
<%while(!MyRec1.EOF)
{
%><издатель код='<%=MyRec1("id_publ")%>'>
<%=MyRec1("name_publ")%>
<%strSQL2="SELECT id_book, author, name_book, pages, price,
name_cat FROM books, categories WHERE
books.id_cat=categories.id_cat AND
books.id_publ="+MyRec1("id_publ");
MyRec2.Open(strSQL2, MyCon);
while(!MyRec2.EOF)
{
%><книга Автор='<%=MyRec2("author")%>'
Название='<%=MyRec2("name_book")%>'>
<страниц><%=MyRec2("pages")%></страниц>
<цена><%=MyRec2("price")%></цена>
<категория><%=MyRec2("name_cat")%></категория>
</книга>
<%MyRec2.MoveNext();
}%>
</издатель>
<%MyRec2.Close();
MyRec1.MoveNext();
68
Разработка электронного магазина на ASP и MS SQL Server
}%>
</прайс-лист>
Полностью код сценария приведен в Приложении.
69
О.В. Пинягина
Некоторые замечания
1. При загрузке некоторых страниц может случиться так, что браузер
не захочет запрашивать страницу у сервера заново, а загрузит результат
предыдущего выполнения того же сценария из собственного временного
хранилища – из так называемого "кэша". Для того чтобы предотвратить такие
ситуации, следует в серверном сценарии выполнить команду:
Response.Expires=0
которая дает браузеру указание не сохранять результаты этой страницы в
кэше. В нашем примере эта команда помещена в верхний шаблон.
2. Любой электронный магазин будет неполным без удобной системы
поиска. Выполнив предыдущие семь заданий, вы уже обладаете всеми
необходимыми знаниями для того, чтобы разработать эту систему
самостоятельно.
3. Для дальнейшего совершенствования вашего магазина есть много
направлений, которые выходят за рамки нашего краткого учебного пособия.
Это и создание интерфейса для администратора, и подключение электронных
платежных систем, и многое-многое другое.
70
Разработка электронного магазина на ASP и MS SQL Server
Приложение. Коды сценариев
Шаблон для заголовка и меню (header.asp)
<%
var id_bask=Request.cookies("id_bask");
var log=Request.cookies("log");
var d = new Date();
var s;
if (id_bask=="")
{
id_bask=d.getTime();
}
d.setTime(d.getTime()+1000*60*60*24*14);
s=""+d.getDate()+"."+(d.getMonth()+1)+"."+d.getYear()+"
"+d.getHours()+":"+d.getMinutes();
Response.Cookies("id_bask")=id_bask;
Response.Cookies("id_bask").Expires=s;
%>
<!DOCTYPE HTML PUBLIC "-//W3C//DTD HTML 4.0 Transitional//EN">
<html>
<head>
<title>КНИЖНЫЙ МАГАЗИН</title>
<meta HTTP-EQUIV="Content-Type" Content="text-html;
charset=windows-1251">
</head>
<body background="EULA.jpg" style="background-repeat:repeat-y"
leftmargin="130" rightmargin="5" bgProperties=fixed>
<table border="0" align="right" width="90%" cellpadding="0"
cellspacing="0">
<tr><td>
<table border="0" align="right" width="100%" >
<tr>
<td align="center" bgcolor="#cccccc">
<form action="auto.asp" method="post">
<table>
<tr><td align="right"><font size=-2>Логин:</font></td><td
align="left"><input type=text style="width:60; height:20;"
name=login></td></tr>
<tr><td align="right"><font size=-2>Пароль:</font></td><td
align="left"><input type=password style="width:60; height:20;"
name=pass>
<input type=submit value=ok style="height:20;"></td></tr>
</table>
<%=log%>
</td>
</form>
71
О.В. Пинягина
<td colspan="4" align="center" bgcolor="#ccccff"><font
face="Arial" size="+3"><i><b>Книжный
магазин</b></i></font></td></tr>
<tr><td align="center" bgcolor="#aaddff" width="20%"><a
href="catalog.asp"><b>Каталог</b></a></td>
<td align="center" bgcolor="#ddaaff" width="20%"><a
href="basket.asp"><b>Корзина</b></a></td>
<td align="center" bgcolor="#aaaaff" width="20%"><a
href="reg.asp"><b>Регистрация</b></a></td>
<td align="center" bgcolor="#ffaaff" width="20%"><a
href="order.asp"><b>Заказ</b></a></td>
<td align="center" bgcolor="#aaffee" width="20%"><a
href="exit.asp"><b>Выход</b></a></td>
</tr>
</table>
</td></tr>
<tr><td align="center" bgcolor=<%=color%>><font face="Arial"
size="+2"><i><%=title%></i></font><br>
</td></tr>
Шаблон для нижней части страницы (footer.asp)
<tr><td><center><hr><br><a href="index.asp">На главную
страницу</a></center></td></tr>
</table>
</body>
</html>
Главная страница (index.asp)
<%@ Language="JScript" %>
<%Response.Expires=0 %>
<%
var title="Welcome!";
var color="#ccccff";
%>
<!-- #include file="header.asp" -->
<tr><td>
<center><h2><font color="#555599"><br>Добро пожаловать в наш
электронный книжный магазин! <br><br>Здесь представлена
литература самых известных российских издательств. Любой
читатель обязательно найдет себе книгу по вкусу! Мы предлагаем
компьютерную литературу, энциклопедии, справочники, самые
известные художественные произведения классиков и современников
и многое-многое другое!</font></h2>
</center>
</td></tr>
<!-- #include file="footer.asp" -->
72
Разработка электронного магазина на ASP и MS SQL Server
Шаблон для подключения к базе данных (connect.asp)
<% var MyCon=Server.CreateObject("ADODB.Connection");
MyCon.Open("books","sa","");
%>
Просмотр списка издателей и категорий (catalog.asp)
<%@ Language="JScript" %>
<%Response.Expires=0 %>
<% var title="Каталог";
var color="#aaddff";
%>
<!-- #include file="header.asp" -->
<!-- #include file="connect.asp" -->
<%
var MyRec1=Server.CreateObject("ADODB.Recordset");
var strSQL1="SELECT * FROM publishers ORDER BY name_publ";
MyRec1.Open(strSQL1, MyCon);
var MyRec2=Server.CreateObject("ADODB.Recordset");
var strSQL2="SELECT * FROM categories ORDER BY name_cat";
MyRec2.Open(strSQL2, MyCon);
%>
<tr><td>
<table border=0 width=100%>
<tr><td width="50%"><center><h3>Издатели</h3></center><ul>
<%
while(!MyRec1.EOF)
{%>
<li><a href="show.asp?type=1&id_publ=
<%=MyRec1("id_publ")%>"><%=MyRec1("name_publ")%></a>
<% MyRec1.MoveNext();
}%>
</ul></td>
<td width="50%"><center><h3>Категории</h3></center><ul>
<%
while(!MyRec2.EOF)
{%>
<li><a href="show.asp?type=2&id_cat=
<%=MyRec2("id_cat")%>"><%=MyRec2("name_cat")%></a>
<% MyRec2.MoveNext();
}%>
</ul></td>
</tr>
</table>
</td></tr>
<!-- #include file="footer.asp" -->
<%
73
О.В. Пинягина
MyRec1.Close(); MyRec2.Close();
MyCon.Close();
MyRec1=null; MyRec2=null;
MyCon=null;
%>
Просмотр списка книг по выбранному издателю или категории
(show.asp)
<%@ Language="JScript" %>
<%Response.Expires=0 %>
<!-- #include file="connect.asp" -->
<%
var color="#fefefe";
var type=Request.QueryString("type");
var MyRec=Server.CreateObject("ADODB.Recordset");
var MyRec2=Server.CreateObject("ADODB.Recordset");
var strSQL, strSQL2;
if (type==1)
{
strSQL="SELECT name_publ FROM publishers WHERE id_publ="+
Request.QueryString("id_publ");
MyRec.Open(strSQL, MyCon);
if(!MyRec.EOF)
title=MyRec("name_publ");
strSQL2="SELECT id_book, image, author, name_book,
books.id_publ, name_publ, pages, price, books.id_cat,
name_cat FROM books, publishers, categories WHERE
books.id_cat=categories.id_cat AND
books.id_publ=publishers.id_publ AND
books.id_publ="+Request.QueryString("id_publ");
}
if (type==2)
{
strSQL="SELECT name_cat FROM categories WHERE id_cat="+
Request.QueryString("id_cat");
MyRec.Open(strSQL, MyCon);
if(!MyRec.EOF)
title=MyRec("name_cat");
strSQL2="SELECT id_book, image, author, name_book,
books.id_publ, name_publ, pages, price, books.id_cat,
name_cat FROM books, publishers, categories WHERE
books.id_cat=categories.id_cat AND
books.id_publ=publishers.id_publ AND
books.id_cat="+Request.QueryString("id_cat");
}
74
Разработка электронного магазина на ASP и MS SQL Server
MyRec2.Open(strSQL2, MyCon);
%>
<!-- #include file="header.asp" -->
<tr><td>
<table border="1" width="100%" align="right" >
<%
while(!MyRec2.EOF)
{%>
<tr>
<td align="center"><img src="images/<%=MyRec2("image")%>"
alt="<%=MyRec2("name_book")%>" border="0">
<center><a href="dobasket.asp?type=1&id_book=
<%=MyRec2("id_book")%>">
<font size=-1>положить в корзину</font></a></center></td>
<td>
<table>
<tr><td align="right"><i>Автор: </i></td>
<td><%=MyRec2("author")%></td></tr>
<tr><td align="right"><i>Название: </i></td>
<td><%=MyRec2("name_book")%></td></tr>
<tr><td align="right"><i>Издательство: </i></td>
<td><a ref="show.asp?type=1&id_publ=<%=MyRec2("id_publ")%>">
<%=MyRec2("name_publ")%></a></td></tr>
<tr><td align="right"><i>Количество страниц: </i></td>
<td><%=MyRec2("pages")%></td></tr>
<tr><td align="right"><i>Цена: </i></td>
<td><%=MyRec2("price")%></td></tr>
<tr><td align="right"><i>Категория: </i></td>
<td><a href="show.asp?type=2&id_cat=<%=MyRec2("id_cat")%>">
<%=MyRec2("name_cat")%></a></td></tr>
</table>
</td>
</tr>
<%MyRec2.MoveNext();
}
MyRec.Close();
MyRec2.Close();
MyCon.Close();
MyRec=null;
MyRec2=null;
MyCon=null;
%>
</table>
</td></tr>
<!-- #include file="footer.asp" -->
75
О.В. Пинягина
Просмотр корзины (basket.asp)
<%@ Language="JScript" %>
<%Response.Expires=0 %>
<%
title="Ваша корзина";
color="#ddaaff";
%>
<!-- #include file="header.asp" -->
<!-- #include file="connect.asp" -->
<%
var id_bask=Request.cookies("id_bask");
var strSQL1="SELECT COUNT(*) AS cnt FROM basket_books WHERE
id_bask='"+id_bask+"'";
var MyRec1=Server.CreateObject("ADODB.Recordset");
var MyRec2=Server.CreateObject("ADODB.Recordset");
MyRec1.Open(strSQL1, MyCon);
if(MyRec1("cnt")==0)
{
%>
<tr><td bgcolor='#ff9999' align='center'>
<b>Ваша корзина пуста!</b></td></tr>
<%
}
else
{
strSQL1="SELECT image, author, name_book, pages, price, kolvo,
id_bask, books.id_book FROM books, basket_books WHERE
books.id_book=basket_books.id_book AND id_bask='"+id_bask+"'";
MyRec2.Open(strSQL1, MyCon);
%>
<tr><td colspan="2">
<table border="1" width="100%" align="right" >
<tr><td align="right"><i>Автор: </i></td>
<td align="right"><i>Название: </i></td>
<td align="right"><i>Цена: </i></td>
<td align="right"><i>Количество: </i></td><td></td></tr>
<%
var sum=0;
while(!MyRec2.EOF)
{
%>
<tr>
<td><%=MyRec2("author")%></td>
<td><b><%=MyRec2("name_book")%></b></td>
<td><%=MyRec2("price")%></td>
<td><%=MyRec2("kolvo")%>
<a href="dobasket.asp?type=1&id_book=<%=MyRec2("id_book")%>"
title="Увеличить">[ + ]</a>
76
Разработка электронного магазина на ASP и MS SQL Server
<a href="dobasket.asp?type=2&id_book=<%=MyRec2("id_book")%>"
title="Уменьшить">[ - ]</a></td>
<td> <a href="dobasket.asp?type=3&id_book=
<%=MyRec2("id_book")%>">Удалить</a></td>
</tr>
<%
sum+=MyRec2("price")*MyRec2("kolvo");
MyRec2.MoveNext();
}%>
<tr><td align="right"></td><td align="right">
<i>ИТОГО: </i></td><td align="right"><%=sum%></td>
<td align="right"></td></tr>
</table>
<tr><td>
<center><a href=dobasket.asp?type=4><b>Очистить корзину</b></a>
</center></td></tr>
<tr><td>
<center><a href="order.asp"><b>Оформить заказ</b></a>
</center></td></tr>
<%
}
%>
<!-- #include file="footer.asp" -->
Действия с корзиной (dobasket.asp)
<%@ Language="JScript" %>
<%Response.Expires=0 %>
<!-- #include file="connect.asp" -->
<%
var
var
var
var
var
id_bask=Request.Cookies("id_bask");
type=Request.QueryString("type");
id_book=Request.QueryString("id_book");
strSQL;
MyRec=Server.CreateObject("ADODB.Recordset");
if(type==1) // положить в корзину
{
strSQL="SELECT * FROM basket_books WHERE
id_book="+id_book+" AND id_bask='"+id_bask+"'";
MyRec.Open(strSQL, MyCon);
if (!MyRec.EOF)
{
strSQL="UPDATE basket_books SET kolvo=kolvo+1
WHERE id_book="+id_book+" AND id_bask='"+id_bask+"'";
}
else
{
77
О.В. Пинягина
strSQL="INSERT INTO basket_books
(id_bask, id_book, kolvo)
VALUES ('"+id_bask+"',"+id_book+",1)";
}
MyCon.Execute(strSQL);
MyRec.close();
}
else
if(type==2) // уменьшить количество
{
strSQL="SELECT * FROM basket_books WHERE
id_book="+id_book+" AND id_bask='"+id_bask+"'";
MyRec.Open(strSQL, MyCon);
if (!MyRec.EOF)
{
if (MyRec("kolvo")>1)
{
strSQL="UPDATE basket_books SET kolvo=kolvo-1
WHERE id_book="+id_book+" AND id_bask='"+id_bask+"'";
}
else
{
strSQL="DELETE FROM basket_books WHERE
id_book="+id_book + " AND id_bask='"+id_bask+"'";
}
}
MyCon.Execute(strSQL);
MyRec.close();
}
else
if(type==3) // удалить из корзины
{
strSQL="DELETE FROM basket_books WHERE id_book="+id_book+
" AND id_bask='"+id_bask+"'";
MyCon.Execute(strSQL);
}
else
if(type==4) // очистить корзину
{
strSQL="DELETE FROM basket_books WHERE
id_bask='"+id_bask+"'";
MyCon.Execute(strSQL);
}
Response.Redirect("basket.asp");
%>
Регистрация (reg.asp)
<%@ Language="JScript" %>
<%Response.Expires=0 %>
78
Разработка электронного магазина на ASP и MS SQL Server
<%
var
var
var
var
var
var
var
var
var
var
var
var
var
title="Регистрация";
color="#aaaaff";
type=Request("type");
fam=Request.Form("fam");
im=Request.Form("im");
addr=Request.Form("addr");
mail=Request.Form("mail");
login=Request.Form("login");
pass=0; pass=''+Request.Form("pass");
pass2=0; pass2=''+Request.Form("pass2");
message;
success;
strSQL;
var MyRec=Server.CreateObject("ADODB.Recordset");
// была нажата кнопка "отправить" ?
if(type==1)
{%>
<!-- #include file="connect.asp" -->
<%
// все поля не пустые ?
if(fam!="" && im!="" && addr!="" && mail!="" && login!=""
&& pass!="" && pass2!="")
{
// поля пароля и повтора пароля не совпадают ?
if(!(pass==pass2))
{
message="<tr><td bgcolor='#ff9999' align='center'>
<b>Поля пароля и повтора пароля не
совпадают!!!</b></td></tr>";
}
else
{
// ищем, нет ли в базе данных пользователя с таким логином
strSQL1="SELECT id_cust FROM customers
WHERE login='"+login+"'";
MyRec.Open(strSQL1, MyCon);
// такой логин уже есть ?
if(!MyRec.EOF)
{
message="<tr><td bgcolor='#ff9999' align='center'>
<b>Такой логин уже существует!!! Выберите другой логин</b>
</td></tr>";
}
else
{
// создаем нового пользователя
strSQL1="INSERT INTO customers
(fam, im, addr, mail, login, pass)
VALUES('"+fam+"','"+im+"','"+addr+"','"+
79
О.В. Пинягина
mail+"','"+login+"','"+pass+"')";
MyCon.Execute(strSQL1);
message="<tr><td bgcolor='#66cc66' align='center'>
<b>Вы успешно зарегистрированы</b></td></tr>";
success=true;
}
}
}
else
message="<tr><td bgcolor='#ff9999' align='center'>
<b>Не все поля заполнены!!!</b></td></tr><td>";
}
%>
<!-- #include file="header.asp" -->
<%=message%>
<%
if(!success)
{
%>
<form action=reg.asp method=post>
<tr><td>
<table border="0" width="100%" align="right" >
<tr><td align="right"><i>Фамилия: </i></td>
<td><input type=text name=fam value="<%=fam%>"></td></tr>
<tr><td align="right"><i>Имя: </i></td>
<td><input type=text name=im value="<%=im%>"></td></tr>
<tr><td align="right"><i>Адрес: </i></td>
<td><input type=text name=addr value="<%=addr%>"></td></tr>
<tr><td align="right"><i>E-mail: </i></td>
<td><input type=text name=mail value="<%=mail%>"></td></tr>
<tr><td align="right"><i>Логин: </i></td>
<td><input type=text name=login value="<%=login%>"></td></tr>
<tr><td align="right"><i>Пароль: </i></td>
<td><input type=password name=pass value=""></td></tr>
<tr><td align="right"><i>Повтор пароля: </i></td>
<td><input type=password name=pass2 value=""></td></tr>
<input type=hidden value=1 name=type>
<tr><td align="right"></td>
<td><input type=submit value="отправить"></td></tr>
</table>
</form>
</td></tr>
<%
}
%>
<!-- #include file="footer.asp" -->
80
Разработка электронного магазина на ASP и MS SQL Server
Авторизация (auto.asp)
<%@ Language="JScript" %>
<%Response.Expires=0 %>
<%
var title="Авторизация";
var color="#aaaaff";
%>
<!-- #include file="connect.asp" -->
<%
var MyRec=Server.CreateObject("ADODB.Recordset");
var login=Request.Form("login");
var pass=Request.Form("pass");
var strSQL1="SELECT * FROM customers WHERE login='"+login+"' AND
pass='"+pass+"'";
var message;
var success;
MyRec.Open(strSQL1, MyCon);
if(!MyRec.EOF)
{
Response.Cookies("log")=MyRec("fam")+" "+MyRec("im");
Response.Cookies("id")=MyRec("id_cust");
message="<tr><td bgcolor='#66cc66' align='center'>
<b>Вы успешно авторизованы</b></td></tr>";
success=true;
}
else
{
message="<tr><td bgcolor='#ff9999' align='center'>
<b>Таких логина/ пароля не существует!!!</b></td></tr>";
}
%>
<!-- #include file="header.asp" -->
<%=message%>
<%
if(success)
{
%>
<form action=change.asp method=post>
<tr><td>
<table border="0" width="100%" align="right" >
<tr><td align="right"><i>Фамилия: </i></td><td>
<input type=text name=fam value="<%=MyRec("fam")%>"></td></tr>
<tr><td align="right"><i>Имя: </i></td><td>
<input type=text name=im value="<%=MyRec("im")%>"></td></tr>
<tr><td align="right"><i>Адрес: </i></td><td>
<input type=text name=addr value="<%=MyRec("addr")%>">
</td></tr>
<tr><td align="right"><i>E-mail: </i></td><td>
<input type=text name=mail value="<%=MyRec("mail")%>">
81
О.В. Пинягина
</td></tr>
<input type=hidden value=<%=MyRec("id_cust")%> name=id_cust>
<tr><td align="right"></td>
<td><input type=submit value="сохранить"></td></tr>
</table>
</form>
</td></tr>
<%
}
MyRec.close();
MyCon.close();
%>
<!-- #include file="footer.asp" -->
Изменение личных данных (change.asp)
<%@ Language="JScript" %>
<%Response.Expires=0 %>
<%
var title="Регистрация";
var color="#aaaaff";
%>
<!-- #include file="connect.asp" -->
<%
var MyRec=Server.CreateObject("ADODB.Recordset");
var fam=Request.Form("fam");
var im=Request.Form("im");
var addr=Request.Form("addr");
var mail=Request.Form("mail");
var id_cust=Request.Form("id_cust");
if(fam!="" && im!="" && addr!="" && mail!="")
{
var strSQL1="UPDATE customers SET fam='"+fam+"',im='"+
im+"',addr='"+addr+"', mail='"+mail+
"' WHERE id_cust="+id_cust;
MyRec.Open(strSQL1,MyCon);
Response.Cookies("log")=fam+" "+im;
// создадим временный ключик
message="<tr><td bgcolor='#66cc66' align='center'>
<b>Изменения данных выполнены</b></td></tr>";
}
else
message="<tr><td bgcolor='#ff9999' align='center'>
<b>Не все поля заполнены!!!</b></td></tr>";
%>
<!-- #include file="header.asp" -->
<%=message%>
<!-- #include file="footer.asp" -->
82
Разработка электронного магазина на ASP и MS SQL Server
Выход – отмена авторизации (exit.asp)
<%@ Language="JScript" %>
<%Response.Expires=0 %>
<%
var d = new Date();
var s;
d.setTime(d.getTime()-1000);
s=""+d.getDate()+"."+(d.getMonth()+1)+"."+d.getYear()+"
"+d.getHours()+":"+d.getMinutes();
Response.Cookies("id")=1;
Response.Cookies("id").Expires=s;
Response.Cookies("log")=1;
Response.Cookies("log").Expires=s;
Response.Redirect("index.asp");
%>
Просмотр заказа (order.asp)
<%@ Language="JScript" %>
<%Response.Expires=0 %>
<%
var title="Ваш заказ";
var color="#ffaaff";
%>
<!-- #include file="header.asp" -->
<!-- #include file="connect.asp" -->
<%
var id_bask=Request.cookies("id_bask");
var MyRec=Server.CreateObject("ADODB.Recordset");
var strSQL;
var strSQL="SELECT COUNT(*) as cnt FROM basket_books WHERE
id_bask='"+id_bask+"'";
MyRec.Open(strSQL, MyCon);
if(MyRec("cnt")==0)
{
%>
<tr><td bgcolor='#ff9999' align='center'>
<b>Ваша корзина пуста!</b></td></tr>
<%
}
else
{
strSQL="SELECT image, author, name_book, pages, price, kolvo,
id_bask, books.id_book FROM books, basket_books WHERE
books.id_book=basket_books.id_book AND id_bask='"+id_bask+"'";
MyRec.Close();
MyRec.Open(strSQL, MyCon);
%>
<tr><td>
<table border="1" width="100%" align="right" >
83
О.В. Пинягина
<tr><td align="right"><i>Автор: </i></td><td
align="right"><i>Название: </i></td>
<td align="right"><i>Цена: </i></td><td
align="right"><i>Количество: </i></td><td></td></tr>
<%
var sum=0;
while(!MyRec.EOF)
{
%>
<tr>
<td><%=MyRec("author")%></td>
<td><b><%=MyRec("name_book")%></b></td>
<td><%=MyRec("price")%></td>
<td><%=MyRec("kolvo")%></td>
</tr>
<%sum+=MyRec("price")*MyRec("kolvo");
MyRec.MoveNext();
}%>
<tr><td align="right"></td>
<td align="right"><i>ИТОГО: </i></td>
<td align="right"><%=sum%></td><td align="right"></td></tr>
</table>
<tr><td><center><a href=doorder.asp>
<b>Отправить заказ</b></a></center></td></tr>
<%
}
%>
<!-- #include file="footer.asp" -->
Отправка заказа (doorder.asp)
<%@ Language="JScript" %>
<%Response.Expires=0 %>
<%
var title="Ваш заказ";
var color="#ffaaff";
%>
<!-- #include file="connect.asp" -->
<%
var MyRec=Server.CreateObject("ADODB.Recordset");
var id_bask=Request.cookies("id_bask");
var id=Request.cookies("id");
var log=Request.cookies("log");
var message;
if(log=="")
message="<tr><td bgcolor='#ff9999' align='center'>
<b>Вы не авторизованы!!!</b></td></tr>";
else
84
Разработка электронного магазина на ASP и MS SQL Server
{
var strSQL="SELECT COUNT(*) as cnt FROM basket_books
WHERE id_bask='"+id_bask+"'";
MyRec.Open(strSQL,MyCon);
if(MyRec("cnt")==0)
message="<tr><td bgcolor='#ff9999' align='center'>
<b>Ваша корзина пуста!</b></td></tr>";
else
{
var order=id_bask;
strSQL="INSERT INTO orders (id_order, date_ord, id_cust)
VALUES ('"+order+"',DATE(),"+id+")";
MyCon.Execute(strSQL);
strSQL="SELECT * FROM basket_books
WHERE id_bask='"+id_bask+"'";
MyRec.Close();
MyRec.Open(strSQL,MyCon);
while (!MyRec.EOF)
{
strSQL="INSERT INTO order_books
(id_order, id_book, kolvo) VALUES
('"+order+"',"+MyRec("id_book")+","
+MyRec("kolvo")+")";
MyCon.Execute(strSQL);
MyRec.MoveNext();
}
strSQL="DELETE FROM basket_books
WHERE id_bask='"+id_bask+"'";
MyCon.Execute(strSQL);
message="<tr><td bgcolor='#66cc66' align='center'>
<b>Ваш заказ отправлен</b></td></tr>";
}
}
%>
<!-- #include file="header.asp" -->
<%=message%>
<!-- #include file="footer.asp" -->
Прайс-лист в формате XML (price.asp)
<%@ Language="JScript" %>
<%Response.Expires=0 %>
<!-- #include file="connect.asp" -->
<%
var MyRec1=Server.CreateObject("ADODB.Recordset");
var MyRec2=Server.CreateObject("ADODB.Recordset");
var strSQL, strSQL2;
Response.ContentType="text/xml";
85
О.В. Пинягина
Response.write('<?xml version="1.0" encoding="windows-1251"
?>');
strSQL1="SELECT * FROM publishers ORDER BY name_publ";
MyRec1.Open(strSQL1, MyCon);
%>
<прайс-лист>
<%while(!MyRec1.EOF)
{
%><издатель код='<%=MyRec1("id_publ")%>'>
<%=MyRec1("name_publ")%>
<%strSQL2="SELECT id_book, author, name_book, pages, price,
name_cat FROM books, categories WHERE
books.id_cat=categories.id_cat AND
books.id_publ="+MyRec1("id_publ");
MyRec2.Open(strSQL2, MyCon);
while(!MyRec2.EOF)
{
%><книга Автор='<%=MyRec2("author")%>'
Название='<%=MyRec2("name_book")%>'>
<страниц><%=MyRec2("pages")%></страниц>
<цена><%=MyRec2("price")%></цена>
<категория><%=MyRec2("name_cat")%></категория>
</книга>
<%MyRec2.MoveNext();
}%>
</издатель>
<%MyRec2.Close();
MyRec1.MoveNext();
}%>
</прайс-лист>
<%
MyRec1.close();
MyCon.close();
%>
Литература
1. С. Спейнаур, В. Куэрсиа, Справочник web-мастера: Пер. с англ. – Киев:
BHV, 1997. – 368 c.
2. В. Пирогов, MS SQL Server 2000: управление и программирование. –
СПб.: BHV-Петербург, 2005. – 608 c.
86
Download