PS: O artigo escrito por KJ Daniel. Ontem, quando estava conversando com um amigo, mencionei a consulta de comando do ADO, na verdade esqueci disso. Parece que minha memória está muito ruim. Por favor, leia. Geralmente, amigos que escrevem código ASP PHP provavelmente usam operação direta de SQL ~
Veja o seguinte código
<%
dim conexão, rs
definir conn=CreateObject(Adodb.Connection)
conexão.abrir....
set rs=conn.execute(selecione * nas notícias);
...
Atravesse rs....
%>
É certo que a velocidade de implementação é rápida, mas é claro que uma afirmação e meia na lógica estrutural não importa! Os problemas surgem quando há muitas declarações!
Os parâmetros não são filtrados, há injeção de SQL, etc. OK, agora vamos mudar o modelo de design!
Adote estrutura de 3 camadas + ORM
ORM: MAPEAMENTO DE RELAÇÃO DE OBJETOS
Então, o que é tecnologia ORM? Amigos que estão familiarizados com o desenvolvimento JAVA .NET devem saber muito bem... isso é mapeamento objeto-relacional
Mapeie tabelas para campos de classe, mapeie-as para propriedades e mapeie registros para objetos... Existem agora muitas estruturas de camada de persistência JAVA ORM
Por exemplo, hibernate ibatis EntityBean (um dos EJB)
E a ASP? Também podemos alcançá-lo. Aguarde a introdução.
Estrutura de 3 camadas: camada de apresentação WEB, camada intermediária, camada de persistência
Aqui está uma tabela de notícias simples
criar notícias de mesa(
identificação interna,
título varchar(200),
entre em contato com varchar(50000)
)
Nós mapeamos isso como uma classe
<%
Notícias da aula
ID privado, título, contato
SubconjuntoID(sid)
id=Cint(sid)
Finalizar sub
Função getID
obterID=id
Função final
SubconjuntoTítulo(título)
title=mid(stitle,1,200)'limita o comprimento
Finalizar sub
....
Fim da aula
%>
Em seguida, projetamos o código sobre como operar o banco de dados e convertê-lo em objetos.
<%
Classe NewsDataAccessObject
dim conexão,rs,cmd
'Consulte uma notícia
Função getNewsByID(id)
set conn=Application(connection)' Obtém uma conexão no pool de conexões
set cmd=GetCmd() ' Implementação da função GETCMD return createobject(Adodb.Command)
selectString=select * from NEWS onde id = @id
cmd.ActiveConnection = conexão
cmd.CommandType = adCmdText 'Const adCmdText=1
cmd.CommandText = selectString
'Adicione parâmetros ao @id agora mesmo, constante adInteger = 3 adParamInput=1
cmd.Parameters.Append cmd.CreateParameter(@id, adInteger, adParamInput, , id)
'Executa a instrução SQL e retorna o conjunto de resultados
definir rs = cmd.execute ()
escurecer de novo
definir anew = novas notícias
se rs.eof então
outro
novo.setID(rs(id)&)
anew.setTitle(rs(título)&)
anew.setContect(rs(Contect)&)
terminar se
rs.fechar
definir rs = nada
definir cmd = nada
definir conn = nada
definir getNewsByID = novo
Função final
'Insira uma notícia
Função addNews(de novo)
dim conexão,cmd
se estiver vazio(de novo), então addNews=false
set conn=Application(connection)' Obtém uma conexão no pool de conexões
set cmd=GetCmd() ' Implementação da função GETCMD return createobject(Adodb.Command)
insertString=inserir em valores NEWS(id,title,contect)( @id , @title , @contect )
cmd.ActiveConnection = conexão
cmd.CommandType = adCmdText 'Const adCmdText=1
cmd.CommandText=inserirString
'Adicione parâmetros ao @id @title @contect agora mesmo, constante 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() )
'Executa instrução SQL
cmd.execute()
definir cmd = nada
definir conn = nada
addNews=true
Função final
Função findByTitle(título)
....
Função final
Função getPageNews(página,tamanho)
....
Função final
Fim da aula
%>
O acima é operar o banco de dados e então encapsular os resultados no objeto ou gravar o objeto no banco de dados.
Embora a velocidade desta implementação seja um pouco mais lenta, a estrutura lógica geral é muito óbvia e não há necessidade de se preocupar se as variáveis foram filtradas ou multifiltradas.
Os designers da camada da página da web se concentram mais na interface.
Adicione o código de notícias para enviar abaixo
<%
dim id,título,contecto,novamente,dao
id=Solicitação(id)
título = Solicitação.Formulário (título)
contato = Solicitação.Formulário (conteto)
definir de novo=novas NOTÍCIAS
novo.setID(id)
anew.setTitle(título)
anew.setContect(contect)
definir dao = novo NewsDataAccessObject
se dao.addNews(de novo) então
'resposta.write
ecoar sucesso
outro
erro de eco
terminar se
%>
Confira as novidades e divulgue-as
<%
dim id,dao,novamente
id=Solicitação(id)
definir dao = novo NewsDataAccessObject
definir novo=dao.getNewsByID(id)
se anew.getID()<> então
%>
Título:<%=anew.getTitle()%>
Conteúdo:<%=anew.getContect()%>
.....
Se houver algum erro ou omissão no trecho de código acima, obrigado pelo seu conselho ~~~
Usando este método de design, não há necessidade de usar um sistema de artigos como XXXBLOG XXXBBS XXX
Esqueci Substituir(SQL,','') e ocorreu injeção!
Em termos de limpeza da página, não haverá instruções SQL. Artistas como a conexão são responsáveis pelo seu próprio trabalho e depois colocam as propriedades do objeto na posição correspondente.
E alguns amigos podem pensar na autenticação do usuário! Seria mais fácil simplesmente colocar o objeto user da tabela user na sessão.
<%
se isempty(sessão(usuário)) ou sessão(usuário)=então
'Pular
outro
definir auser = sessão (usuário)
eco bem-vindo: & auser.getName()
%>