ASP на блюдечке. Часть 1. Построение интерфейса к Базе Данных
 

Ты никогда не будешь знать достаточно,
если не будешь знать больше, чем достаточно.
Уильям Блейк

Введение

Еще совсем недавно, когда Интернет являл собой лишь роскошь для избранных, профессия разработчика интерактивных Web-приложений была сродни профессии шофера в начале XX века или космонавта — в середине века. Как и в большинстве профессий, поначалу был просто врач, просто инженер, просто разработчик гипертекстовых страниц. В настоящее время уже довольно сложно разобраться во всевозможных профессиях, связанных с Интернетом, и инструментах для решения самых различных Интернет-задач. Давайте попробуем разобраться в этом пестром мире средств, служащих в конечном счете для нас с вами — читателей занимательных, ярких и разнообразных страниц всемирной компьютерной сети, и рассмотрим одно из них — ASP.

Настоящая статья — попытка собрать воедино весь инструментарий, необходимый и достаточный для построения простейшего Web-интерфейса к базам данных. И хотя для простоты изложения и понимания материала рассматриваются примеры по работе с базами данных MS-Access, тем не менее, освоив их, для читателя не составит труда перейти к созданию аналогичных интерфейсов к другим базам.

Статья адресована начинающим Web-программистам, профессионалам же будет достаточно беглого взгляда, чтобы понять принципы и вникнуть в детали работы активных серверных страниц — ASP.

Немного истории

Итак, проведем небольшой экскурс в историю развития и становления средств разработки содержания (content) и поведения (behavior) Всемирной паутины.

HTML (HyperText Markup Language)

HTML — язык разметки гипертекста — является приложением языка SGML (Standard Generalized Markup Language) — стандартный обобщенный язык разметки. Средствами HTML задаются синтаксис и размещение специальных встроенных указаний, в соответствии с которыми браузер отображает содержимое документа (текст, графика, мультимедиа, гиперссылки).

Базовый синтаксис HTML определяется стандартом HTML.

Говоря другими словами, HTML — язык компоновки документов и спецификации гиперссылок, используемый для кодировки документов в WWW.

Было время, когда знание HTML могло считаться необходимым и достаточным для владения профессией разработчика Web-страниц. Теперь же это только база — необходимая, но далеко не достаточная для создания подлинного интерактива (взаимодействия с читателем).

<html>
---------------------
<head>
<title> Заголовок HTML документа </title>
</head>
---------------------
<body>
Тело HTML документа
</body>
---------------------
</html>

Простой HTML-документ

С течением времени страницы Всемирной компьютерной сети постепенно начали «оживать», если выражаться пользовательской терминологией, а по сути произошел переход от структурного предъявления гипертекстовой информации к событийному. Если быть точнее, то переходом это в полной мере называть нельзя, попросту HTML обогатился средствами динамической интерпретации, или Dynamic HTML (DHTML — Dynamic HiperText Markup Language).

DHTML (Dynamic HyperText Markup Language)

До недавнего времени информация в большинстве Web-документов была статической, что требовало реакции сервера на действия пользователя. С введением DHTML парадигма Web сместилась от взаимодействия с сервером в сторону создания интерактивных Web-узлов и Web-приложений. Основной отличительной особенностью DHTML от HTML является возможность взаимодействия DHTML-документов с пользователем на клиентском компьютере, что в значительной степени обогащает возможности создаваемых с их помощью Web-страниц и Web-приложений и в то же время сводит часть взаимодействия пользователя с сервером к взаимодействию пользователя с DHTML-документом. Таким образом, можно говорить о перенесении некоторой доли вычислений с серверной на клиентскую сторону, что, разумеется, сокращает объем передаваемой информации от клиента серверу и обратно и экономит время. Как следствие, страницы, разработанные с использованием модели DHTML, в отличие от HTML, работают значительно быстрее именно за счет снижения объема информации, передаваемой от клиента (браузера) серверу и обратно.

Языки сценариев (JavaScript и VBScript)

Введя понятие DHTML, необходимо поговорить о языках создания сценариев событий HTML-документов. Для начала давайте определим понятие «сценарий». Итак, сценарий, в отличие от программы, имеет лишь одно направление выполнения — сверху вниз, именно поэтому, говоря о сценариях, встроенных в HTML-документы, не следует забывать о строгом порядке, в котором браузер формирует содержимое страницы.

Компания Netscape разработала язык создания сценариев JavaScript, а компания Microsoft — VBScript. Эти языки используются на стороне клиента, то есть генерируют объекты на основании HTML-страницы на стороне клиента в окне его браузера.

<!-- Here Script starts -->
 
<SCRIPT LANGUAGE="javascript">
 
