Если кто постарше, то конечно помнят, как начиналась телепередача "Умелые руки". Я даже не знаю, выходит ли она сейчас в эфир?.. Вряд ли. Итак Ведущая(ий) с ребятами подготавливают все к работе по созданию очередной самоделки. Наша задача на сегодня - осуществить доступ к базе данных и отобразить содержимое таблицы в веб-страничке - Необходимо создать новый виртуальный каталог в PWS (Win95/98/ME)либо в IIS (Win2000).
В моем случае - имя компьютера GS, создаю виртуальный каталог К141.Доступ к нему будет осуществляться по http://gs/k141. Физически на диске этот каталог у меня находится на F:_Developaspk141. Можно использовать имя сервера localhost на компьютере, тогда просмотр сайта осуществляется по http://localhost/k141 - Далее создаю подкаталоги:
db - для размещения базы данных Аксесс 97 css - для таблицы стилей pages - для шаблонов основных страниц page_inc - (от include) для вспомогательных страниц обслуживающих основные страницы support - для страниц обеспечивающих доступ к базе данных и редактированию её таблиц - Также необходим установленный Аcсess из пакета Microsoft Office 97 Professional или более новой версии. Для 97-го Офиса (в русской локализации) сделана, на мой взгляд, замечательная справка на русском языке.
Почему виртуальный каталог называется К141 - это мое очередное изыскание (катастрофа АПРК "Курск" , а К141 - его бортовой номер). Для работы по созданию страниц я использую текстовой редактор TextPad 4.5.0 Немного похож на MultiEdit, обеспечивает подсветку синтаксиса для различных языков, создание и редактирование библиотек. библиотеки позволяют оперативно осуществлять вставку кода, заключение текста в теги. Есть запись макросов и многое другое. Короче - рекомендую. Программа шароварная, но популярная среди многих программистов. ( http://www.textpad.com ) Следующий инструмент, который не будет лишним - настоящий сайт, существующий в интернете, где всё ваше произведение искусства (сайт) и проявит все свои плюсы и минусы - http://brinkster.com/ Он поддерживает работу с базами Аксесс 97/2000, имеет форум и базу знаний. Некоторые статьи оттуда в будущем буду переводить. Неплохой и удобный хостинг. Безусловно, этот сервер окажется подарком для "бесребренников" (коим и сам являлся долгое время), у которых, в силу административных прав, нет возможности изучать ASP на работе :)). Стартовая страница в ASP должна иметь имя default, а расширением могут быть .asp или .htm. Расположение страницы - в корне каталога. Надо сказать, что если расширение будет html, то вы не воспользуетесь всеми преимуществами динамических страниц. Создаем страницу default.asp. Правилом хорошего тона считается в самой первой строке написать <% @LANGUAGE=VBScript %> Теги <% %> означают, что содержимое между ними будет исполнено на стороне сервера и не попадет в страницу, выданную клиенту. Ну, а фразой @LANGUAGE=VBScript вы огласили, с чем вы будете работать, чем компилировать будем :)). В принципе, первую страницу можно оформить как обычную веб-страничку. А пока мы запишем в нее "ПРОВЕРКА" и текст ее будет прост. default.asp <% @LANGUAGE=VBScript %> <!--#include file=page_inc/up.inc--> ПРОВЕРКА <!--#include file=page_inc/low.inc--> | Что же мы сделали? Означает, что при вызове это странички, сервер динамически подключит страницу up.inc в начале и low.inc в конце. Необходимо описать эти странички, верно? Здесь и далее: перед листингом идет имя файла с полным путем в локальном директории. page_inc/up.inc <html> <head> <title>GardenStone</title> <meta http-equiv="Content-Type" content="text/html; charset=windows-1251"> <link rel="stylesheet" HREF="../css/index.css" type="text/css"> <meta name="GENERATOR" content="Microsoft FrontPage 3.0"> </head> <body bgcolor="#F1F3F3"> <div align="center"><center> <table style="font-size: 8pt; font-family: Arial" width="90%" border="0" bgcolor="#E2E2E2"> <tr> <td> | page_inc/low.inc </td> </tr> </table> </center></div> </body> </html> | Наверно уже очевидно, что в заголовок и подвал страницы вы можете в будущем понаставить баннеров, кнопок навигации и меню. Красота заключается в том, что вы раз и навсегда избавлены описывать их для каждой страницы. Теперь, если вы обратитесь к виртуальному каталогу через браузер (в моем случае - http://gs/k141), то увидите страничку с табличкой, в которой написано "проверка". Если ваш опыт не удался - пишите мне , тогда я изменю/отредактирую текст на более подробный, это же касается и всего, что я напишу далее. Подходим к главному. Создаем базу данных. Аксесс. Я буду использовать БД ACCESS 97. По всем вопросам работы с базой данных (в частности, создание таблиц) отсылаю к разделу Аксесс. Там многое будет объяснено. Например, здесь. Имя базы данных - b141.mdb. А разместим ее в каталоге bd. Имя создаваемой таблицы tChapter. В этой статье даунлоадов не будет. Надо все сделать СВОИМИ РУКАМИ. Таблица пока одна. Но главная. На будущее, не используйте для таблиц зарезервированные слова. В свое время, например, мне пришлось переименовывать таблицу GENERAL, поскольку ее имя являлось зарезервированным словом и SQL запросы не исполнялись. А лучше всего добавлять приставки к именам таблиц. Если сразу следовать этому правилу, многих граблей можно избежать. Как правило, практически любой сайт имеет несколько освещаемых направлений. Это касается и корпоративных, мощных сайтов и маленьких, домашних страничек. И созданная нами таблица как раз и будет списком этих направлений/глав/тем. Заглядывая вперед: разумно сделать в этой таблице список и тем и подтем (подчиненных тем). Например, тема СЕМЬЯ может иметь широкие разделы Я, Дети, Хобби и т.д. Описание создания иерархии рубрик будет в следующей статье, но подготовить надо все заранее. В этом есть особенность проектировщика баз данных :)) У нас будет впоследствии создана вторая таблица tArtikles, где и будет размещен текст страниц. Структура таблицы tChapter Поле | Тип данных | Примечание | IDChapter | Счетчик | Уникальный идентификатор любой вновь созданной темы. Целое длинное число, не допускающее повторений, т.е. ключевое поле. Генерируется самой бд. | IDChapterParent | Number | Длинное целое.По умолчанию 0 - если тема корневая. Если не ноль, тогда указывается IDChapter, которому эта тема подчинена. | ChapterName | Text | Собственно, имя темы, которое будет отображаться в страницах. | Когда вы создадите и сохраните таблицу - заполните ее названиями своих тем/глав. Так... База у нас есть. Стартовая страница - тоже. Шапка и подвал для страниц готовы. Включение файлов очень удобно. Видели уже. Так же можно включать файлы, в которых будут описаны часто используемые процедуры и функции. Создадим такой часто используемый файл, и назовем его conn.inc (от connection - подключение). Место отведем ему в каталоге page_inc. Примерно вот так выглядел этот файл для сайта, где вы находитесь, полтора года назад. page_inc/conn.inc <% '################Это надо изменять при смене сервера ##################### '--Тута задаются переменные для работы общих функций в корневом каталоге-- '######################################################################### public LOCAT_STYLES 'адрес общего CSS-файла со стилями public LOCAT 'ссылка на каталог public VLOCAT 'виртуальный путь на каталог public FILEDSN 'строка подключения к БД 'Для сервера-------------------------------------------------------------------- LOCAT_STYLES = "http://www21.brinkster.com/gardenstone/css/index.css" LOCAT = "http://www21.brinkster.com/" VLOCAT = "/gardenstone/db/" FILEDSN = "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & Server.MapPath(VLOCAT+"b141.mdb") & ";" 'Для локала--------------------------------------------------------------------- 'LOCAT_STYLES = "../css/index.css" 'LOCAT = "http://gs/" 'VLOCAT = "/k141/db/" 'FILEDSN = "DRIVER={Microsoft Access Driver (*.mdb)}; DBQ=" & Server.MapPath(VLOCAT+"b141.mdb") & ";" '------------------------------------------------------------------------------- Set cn = Server.CreateObject("ADODB.Connection") cn.Open FILEDSN %> | Как видите, объявили глобальные переменные, присвоили им значения в зависимости от места работы сайта (в инете или на локале) и ... подключились. Последний штрих это статьи - страница содержания разделов, использующая данные базы данных. Размещение страницы - pages/cont.asp <% 'ниже идет подключение базы данных и шапка страницы %> <!--#include file=../page_inc/conn.inc--> <!--#include file=../page_inc/up.inc--> <center><b><big>Содержание</big></b></center> <% Function MakeCont(strCont) ' Эту функцию мы описали раньше, что бы она была уже в области видимости, при выполнении сценария strCont = "<table width='80%' border=0 bordercolor=#e2e2e2 " & _ "style='font-size: 9pt; font-family: Arial;'>"& vbCrLf & _ "<td width=15><img src='../img/folder.gif'></td>" & vbCrLf & _ "<td bgcolor='#EAEAEA'><b> " & _ strCont & "</b></td></table>" 'vbCrLf - перенос строки. MakeCont=strCont & vbCrLf & vbCrLf End Function Dim rs1,sSQL1 sSQL1 = "SELECT * FROM tChapter" Set rs1=cn.Execute(sSQL1) While (Not rs1.EOF) Response.Write MakeCont(rs1("ChapterName")) rs1.MoveNext Wend rs.close Set cn = Nothing %> <!--#include file=../page_inc/low.inc--> | Что же здесь происходит? 1 Подключается файл conn.inc и, следовательно, устанавливается связь с базой данных. Естественно, что текст этого файла в страницу не попадет, поскольку обрамлен тегами <% %> и является программой, которую будет выполнять сторона сервера. 2 В страницу загружается шапка. Она будет отображена в странице. До знака выполнения сценария <% отобразится и отформатированное слово "Содержание". 3 Далее нам необходимо вывести в страницу содержимое таблицы tChapter базы данных. Соединение с БД у нас установлено, надо получить доступ к таблице. Открываем рекордсет. Для непосвященных : рекордсет - это таблица, которую мы видим не глазами, а программно и также программно можем ее "щупать" :) Иначе говоря я мог сказать "открыть программно таблицу", но recordset - набор записей, более точно отображает суть дела, когда нам необходимо получить записи выборочно, по какому либо критерию, либо связанные записи из двух таблиц. Устанавливаем ссылку на объект рекордсет - это объектная переменная rs1. Вообще, мы могли установить источником таблицу явно. Вот так: Set rs1=cn.Execute("tChapter"), но установили источником рекордсета запрос "SELECT * FROM tChapter", что является суть тем же. Почему? Когда появятся более сложные конструкции строк SQL запросов, то проще будет их "наращивать" (конкатенация/слияние строк). Например, добавить условие в запрос: sSQL1 & " WHERE ID > 12" Далее в цикле читаем содержимое рекордсета/таблицы и инструкцией Response.Write записываем содержимое полей в страницу. Инструкцией rs1.MoveNext переходим на следующую запись. Можно несколько видоизменить код, и результат будет аналогичным. While (Not rs1.EOF)%> <%=MakeCont(rs1("ChapterName"))%> <% rs1.MoveNext Wend | Часто бывает легче записать значение как <%=var%>, а не <% Response.Write var %> - эти выражения равнозначны. Когда мы закончили чтение данных - закрываем рекордсет и удаляем ссылку на базу данных: rs1.Close Set cn = Nothing | Функция MakeCont вынесена перед открытием не случайно. Ее назначение - получать значение из таблицы и возвращать отформатированную строку. Если бы я ее вынес ПОСЛЕ чтения рекордсета, возможно она еще не была бы получена сервером и выдавалась бы ошибка. Может лучше было "запендюрить" ее прямо в цикл чтения рекордсета?.. Так-то оно так. Но для читаемости кода лучше отделять форматирование от кода. Тогда вам, поверьте пока на слово, при очередной отладке гораздо легче будет "отделить мухи от котлет" (с) ВВП и найти ошибку. Еще один нюансик: завершая формирование строки я дописываю strCont & vbCrLf & vbCrLf vbCrLf - знак переноса строки Это для того, что бы просматривая html код полученной от сервера страницы, Вы могли лучше в нем разобраться. Иначе весь страничный код был выдан бы в одной строке и поди, разберись тогда, какой тег был неправильно написан. Ну, а теперь в странице default.asp замените слово ПРОВЕРКА на ссылку pages/cont.asp и смотрите, будет ли это всё теперь работать. PS Пожеланий жду по адресу
Этот e-mail защищен от спам-ботов. Для его просмотра в вашем браузере должна быть включена поддержка Java-script
|