PS: Статья, написанная К. Дж. Дэниелом. Вчера, когда я разговаривал с другом, я упомянул командный запрос ADO. Кажется, у меня очень плохая память. Пожалуйста, прочтите это. Обычно друзья, которые пишут PHP-код ASP, вероятно, используют прямую работу с SQL~
Посмотрите на следующий код
<%
дим конн, рс
set conn=CreateObject(Adodb.Connection)
конн.открыт....
set rs=conn.execute(выберите * из новостей);
...
Траверс рс....
%>
Конечно, скорость реализации высокая, но полтора утверждения в структурной логике, конечно, не имеют значения! Проблемы возникают, когда утверждений слишком много!
Параметры не фильтруются, есть SQL-инъекция и т. д. Хорошо, теперь изменим модель проектирования!
Принять трехуровневую структуру + ORM
ORM: СООБЩЕНИЕ ОБЪЕКТНЫХ ОТНОШЕНИЙ
Так что же такое технология ORM? Друзья, знакомые с разработкой JAVA .NET, должны очень хорошо знать... что такое объектно-реляционное отображение.
Сопоставьте таблицы с полями классов, сопоставьте их со свойствами и сопоставьте записи с объектами... Сейчас существует множество фреймворков уровня персистентности JAVA ORM.
Например, hibernate ibatis EntityBean (один из EJB)
А что насчет АСП? Мы также можем достичь этого. Ждите знакомства.
Трехуровневая структура: уровень веб-представления, средний уровень, уровень сохранения.
Вот простая таблица новостей
создать таблицу новостей(
идентификатор int,
заголовок варчар(200),
связаться с varchar(50000)
)
Мы отображаем его как класс
<%
Новости класса
личный идентификатор, должность, контакт
Sub setID(sid)
id=Цинт(сид)
Конец субтитра
Функция getID
getID=id
Конечная функция
Sub setTitle(заголовок)
title=mid(stitle,1,200)'ограничивает длину
Конец субтитра
....
Конечный класс
%>
Затем мы разрабатываем код работы с базой данных и преобразуем его в объекты.
<%
Класс NewsDataAccessObject
тусклый конн, rs, cmd
'Запросить новость
Функция getNewsByID(id)
set conn=Application(connection)' Получить соединение в пуле соединений
set cmd=GetCmd() ' реализация функции GETCMD return createobject(Adodb.Command)
selectString=выбрать * из новостей, где id = @id
cmd.ActiveConnection = подключение
cmd.CommandType = adCmdText ' Const adCmdText=1
cmd.CommandText = выберитеСтрока
'Сейчас добавим параметры в @id, константу adInteger = 3 adParamInput=1
cmd.Parameters.Append cmd.CreateParameter(@id, adInteger, adParamInput, , id)
'Запускаем оператор SQL и возвращаем набор результатов
установить rs=cmd.execute()
снова тусклый
установить заново=новые новости
если rs.eof тогда
еще
заново.setID(rs(id)&)
заново.setTitle(rs(title)&)
заново.setContect(rs(Contect)&)
конец, если
RS.закрыть
установить rs=ничего
установить cmd=ничего
установить соединение = ничего
установить getNewsByID=по-новому
Конечная функция
'Вставить новостную статью
Функция addNews(снова)
тусклый конн, cmd
если isempty(заново), то addNews=false
set conn=Application(connection)' Получить соединение в пуле соединений
set cmd=GetCmd() ' реализация функции GETCMD return createobject(Adodb.Command)
InsertString = вставить в значения NEWS(id,title,contect)( @id , @title , @contect )
cmd.ActiveConnection = подключение
cmd.CommandType = adCmdText ' Const adCmdText=1
cmd.CommandText = вставитьСтроку
'Сейчас добавим параметры в @id @title @contect, константа adInteger = 3 adParamInput=1 adVarWChar = 202
cmd.Parameters.Append cmd.CreateParameter(@id, adInteger, adParamInput, , anew.getID() )
cmd.Parameters.Append cmd.CreateParameter(@title,adVarWChar, adParamInput, 200, anew.getTitle() )
cmd.Parameters.Append cmd.CreateParameter(@contect,adVarWChar, adParamInput, 50000, anew.getConect() )
'Выполнить оператор SQL
cmd.execute()
установить cmd=ничего
установить соединение = ничего
addNews=истина
Конечная функция
Функция findByTitle(заголовок)
....
Конечная функция
Функция getPageNews(страница,размер)
....
Конечная функция
Конечный класс
%>
Вышеуказанное подразумевает работу с базой данных, а затем инкапсуляцию результатов в объект или запись объекта в базу данных.
Хотя скорость этой реализации будет немного медленнее, общая логическая структура очень очевидна, и нет необходимости заботиться о том, были ли переменные отфильтрованы или подвергнуты многократной фильтрации.
Дизайнеры на уровне веб-страницы больше внимания уделяют интерфейсу.
Добавьте код новости для отправки ниже
<%
dim id,title,contect,заново,дао
идентификатор = Запрос (идентификатор)
title=Запрос.Форма(название)
contact=Request.Form(contect)
установить заново=новые новости
заново.setID(идентификатор)
заново.setTitle(название)
заново.setContect(контакт)
установить дао = новый NewsDataAccessObject
если dao.addNews(снова), то
'ответ.написать
эхо успеха
еще
ошибка эха
конец, если
%>
Просматривайте новости и отображайте их
<%
дим ид, дао, заново
идентификатор = Запрос (идентификатор)
установить дао = новый NewsDataAccessObject
установить заново=dao.getNewsByID(id)
если заново.getID()<> тогда
%>
Заголовок:<%=anew.getTitle()%>
Содержимое:<%=anew.getContect()%>
.....
Если в приведенном выше фрагменте кода есть какие-либо ошибки или упущения, спасибо за совет~~~
Используя этот метод проектирования, нет необходимости использовать систему статей, такую как XXXBLOG XXXBBS XXX.
Забыли заменить(SQL,','') и произошла инъекция!
С точки зрения чистоты страницы не будет никаких операторов SQL. Исполнители, такие как подключение, отвечают за свою работу, а затем помещают свойства объекта в соответствующую позицию.
И некоторые друзья могут подумать об аутентификации пользователя! Было бы проще просто поместить в сеанс пользовательский объект пользовательской таблицы.
<%
если isempty(session(user)) или session(user)= тогда
'Прыжок
еще
установить auser=сессия(пользователь)
эхо-приветствие: & auser.getName()
%>