function RunningTime() {
var RightNow = new Date()
var ampm = RightNow.getHours()
 
if (ampm >= 12) {nampm = "PM"}
else {nampm = "AM"}
 
var hr = RightNow.getHours()
if (hr > 12) {nhr = hr -12}
else {nhr = hr}
 
if (hr == 0) {nhr = "12"}
else {nhr = nhr}
 
var min = RightNow.getMinutes()
if (min < 10) {nmin = "0" +min}
else {nmin = min}
 
var sec = RightNow.getSeconds() +1
if (sec < 10) {nsec = "0" +sec}
else {nsec = sec}
 
if (nsec >= 60) {nnsec = "00"}
else {nnsec = nsec}
 
var printIt = "Time: " +nhr+ ":" 
+nmin+":" +nnsec+ ":" +nampm
document.clock.clockface.value = printIt
var KeepItGoing=setTimeout("RunningTime()","1000")
}
</SCRIPT>
<!-- End of the script -->
 
<FORM NAME="clock">
<INPUT TYPE="text" name="clockface">
<INPUT TYPE="button" VALUE="Get the Time" 
onClick="RunningTime()">
</FORM>

Пример весьма полезного JavaScript сценария

Технологии Java и CGI

В 1994 году специалистами компании Sun Microsystems была разработана технология создания динамических интерактивных Web-страниц — Java. Программы на языке Java называются аплетами (little applications).

Аплеты пишутся на Java и посылаются по Web как HTML-файлы браузеру, где выполняются как HTML-документы. Существенным преимуществом Java является независимость программ от платформ, на которых программы выполняются. Хотя Java не обязательно выполняется в окне браузера, возможно создание независимых (stand-alone) Java-приложений, которые могут выполняться на компьютере независимо от Интернета.

Фактически программа на языке Java транслируется компилятором в специальный код, называемый байтовым (bytecode), а затем выполняется уже с помощью интерпретатора языка Java. Такое «разделение обязанностей» и позволяет обеспечивать полную независимость Java-кода от конечной платформы, на которой он будет выполняться. Разумеется, для каждой конкретной платформы имеется свой интерпретатор языка, называемый виртуальной машиной Java (Java Virtual Machine).

