Mas pelo menos para os novatos, espero que seja de grande utilidade.
Muitos aqui devem fazer consultas em bandos através de ID (auto-numeração), por QueryString.
Fazem o sistema, colocam no ar, só que acabam não fazendo uma validação evitando erros futuros.
Então, o endereço "ver.asp?id=15", que antes funcionava corretamente mostrando o registro selecionado, passou a agir de maneira incorreta quando um usuário "chato" digitou no location "ver.asp?id=15lalala", apresentando o seguinte erro ao invés do sistema em perfeito estado:
Novato: "Mas, por quê acontece isso, Tarkan?"Microsoft JET Database Engine (0x80040E14)
Erro de sintaxe (operador faltando) na expressão de consulta 'id=15lalala'.
/agenda/ver.asp, line 90
Simples...
No banco de dados, estamos trabalhando com uma consulta em cima de um campo de auto-numeração.
Ao inserir uma string para ser buscada neste mesmo campo, é normal que o sistema dê erro, já que o tipo de campo onde estamos agindo não está formatado para o tipo string.
Por este motivo, fiz uma função simples demais, mas que pode ajudar a não dar este problema.
A função é esta abaixo:
Explicando:Function TrataStr(str)
If IsNumeric(str) = True Then
str = str
Else
str = 0
End If
TrataStr = str
End Function
O que faz a função IsNumeric()?
Ela verifica se o parâmetro é do tipo é numérico, retornando um valor booleano (True / False) como resposta.
Daí, fiz uma função exatamente deste modo.
Passando para o português estruturado, vejam como fica:
Como podem ver, utilizei a função IsNumeric() para ver se continha string no parâmetro.Função TrataStr(str)
Se ÉNumérica(str) = Verdadeiro Então
str = str '*** Não faz nada, continua com o valor padrão
Ou
str = 0 '*** Transforma em 0
Fim Se
TrataStr = str
Fim da Função
Não contém string: Continua com o valor padrão. Ou seja, se o ID na url é 15, vai continuar 15.
Contém string: Ele abandona a operação transformando antes o valor do parâmetro em 0. Quando fizer a leitura no banco, não vamos ter problemas caso a gente tenha feito o tratamento do BOF / EOF.
Espero que tenham entendido esta função básica, mas que pode ajudar algumas pessoas que estão começando agora e passam por este problema.
Abaixo, segue o código... Para ser analizado.
Neste exemplo, precisei de:
- Banco Access: "exemplo.mdb"
- Tabela: "tbl_agenda"
- Campo 1: "id" (auto-numeração)
- Campo 2: "evento" (texto)
Código:
Espero que entendam!<%
Dim Conexao, ConnString, strSQLListaAgenda, rsListaAgenda
Function TrataStr(str)
If IsNumeric(str) = True Then
str = str
Else
str = 0
End If
TrataStr = str
End Function
Set Conexao = CreateObject("ADODB.Connection")
ConnString = "Provider=Microsoft.Jet.OLEDB.4.0;Data Source=" & Server.MapPath("exemplo.mdb") & ";Persist Security Info=False"
Conexao.Open ConnString
strSQLListaAgenda = "select * from tbl_agenda where id=" & TrataStr(Request.QueryString("id"))
Set rsListaAgenda = Conexao.Execute(strSQLListaAgenda)
If rsListaAgenda.EOF = True Then
Response.Write "Nenhum evento marcado"
Else
Response.Write rsListaAgenda("evento")
End If
rsListaAgenda.Close
Set rsListaAgenda = Nothing
Conexao.Close
Set Conexao = Nothing
%>
Qualquer dúvida, podem postar!
Qualquer código que também seja de validação e que seja de ajuda para outros usuários, podem aproveitar este tópico!
Abraços!