<applet code="HelloWorld.class" width=150 height = 75>
Если Вы видите это сообщение, Ваш браузер не имеет поддержки Java.
</applet>
Исходный текст класса "HelloWorld.java" 
(компилируется в "HelloWorld.class"):
import java.applet.*;
import java.awt.*;
public class HelloWorld extends Applet
{ public void paint(Graphics g) {
g.drawString("Приветы всем!", 10, 70);
}

Много полезных Java-аплетов лежат здесь.

Сайт языка Java компании Sun Microsystem's: http://java.sun.com/.

Схема исполнения аплетов коренным образом отличается от схемы выполнения CGI-скриптов. Последние, в частности, выполняются на стороне сервера, в отличие от Java-аплетов, которые выполняются, как правило, на стороне клиента.

Что же такое CGI (Common Gateway Interface), или интерфейс общего шлюза?

По сути CGI — способ взаимодействия Web-программ с браузером пользователя. Поэтому под CGI-программами понимают программы, написанные на любом языке программирования, способного выполняться на Web-сервере, включая C, C++, Visual Basic или даже командные языки операционных сред (например, C Shell). Но большинство CGI-программ пишется на языке Perl.

Perl (Practical Extraction and Report Language) является одним из наиболее гибких языковых средств, служащих для программирования интерфейсов CGI. Изначально Perl предназначался для обработки больших объемов данных и генерации отчетов по обработке этих данных (как явствует из его названия). За последние несколько лет Perl превратился в полнофункциональный язык программирования. Изначально созданный исключительно для работы под управлением операционных систем семейства UNIX, Perl теперь совместим с такими ОС, как Amiga, MS-DOS, OS/2 Warp, VMS, Windows NT, Window 95 и Macintosh.

ASP и PHP

В последнее время все большую популярность получают эти два средства создания интерактивных Web-страниц. Основным их достоинством является возможность формирования страниц на основании интерактива «клиент-сервер». Сами же программы, написанные на ASP (Active Server Pages — активные серверные страницы) и PHP (Personal Home Page), настолько просты, что программирование с их помощью доступно даже неискушенным.

<? php 
  if ( strstr ( $HTTP_USER_AGENT, "MSIE" ) )  {
  ?>
  <center><b>You are 
  using Internet Explorer</b></center>
  <?
  } else {
  ?>
  <center><b>You are not 
  using Internet Explorer</b></center>
  <?
  }
  ?>

Пример PHP кода определяющего версию браузера

PHP часто еще называют препроцессором гипертекста (Hypertext Preprocessor). По сути PHP серверный (выполняющийся на стороне сервера) мультиплатформный язык описания сценариев, встраиваемый непосредственно в HTML-код. В настоящее время PHP интенсивно используют более полумиллиона доменов Всемирной компьютерной сети, он распространяется на правах freeware и его можно свободно скачать с сайта разработчика http://www.php.net/. Основу синтаксиса PHP составляют язык программирования C, Java и Perl. Целью создания языка является разработка динамически генерируемых страниц в кратчайшие сроки.

Например, если Вы создаете online-каталог, вам скорее всего понадобится разрабатывать не сами HTML-страницы, а их шаблоны, по которым PHP будет формировать HTML-страницы исходя из ваших потребностей. Традиционно этот колоссальный объем работы выполняется вручную. С помощью PHP гораздо проще организовать интерфейс к базе данных и динамическое формирование страниц.

Несмотря на то что PHP — прекрасная альтернатива ASP, мы остановимся на последнем. Сравнивая эти два средства, решающие по сути схожие задачи, следует отметить переносимость первого (PHP) в отличие от второго (ASP) и специальную «заточку» ASP под создание гибких и удобных интерфейсов к базам данных. Это включает использование ActiveX Data Objects (ADO). Колоссальная поддержка структурированного языка запросов к базам данных SQL является мощнейшим средством, используя которое разработчик может не переучиваясь, работать напрямую с базами данных привычным образом. ASP поддерживает работу со всеми базами данных, соответствующими стандарту ODBC.

Говоря простыми словами, Active Server Pages — это обычные страницы, которые содержат скрипты, выполняющиеся на сервере наряду с обычным HTML-кодом (если вы посмотрите на строку адреса в окне браузера, то заметите довольно часто встречающееся расширение .asp). Если вы когда-нибудь программировали на Perl, то начать писать на ASP не составит для вас труда, ведь принцип почти один и тот же: после того как «серверный» код обработан сервером, результирующая страница, содержащая только клиентский код (HTML, JavaScript, VBScript), посылается клиенту. Код, выполнявшийся на стороне сервера, увидеть в окне браузера невозможно — вы видите лишь результат его работы.

ASP работает как под управлением Windows NT-сервера (необходимо установить Windows NT Server и Web-сервер с поддержкой ASP — Microsoft's Internet Information Server [IIS]), так и под управлением других операционных систем. В последнее время компания Chili!Soft разработала версии ASP для следующих операционных систем:

  • Linux (Red Hat Linux 6.2, 6.1, Suse Linux 6.4, Linux-Mandrake 7.0, Slackware Linux 7.0)
  • Windows NT
  • Solaris (Solaris 2.7, Solaris 2.6, 2.5.1)
  • AIX
  • HP-UX

ASP становится совместимым со все большим числом операционных систем.

<%@ LANGUAGE="VBSCRIPT" %>
  <HTML>
  <HEAD>
  <TITLE>ASP test</TITLE>
  </HEAD>
  <BODY>
  <%= "Good day! It is now " & time %>
  </BODY>
  </HTML>

Еще пару лет назад процесс программирования Web-серверов был отнюдь не тривиальной задачей. Написание CGI (Common Gateway Interface)-программ требовало особой осторожности и весьма высокой квалификации от программистов и администраторов, возникали сложности при отладке большинства приложений написанных на C, C++ или Perl. Когда компания Microsoft выпустила 3-ю версию своего Web-сервера (Internet Information Server), в начале 1997 года был создан принципиально новый метод написания серверных приложений.

Зачем нужен ASP

Активные серверные страницы (Active Server Pages) и HTML взаимодействуют с базами данных совершенно по-разному. Принципиальное отличие состоит в том, что на HTML-странице строка с директивой, осуществляющей прямое соединение с базой данных, расположена непосредственно в исходном коде страницы в окне браузера на стороне клиента. В ASP-странице она заменена переменной Web-приложения, которая определена в специальном файле global.asa и доступна всем ASP-страницам Web-приложения.

Чем отличается ASP от других CGI

Как известно, CGI обеспечивает способ, посредством которого Web-браузер осуществляет запуск Web-приложения на стороне сервера, результатом работы которого является HTML-страница, посылаемая клиенту. Всякий раз, когда клиент инициирует выполнение CGI-приложения, Web-сервер выполняет отдельную его копию (instance). Проблема заключается в том, что для каждого запроса клиента запускается копия Web-приложения на сервере, что резко сокращает производительность сервера при больших и средних нагрузках. Совсем иначе обстоят дела в случае использования ASP. Предположим, одно и то же приложение выполняется двумя разными клиентами. Двух приложений не существует, существуют лишь две сессии одного и того же приложения. И всякий раз, когда новым клиентом осуществляется запрос, порождается новая сессия Web-приложения.

ASP позволяет перемешивать HTML-код с программным кодом, что, в свою очередь, позволяет легко и удобно встраивать серверные программы в страницы, причем первые будут выполняться только на стороне сервера. Еще одним мощным средством является поддержка ActiveX, так как ASP является языком, обеспечивающим полную поддержку ActiveX Scripting Interface. Итак...

$BREAK$

Интерфейс к базе данных с помощью ASP

Постановка задачи

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

Для начала давайте все-таки разберемся, что же от нас требуется. По сути, необходимо создать базу данных всех статей, подготовить несколько HTML-форм для загрузки статей на сервер, их поиска, сортировки, удаления и, наконец, отображения результата.

Я почти уверен, что подобная задача актуальна применительно практически к любому сайту, тем более что подобным образом (разве что без возможностей поиска, сортировки и удаления) работает большинство гостевых книг (guestbook).

Что нам понадобится

Для реализации вышеизложенной задачи нам потребуется персональный компьютер с Microsoft Windows NT или Windows 2000 (можно и Workstation, и Server), установленный IIS (Internet Information Server), какой-нибудь HTML-редактор (советую использовать Macromedia Dreamweaver), Microsoft Access (версии 95, 97 или 2000) и самый обычный текстовый редактор.

Создание и подготовка базы данных

Прежде всего создадим базу данных статей, для чего:

  • запустим приложение Microsoft Access;
  • любым из известных способов создадим новую базу данных. Назовем ее «Articles»;
  • в созданной базе данных создадим таблицу с именем, например «Articles»;
  • пользуясь инструментом «Конструктор», определим поля нашей таблицы и типы принимаемых ими значений (рис.1);

    Рис.1.

  • заполним таблицу несколькими статьями в соответствии с созданными полями (рис.2);

    Рис.2.

  • сохраним базу данных в файле «ArticlesDB.mdb».

Далее необходимо прописать нашу базу данных в соответствующем разделе источников данных системы, для этого:

  • запустим программу-конфигуратор источников данных (Data Sources ODBC) — Start->Settings->Control Panel->Administrative Tools->Data Sources ODBC;
  • перейдем во вкладку «System DSN» и создадим новый источник данных, нажав на «Add…»;
  • в появившемся списке драйверов выберем драйвер баз данных Microsoft Access — «Microsoft Access Driver (*.mdb)» и нажмем на «Finish»;
  • в строке «Data Source Name» зададим имя нашей базы данных, например «Articles» (это то имя, по которому мы в дальнейшем будем обращаться к ней);
  • нажмем на «Select…», выберем подготовленный нами файл «ArticlesDB.mdb» и нажмем «OK».

В результате в списке источников данных в вашей системе появится строка, представленная на рис.3.

Рис.3.

Оформляем главную страницу (index.asp)

С ASP работать очень просто. Для этого надо всего лишь вставить текст скрипта ASP в пару тэгов <% %>. В остальном ASP-файл ничем не отличается от HTML-файла (за исключением, пожалуй, расширения). Комментарии в HTML, как известно, вставляются в пару тэгов <!-- текст комментария -->, в ASP же закомментировать строку можно при помощи символа ‘ (апостроф) в ее начале.

<html>
<head>
<title>Наш газетный сайт — первые шаги в ASP</title>
</head>
 
<body>
<center>
 
<!--
… оформление страницы …
… можно показать дату …
-->
Тoday is:
 
<%
D = Date() ‘ Получаем значение текущей даты
D = FormatDateTime(D,2) ‘Преобразуем в нужный формат
Response.Write D ‘Отображаем на экране в текущей позиции
%>
<!--
 
<! -- Определим основные линки -->
<a href="http://localhost/List.asp" 
class="antiLine"> Список статей</a><br>
<a href="http:// localhost /SearchForm.asp" 
class="antiLine"> Поиск статьи</a><br>
<a href="http:// localhost /UploadForm.asp" 
class="antiLine"> Загрузка статьи</a><br>
 
<%
'для соединения с базой данных
'Создаем переменную  ActiveX Data Object 
Set db = Server.CreateObject("ADODB.Connection") 
'открываем нашу базу данных
db.Open "Articles" 
 
'Формируем SQL запрос
sSQL = "SELECT * FROM Articles" 
'и выполняем его, а результат заносим 
‘в переменную rs
Set rs = db.Execute(sSQL) 
 
'Если поле Article не пустое, 
'Link = "<a href= http://localhost/ArtTempl.asp?id=" & 
'то формируем линк на файл с шаблоном
If rs.Fields ("Article").value <> "No Text" Then  
‘HTML и передаем туда параметр
‘с идентификатором статьи из поля ID
rs.Fields("ID").value & ">" & 
rs.Fields("Title").value & "</a>" 
End If
 
‘Отображаем переменную Link
‘Отображаем содержимое поля
Response.Write Link & "<br>" 
Response.Write "<i>By " & 
rs.Fields("Author").value ‘Author
& "</i><br>"
 
ANN = rs.Fields("Annotation").value
‘Отображаем содержимое поля
If ANN <> "NA" Then 
Response.Write ANN ‘Annotation, если оно не пусто
End If
 
db.Close ‘Закрываем базу данных
Set db = Nothing ‘и обнуляем переменную - указатель
%>
 
</center>
</body>
</html>

Теперь давайте разберемся. Во-первых, как вы наверняка заметили, ASP-код легко сочетается с HTML-тэгами; в этом его достоинство. Так, к примеру, строка Response.Write Link & "<br>" отображает на экране браузера клиента подготовленное сервером значение переменной Link и HTML-тэг <br>, то есть перевод строки. Особый интерес вызывает переменная rs. Для искушенных программистов сразу скажу — это указатель. Однако в ASP с целью облегчения работы начинающих указатели маскируются. Здесь не встретишь громоздких С’шных конструкций, типа «я знаю, что ты знаешь, что я знаю», или, выражаясь программистским языком, указатель на указатель… Однако сделано это так искусно, что гибкость программирования при этом не теряется, нет лишь прямой работы с указателями, а только работа с помощью специальных функций, скрывающих от программиста рутину и защищающих указатели от некорректных действий. Таким образом, выражение rs.Fields ("Article").value означает значение поля "Article" текущего значения указателя на элемент базы данных (в нашем случае статей) и содержит текст статьи, которая соответствует текущей позиции указателя на все статьи. Переход к следующему элементу базы (смещение указателя) выполняется с помощью инструкции Rs.MoveNext. В приведенном выше примере это не делается, а попросту формируется ссылка на текст статьи в виде ее названия и отображается комментарий самой первой статьи, соответствующей результату запроса. Давайте попробуем отобразить все статьи нашей базы данных на главной странице в виде HTML. И еще, обратите особое внимание на директиву:

Link = "<a href= http://localhost/ArtTempl.asp?id=" _ 
& rs.Fields("ID").value & ">" _ 
& rs.Fields("Title").value & "</a>"

$BREAK$

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

<%
TheID = Request.QueryString("id")
Set db = Server.CreateObject("ADODB.Connection")
db.Open "Articles"
sSQL = "SELECT * FROM Articles Where ID =" & TheID
Set rs = db.Execute(sSQL)
 
Session("IDsDel") = rs.Fields("ID").value
 
Link = "<b><a href=http://localhost/Remove" _
& "/RemoveForm.asp?id=" &
rs.Fields("ID").value &
">" & "Remove the article" & "</a></b>"
 
Response.Write Link & "<br>"
Response.Write rs.Fields("Title").value
Response.Write "<i><b>By _ 
" & rs.Fields("Author").value & "</b>"
Response.Write "<br>Subject: _ 
" & rs.Fields("Subject").value
Response.Write "Published: _
" & rs.Fields("Published").value & "</i><br>"
Response.Write rs.Fields("Article").value
 
db.Close
Set db = Nothing
%>

Первая строчка скрипта шаблона HTML присваивает переменной TheID значение, переданное ссылкой с использованием метода Request.QueryString. Далее открывается база данных, из которой читается статья (запись), соответствующая идентификатору, переданному из главного скрипта (index.asp).

<html>
<head>
<title>Наш газетный сайт - первые шаги в ASP</title>
<meta http-equiv="Content-Type" 
content="text/html; charset=windows-1251">
</head>
 
<body>
<center>
<p><font size="3" color="#000000"><b>Главная страница</b>
 
<table BORDER=0 CELLSPACING=0 CELLPADDING=0 WIDTH="640" >
<! -- Создадим таблицу шириной 640 пиксел -->
<tr>
<td WIDTH="640" BGCOLOR="#FFCC99" valign = top>
Список всех статей нашей базы данных:
</td>
</tr>
<! -- Наша таблица будет содержать всего одну колонку, 
напишем в ней пока заголовок -->
 
<%
Set db = Server.CreateObject("ADODB.Connection")
db.Open "Articles"
sSQL = "SELECT * FROM Articles"
Set rs = db.Execute(sSQL)
Cnt = 0 ‘Заводим счетчик статей
Do While NOT Rs.EOF ‘Пока в базе есть статьи (начало цикла)
%>
<tr> <!--Новый ряд в таблице -- >
<td> <!--Новая ячейка -- >
<%
 
If rs.Fields ("Article").value <> "No Text" Then
Link = "<a href= http://localhost/ArtTempl.asp?id=" &
rs.Fields("ID").value & ">" &
rs.Fields("Title").value & "</a>"
End If
 
Response.Write Link & "<br>"
Response.Write "<i>By " & rs.Fields("Author").value & "</i><br>"
ANN = rs.Fields("Annotation").value
If ANN <> "NA" Then
Response.Write ANN
End If
%>
 
</td> <!--Конец ячейки -- >
</tr> <!-- Конец ряда -- >
 
<%
Rs.MoveNext ‘Переход к следующей записи в базе статей
Cnt = Cnt + 1 ‘ Увеличение счетчика статей
Loop ‘ Конец цикла
db.Close
Set db = Nothing
%>
 
<p><font size="3" color="#000000"><i>
<%
Response.Write " Всего - " & Cnt & "статей"
%>
</i></font>
</font></p>
</table>
</center>
</body>
</html>

Создаем главную страницу

Таким образом в таблицу в цикле будут добавляться ряды со ссылками на статьи и с аннотациями, пока не будут отображены все статьи из базы данных. Следует обратить внимание на переменную Cnt. По окончании цикла она будет содержать число обработанных статей (рядов таблицы).

Язык структурированных запросов — SQL

Настала пора разобраться с тем, что таится за строчками:

sSQL = "SELECT * FROM Articles"
Set rs = db.Execute(sSQL)

По сути, именно за этими двумя строчками кроется работа с нашей базой данных: первая представляет собой текстовую строку с запросом к базе данных (текстовые строки в ASP записываются в двойных кавычках); вторая — содержит директиву выполнения этого запроса с одновременным присвоением результата переменной (указателю на записи в базе данных). В рамках настоящей статьи мы не будем рассматривать SQL (Structured Query Language) во всех деталях, а остановимся лишь на тех его операторах, без понимания которых дальнейшая работа будет невозможна. Для тех, кому этого покажется недостаточным, советую посетить отобранные мною сайты с детальной документацией по SQL.

Для полноценной работы нам необходимо познакомиться с четырьмя операторами этого мощного языка, предназначенного специально для работы с базами данных.

DELETE [LOW_PRIORITY] FROM «Имя Таблицы»
[WHERE Определение]

DELETE удаляет те ряды из «Имя Таблицы», которые удовлетворяют условию, определенному в «Определении», и возвращает число удаленных рядов. Если выполнить команду DELETE без условия WHERE, то все ряды указанной таблицы будут удалены. В этом случае DELETE возвратит 0. Ключевое слово LOW_PRIORITY откладывает выполнение операции DELETE до завершения работы чтения из таблицы других клиентов.

Пример:

DELETE FROM Articles WHERE ID = 1
<!--Удалить все те статьи (записи), 
чьи параметры ID равны 1-->
SELECT [STRAIGHT_JOIN] [SQL_SMALL_RESULT] 
[DISTINCT | ALL]
Выражение_Select,...
[INTO OUTFILE имя_файла' опции_экспорта]
[FROM ссылки_на_таблицы
[WHERE where_определение]
[GROUP BY имя_столбца,...]
[HAVING where_определение]
[ORDER BY {беззнаковое_целое | имя_столбца } 
[ASC | DESC] ,...]
[LIMIT [смещение,] ряды]
[PROCEDURE имя_процедуры] ]

SELECT используется для извлечения рядов (записей) из одной или более таблиц. Выражение_Select определяет столбцы таблицы, значения которых необходимо извлечь. Все ключевые поля должны быть заданы в строгой последовательности. К примеру, выражение HAVING должно следовать за любым выражением GROUP BY и до любого выражения ORDER BY.

Выражение_Select можно заменить псевдонимом (alias) с помощью ключевого слова AS. Псевдоним используется в качестве идентификатора имени столбца и может быть использован наряду с ключевыми словами ORDER BY или HAVING.

Примеры:

select concat (Фамилия, ', ' , Имя) AS Полное_Имя 
from Таблица ORDER BY Полное_Имя
select * from Таблица LIMIT 5
<!-- извлечет первые 5 рядов из таблицы-->
SELECT * FROM Articles 
Where IsTopNew = '1' Order By ID DESC
<!--те статьи таблицы Articles, значение 
поля (столбца) IsTopNew - '1', отсортированные 
в порядке 
убывания значений поля (столбца) ID-->

Выражение HAVING может относиться к любому столбцу или псевдониму в Выражении_Select. Оно применяется к запросу в последнюю очередь, непосредственно перед посылкой данных клиенту. SELECT ... INTO OUTFILE 'имя_файла' заносит отобранные записи в файл. Файл создается непосредственно на сервере и не может «уже существовать» (одна из основных причин такого механизма заключается в предотвращении случайного «затирания» различных важных файлов).

INSERT используется для добавления новых записей в существующую таблицу. Допустимо две формы использования INSERT.

Форма 1:

INSERT [LOW_PRIORITY | DELAYED] [IGNORE]
[INTO] Имя_Таблицы [(имя_столбца,...)]
VALUES (выражение,...),(...),...

Форма 2:

INSERT [LOW_PRIORITY | DELAYED] [IGNORE]
[INTO] Имя_Таблицы [(имя_столбца,...)]
SELECT ...

Первая форма — INSERT ... VALUES — вставляет ряды на основании заданных значений. Вторая форма — INSERT ... SELECT — вставляет ряды, выбранные из другой таблицы.

Примеры:

INSERT INTO Имя_Таблицы (Поле1,Поле2) 
VALUES(15,Поле1*2);

Ключевое слово LOW_PRIORITY откладывает выполнение операции до завершения работы чтения из таблицы других клиентов. Ключевое слово IGNORE в команде INSERT позволяет избегать вставки повторяющихся строк (используется в сочетании с ключевыми словами PRIMARY или UNIQUE). Для второй формы INSERT INTO ... SELECT операция не может содержать выражения ORDER BY. Таблица, в которую производится добавление записей, не может присутствовать в выражении FROM части SELECT запроса потому, что запрещено производить выделение из той же самой таблицы, в которую производится вставка.

REPLACE служит для редактирования содержимого таблицы и работает в точности как INSERT, за исключением того, что если старая запись в таблице имеет то же значение, что и записываемая, то старая запись удаляется прежде, чем добавляется новая.

Форма 1:

REPLACE [LOW_PRIORITY | DELAYED]
[INTO] Имя_Таблицы [(имя_поля,...)]
VALUES (выражение,...)

Форма 2:

REPLACE [LOW_PRIORITY | DELAYED]
[INTO] Имя_Таблицы [(имя_поля,...)]
SELECT ...

Форма 3:

REPLACE [LOW_PRIORITY | DELAYED]
[INTO] Имя_Таблицы
SET имя_поля = выражение, имя_поля = выражение,...
UPDATE [LOW_PRIORITY] Имя_Таблицы 
SET имя_поля1=выр1,имя_поля2=выр2,...
[WHERE определение_where]

UPDATE обновляет поля существующей таблицы новыми значениями. Выражение SET показывает, какие поля (столбцы) должны быть изменены, и значения, которые должны быть им присвоены. Выражение WHERE, если оно есть, указывает, какие ряды должны быть обновлены. В противном случае операция применяется ко всем рядам таблицы. Ключевое слово LOW_PRIORITY откладывает выполнение операции до завершения работы чтения из таблицы других клиентов. Выражения UPDATE выполняются слева направо.

Примеры:

Update WAPassword Set Password = 'passw' 
Where ID = 1

Обновляет значение поля Password в таблице WAPassword, записывая в поле, чей идентификатор ID равен 1 значение 'passw'.

UPDATE Счетчик SET counter=counter+1

Увеличивает значение поля counter таблицы Счетчик на 1.

UPDATE persondata SET age=age*2, age=age+1

Удваивает поле age, а затем прибавляет 1 к его значению в таблице persondata.

Что такое Global.asa

Global.asa позволяет выполнять определенные скрипты в начале работы клиентской сессии или при инициализации IIS. Примером тому может служить простейший счетчик числа посещений сайта. Более того, допустимо использовать множественные файлы Global.asa. Однако следует помнить, что ASP-скрипт ищет самый близкий (расположенный в том же каталоге) файл Global.asa и использует именно его.

По сути, этот файл может содержать четыре скрипта: первый будет выполняться при инициализации службы IIS/PWS (Application_OnStart), второй — при остановке службы IIS/PWS (Application_OnEnd) (обычно эти первые два скрипта отрабатывают в процессе перезагрузки компьютера), и еще два скрипта выполняются дополнительно при инициализации сессии пользователя (Session_OnStart) и по ее окончании (Session_OnEnd). Данная схема очень сильно напоминает пары «конструктор-деструктор». Неспроста всякая переменная, которая должна быть использована (например, в текущей сессии), может быть инициализирована в Session_OnStart с тем, чтобы быть использованной в процессе работы сессии, она же уничтожается (обнуляется) в Session_OnEnd.

Global.asa не может содержать тэгов HTML. Недопустимо использование JavaScript. Не рекомендуется писать файл Global.asa с помощью каких-либо HTML-редакторов, для этого гораздо лучше использовать NotePad. И еще один совет: прежде чем вставлять скрипт в файл Global.asa, попробуйте его в работе в обычном ASP-файле.

<OBJECT RUNAT=Server
SCOPE=Session
ID=Tool1
PROGID="MSWC.Tools">
</OBJECT>
 
<SCRIPT LANGUAGE = "VBScript" RUNAT="Server">
Sub Session_OnStart
Dim strUserLogon
Dim StrUserSecurity
' Эти переменные сессии будут держать
' значения имени пользователя (logon) 
' и права его доступа
strUserLogon = Request.ServerVariables("USER_LOGON" )
strUserSecurity = "PUBLIC"
End Sub
 
Sub Session_OnEnd
' Этот код уничтожает компонент Tools 
' для текущей сессии.
Set Tool1 = Nothing
'А этот обнуляет переменные сессии.
strUserLogon = ""
strUserSecurity = ""
' Внимание!: Данный код применять в этом 
' смысле совсем не обязательно
' так как объекты будут выгруженны из 
' памяти web сервером
' автоматически по закрытии текущей сессии.
End Sub
 
</SCRIPT>

Пример файла Global.asa

Добавляем новую статью (UploadForm.asp и Upload2DBS.asp)

Теперь, когда мы разобрались с SQL, можно приступать к добавлению новой статьи, причем делать мы это будем прямо с сайта, а если быть точнее — непосредственно с HTML-формы. Для этого сначала создадим файл с самой формой и определим скрипт-реакцию на подтверждение (кнопку «Publish the article!»). (Предполагается, что читатель знаком с азами построения HTML-форм, поэтому мы рассмотрим этот процесс, не вдаваясь в детали построения форм.)

Прежде всего следует уточнить задачу на этом этапе. Итак, очевидно следующее:

  • на загрузку статьи с сайта должен иметь право не каждый (следовательно, желательно предусмотреть пароль для доступа к этой функции);
  • у каждой статьи есть определенная тема (рубрика), причем она не может быть произвольной, а должна выбираться из списка;
  • список можно хранить непосредственно в HTML-файле и, каждый раз изменяя его, изменять сам файл. Это самый простой и быстрый способ;
  • однако для того, чтобы позволить динамически изменять и пополнять этот список, рекомендуется держать его в базе данных. Это позволит пользователям произвольным образом изменять его содержимое и не потребует переделки формы. Для простоты сначала рассмотрим вариант со встроенным («жестко прошитым») рубрикатором.

<html>
<head>
<meta http-equiv="Content-Type" 
content="text/html; charset=windows-1251">
<title>Загрузка статьи</title>
</head>
 
<body>
 
<FORM NAME="mainform" METHOD="GET" 
ENCTYPE="multipart/form-data" 
ACTION="http://localhost/Upload2DBS.asp">
 
<b>Author: (*)</b><br>
<input type=TEXT size=56 name="Author"><br> 
<!-- Поле имени автора статьи -- >
<b>Title: (*)</b><br>
<input type="text" name="Title" 
size="56"><br> 
<!-- Поле заголовка статьи -- >
<b>Article Annotation:</b><br>
<textarea name="Annotation" 
cols="56"></textarea><br> 
<!-- Поле аннотации к статье -- >
<b>Article Text:</b><br>
<textarea cols="56" name="Article" 
rows="15"></textarea><br> 
<!-- Поле текста самой статьи -- >
<b>Subject: (*) and type of the article</b><br> 
<!-- Поле рубрикатора статьи -- >
 
<select name="Subject">
<option>Economics</option>
<option>Education</option>
<option>Entertainment</option>
<option>Finances</option>
<option>Health</option>
<option>Lesure</option>
<option>Medecine</option>
<option>News&amp;Media</option>
<option>Other</option>
<option>PC Software</option>
<option>PC Hardware</option>
<option>Politics</option>
<option>Society</option>
<option>Science</option>
<option>Sports</option>
<option>Travel</option>
</select>
 
<b>Database access password: (*)</b><br>
<input type="password" 
name="Password">
<input type=SUBMIT value="Publish the Article!" 
name="SUBMIT">
<input type="reset" name="Reset" 
value="Reset Article Form">
</FORM>
 
</body>
</html>

Как видим, передача управления осуществляется благодаря директиве ACTION="http://localhost/Upload2DBS.asp"> в тэге формы. Тем самым указывается скрипт-ответ на реакцию пользователя после нажатия на кнопку «Publish the article!». Теперь остановимся на селекторе рубрик. Как уже отмечалось, желательно перевести его содержимое в базу данных. Для этого в нашей базе данных (файл ArticlesDB.mdb) создадим новую таблицу с именем, к примеру «Topics», в которой с помощью конструктора определим всего одно поле — «Topic» типа «текст». Далее заполним эту таблицу произвольными значениями нашего рубрикатора и отсортируем полученный список в алфавитном порядке. После чего следует заменить тэг <select> в вышеприведенной форме на следующий вариант:

<select name="Subject">
<%
Set db = Server.CreateObject("ADODB.Connection")
db.Open "DSN=Articles;UID=sa;PWD=;"
SQLQuery = "Select * From Topics"
Set rs = db.Execute(SQLQuery)
Do While NOT Rs.EOF
Response.Write "<option>" & 
rs.Fields("Topic").value & "</option>"
Rs.MoveNext
Loop
%>
</select>

… и все.

Теперь давайте разберемся с самой сутью дальнейшей работы. Что же должен делать наш скрипт-реакция?

Во-первых, следует позаботиться о том, чтобы все обязательные поля (а они отмечены звездочкой) были введены. Наиболее правильным способом проверки этого является скрипт, написанный на любом языке описания скриптов (например, JavaScript), который будет проверять, введены ли значения обязательных полей. Для этого достаточно добавить в определение тэга формы параметр onsubmit="preprocess();", где preprocess() — имя функции-скрипта, который и будет осуществлять проверку. Здесь как нельзя кстати видно преимущество языков описания сценариев (JavaScript, Jscript, VBScript) перед ASP. ASP выполняется на стороне сервера, а перегружать связь «клиент-сервер» простой проверкой типа «введены ли значения», согласитесь, неправильно. Однако специально в целях обучения мы будем делать это с помощью ASP.

И еще. Прежде чем приступить к выполнению нашей задачи,

 
Автор: Рубен Садоян
 
Оригинал статьи: http://www.woweb.ru/publ/60-1-0-215