Ir para conteúdo

POWERED BY:

Arquivado

Este tópico foi arquivado e está fechado para novas respostas.

delgisa

Erro no Insert com Apóstrofos

Recommended Posts

Salve galera!!!

 

 

Tenho uma página ASP que lê um arquivo .txt e grava num banco Access.

 

Acontece que neste arquivo .txt tem alguns dados que vem com o bendito apóstrofo ('), ex.: Joana D'Arc.

Então vocês já imaginam o erro...

Já tentei usar server.HTMLEncode mas não sarou o problema.

Será que tenho que usar o Split campo por campo na rotina do insert pedindo para que seja retirado o apóstrofo se houver???

 

Fica imaginando se neste arquivos eu tiver mais surpresas com outros caracteres... Aí eu teria sempre que ficar tratando esses dados.

 

alguém aí tem alguma dica para que eu possa sanar esse problema de uma forma menos árdua e que eu possa utilizar sem medo de imprevistos?????

 

Vejam meu código:

 


"INSERT INTO titular (nome, cidade, uf, endereco, cep, bairro, data_nascimento, cpf, rg, codestadocivil, pai, mae, naturalidade, nacionalidade, matricula, codentidade) VALUES ('"&server.HTMLEncode(arrayLinha(1))&"','"&server.HTMLEncode(arrayLinha(2))&"','"&server.HTMLEncode(arrayLinha(3))&"','"&server.HTMLEncode(arrayLinha(4))&"','"&server.HTMLEncode(arrayLinha(5))&"', '"&server.HTMLEncode(arrayLinha(6))&"', '"&server.HTMLEncode(arrayLinha(7))&"', '"&server.HTMLEncode(arrayLinha(8))&"', '"&server.HTMLEncode(arrayLinha(9))&"', "&server.HTMLEncode(arrayLinha(10))&", '"&server.HTMLEncode(arrayLinha(11))&"', '"&server.HTMLEncode(arrayLinha(12))&"', '"&server.HTMLEncode(arrayLinha(13))&"', '"&server.HTMLEncode(arrayLinha(14))&"', '"&server.HTMLEncode(arrayLinha(15))&"', "&server.HTMLEncode(arrayLinha(16))&")"

o erro é esse:

 

Microsoft OLE DB Provider for ODBC Drivers (0x80040E14)
[Microsoft][Driver ODBC para Microsoft Access] Erro de sintaxe (operador faltando) na expressão de consulta ''ANGELA D'ARC','SÃO PAULO','SP','RUA TIRADENTES 312','14000-000', 'CENTRO', '31/08/1965', '071.517.878-10', '19325690', 1, '', '', '', 'BRASILEIRA', '000000001933', 1)'.

Desde já muito obrigado

 

Jardel

Compartilhar este post


Link para o post
Compartilhar em outros sites

Verifique também a ortografia. pode ser um nome de coluna Invalido 'sua_coluna'. A coluna a qual você se refere na Base de Dados não foi encontrada.

Compartilhar este post


Link para o post
Compartilhar em outros sites

faz um replace simples nos values. exemplo: replace(server.HTMLEncode(arrayLinha(4)),"'","''")

 

dessa forma ele vai entender. :P

 

 

Boa Felipe, deu certo, eu fiz assim:

conexao.execute "INSERT INTO titular (nome, cidade, uf, endereco, cep, bairro, data_nascimento, cpf, rg, codestadocivil, pai, mae, naturalidade, nacionalidade, matricula, codentidade) VALUES   ('"&replace(server.HTMLEncode(arrayLinha(1)),"'","")&"', '"&replace(server.HTMLEncode(arrayLinha(2)),"'","")&"', '"&replace(server.HTMLEncode(arrayLinha(3)),"'","")&"', '"&replace(server.HTMLEncode(arrayLinha(4)),"'","")&"', '"&replace(server.HTMLEncode(arrayLinha(5)),"'","")&"', '"&replace(server.HTMLEncode(arrayLinha(6)),"'","")&"', '"&replace(server.HTMLEncode(arrayLinha(7)),"'","")&"', '"&replace(server.HTMLEncode(arrayLinha(8)),"'","")&"', '"&replace(server.HTMLEncode(arrayLinha(9)),"'","")&"', "&replace(server.HTMLEncode(arrayLinha(10)),"'","")&", '"&replace(server.HTMLEncode(arrayLinha(11)),"'","")&"', '"&replace(server.HTMLEncode(arrayLinha(12)),"'","")&"', '"&replace(server.HTMLEncode(arrayLinha(13)),"'","")&"', '"&replace(server.HTMLEncode(arrayLinha(14)),"'","")&"', '"&replace(server.HTMLEncode(arrayLinha(15)),"'","")&"', "&replace(server.HTMLEncode(arrayLinha(16)),"'","")&")"

Mas como nem tudo é perfeito, agora estou com outro problema:

Quando importo, por exemplo o nome José, no banco de dados é gravado da seguinte forma: J O S & # 2 0 1; --- tiver que por com espaço pois a página do imasters estava transformando a palavra em JOSÉ, sem os caracteres...

Você sabe o que eu tenho que fazer para gravar a acentuação certinha?

Compartilhar este post


Link para o post
Compartilhar em outros sites

dá um response.write na string SQL, para ver o k esta sendo passado

response.write(SQL)
response.end()

Compartilhar este post


Link para o post
Compartilhar em outros sites

dá um response.write na string SQL, para ver o k esta sendo passado

response.write(SQL)
response.end()

 

 

Então.... não consegui, deu erro, veja só como eu fiz:

conexao.execute "INSERT INTO titular (nome, cidade, uf, endereco, cep, bairro, data_nascimento, cpf, rg, codestadocivil, pai, mae, naturalidade, nacionalidade, matricula, codentidade) VALUES   ('"&replace(server.HTMLEncode(arrayLinha(1)),"'","")&"', '"&replace(server.HTMLEncode(arrayLinha(2)),"'","")&"', '"&replace(server.HTMLEncode(arrayLinha(3)),"'","")&"', '"&replace(server.HTMLEncode(arrayLinha(4)),"'","")&"', '"&replace(server.HTMLEncode(arrayLinha(5)),"'","")&"', '"&replace(server.HTMLEncode(arrayLinha(6)),"'","")&"', '"&replace(server.HTMLEncode(arrayLinha(7)),"'","")&"', '"&replace(server.HTMLEncode(arrayLinha(8)),"'","")&"', '"&replace(server.HTMLEncode(arrayLinha(9)),"'","")&"', "&replace(server.HTMLEncode(arrayLinha(10)),"'","")&", '"&replace(server.HTMLEncode(arrayLinha(11)),"'","")&"', '"&replace(server.HTMLEncode(arrayLinha(12)),"'","")&"', '"&replace(server.HTMLEncode(arrayLinha(13)),"'","")&"', '"&replace(server.HTMLEncode(arrayLinha(14)),"'","")&"', '"&replace(server.HTMLEncode(arrayLinha(15)),"'","")&"', "&replace(server.HTMLEncode(arrayLinha(16)),"'","")&")"
response.Write(conexao)
response.End

Deu esse erro:

Provider=MSDASQL.1;Extended Properties="DBQ=C:\Inetpub\wwwroot\teste\RPPS\teste11\Adm\importacao\dados.mdb;Driver={Microsoft Access Driver (*.mdb)};DriverId=25;FIL=MS Access;MaxBufferSize=2048;PageTimeout=5;"

Compartilhar este post


Link para o post
Compartilhar em outros sites

dá um response.write na string SQL, para ver o k esta sendo passado

response.write(SQL)
response.end()

 

 

 

Logo após o Insert, fiz isso:

 

<%gravado=replace(server.HTMLEncode(arrayLinha(4)),"'","")%>

e Depois dei um response:

response.Write(gravado)

Recebi este retorno:

RUA TUFI ABRÃO TALLES, 56

 

É... veio com acentuação,certinho...

Agora não sei porque está gravando com aqueles caracteres doidos no banco.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Uma sugestão que lhe dou é não usar o HTMLencode antes de inserir os registros

 

Isso que faz gravar com os "caracteres estranhos" no banco

 

O problema não é esse mas o seu uso lhe faz ter um desperdício de espaço sem necessidade

 

Pode fazer este tratamento no momento de visualizar os valores

 

Outra coisa como sabes que é este valor que colocou em gravado que está dando erro se tem vários outros

 

Precisa mandar escrever tudo

Compartilhar este post


Link para o post
Compartilhar em outros sites

Erro de "acentuação" em 99% dos casos são pela charset da página, provavelmente seu servidor de hospedagem mantem o padrão americano e com isso o "o erro".

 

 

Nos meus ASP ja tive como padrão sempre colocar as linhas abaixo logo no inicio

 

Response.Charset="iso-8859-1"

SESSION.LCID=1046

Response.AddHeader "pragma","no-cache"

Response.AddHeader "cache-control","private"

Response.Buffer = True

Response.ExpiresAbsolute = Now() - 1

Response.Expires = 0

Response.CacheControl = "no-cache"

 

você pode criar um include para elas, facilitam o uso.

 

isso faz com que o charset seja o BR e tb que o pais seja Brasil, tb faz com que a página não seja salva em cache, resolvendo problemas monetários, indiomas e com cache no uso junto com ajax.

 

Deve resolver o seu problema dessa forma.

 

Uma sugestão que lhe dou é não usar o HTMLencode antes de inserir os registros

 

Isso que faz gravar com os "caracteres estranhos" no banco

 

O problema não é esse mas o seu uso lhe faz ter um desperdício de espaço sem necessidade

 

Pode fazer este tratamento no momento de visualizar os valores

 

Outra coisa como sabes que é este valor que colocou em gravado que está dando erro se tem vários outros

 

Precisa mandar escrever tudo

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

Uma sugestão que lhe dou é não usar o HTMLencode antes de inserir os registros

 

Isso que faz gravar com os "caracteres estranhos" no banco

 

O problema não é esse mas o seu uso lhe faz ter um desperdício de espaço sem necessidade

 

Pode fazer este tratamento no momento de visualizar os valores

 

Outra coisa como sabes que é este valor que colocou em gravado que está dando erro se tem vários outros

 

Precisa mandar escrever tudo

 

Então Mário, quando mando escrever tudo dá o erro de buffer

Provider=MSDASQL.1;Extended Properties="DBQ=C:\Inetpub\wwwroot\teste\RPPS\teste11\Adm\importacao\dadados.mdb;Driver={Microsoft Access Driver (*.mdb)};DriverId=25;FIL=MS Access;MaxBufferSize=2048;PageTimeout=5;"
daí o motivo de trazer só uma linha...Eu peguei justo uma das linhas que estão com problema..

Agora enquanto ao HTMLEncode, vou seguir sua dica: não vou usá-lo na gravação no banco, mas somente na visualização dos dados.

Compartilhar este post


Link para o post
Compartilhar em outros sites

o que está mandando escrever exatamente?

Compartilhar este post


Link para o post
Compartilhar em outros sites

Erro de "acentuação" em 99% dos casos são pela charset da página, provavelmente seu servidor de hospedagem mantem o padrão americano e com isso o "o erro".

 

 

Nos meus ASP ja tive como padrão sempre colocar as linhas abaixo logo no inicio

 

Response.Charset="iso-8859-1"

SESSION.LCID=1046

Response.AddHeader "pragma","no-cache"

Response.AddHeader "cache-control","private"

Response.Buffer = True

Response.ExpiresAbsolute = Now() - 1

Response.Expires = 0

Response.CacheControl = "no-cache"

 

você pode criar um include para elas, facilitam o uso.

 

isso faz com que o charset seja o BR e tb que o pais seja Brasil, tb faz com que a página não seja salva em cache, resolvendo problemas monetários, indiomas e com cache no uso junto com ajax.

 

Deve resolver o seu problema dessa forma.

 

 

 

Certo Felipe,

 

Muito útil sua dica... vou adotar por padrão em minha programação.

Compartilhar este post


Link para o post
Compartilhar em outros sites

o que está mandando escrever exatamente?

 

 

 

quando deu o erro, foi neste Insert:

conexao.execute "INSERT INTO titular (nome, cidade, uf, endereco, cep, bairro, data_nascimento, cpf, rg, codestadocivil, pai, mae, naturalidade, nacionalidade, matricula, codentidade) VALUES   ('"&replace(server.HTMLEncode(arrayLinha(1)),"'","")&"', '"&replace(server.HTMLEncode(arrayLinha(2)),"'","")&"', '"&replace(server.HTMLEncode(arrayLinha(3)),"'","")&"', '"&replace(server.HTMLEncode(arrayLinha(4)),"'","")&"', '"&replace(server.HTMLEncode(arrayLinha(5)),"'","")&"', '"&replace(server.HTMLEncode(arrayLinha(6)),"'","")&"', '"&replace(server.HTMLEncode(arrayLinha(7)),"'","")&"', '"&replace(server.HTMLEncode(arrayLinha(8)),"'","")&"', '"&replace(server.HTMLEncode(arrayLinha(9)),"'","")&"', "&replace(server.HTMLEncode(arrayLinha(10)),"'","")&", '"&replace(server.HTMLEncode(arrayLinha(11)),"'","")&"', '"&replace(server.HTMLEncode(arrayLinha(12)),"'","")&"', '"&replace(server.HTMLEncode(arrayLinha(13)),"'","")&"', '"&replace(server.HTMLEncode(arrayLinha(14)),"'","")&"', '"&replace(server.HTMLEncode(arrayLinha(15)),"'","")&"', "&replace(server.HTMLEncode(arrayLinha(16)),"'","")&")"

mandei escrever isso:

response.Write(conexao)
response.End

Compartilhar este post


Link para o post
Compartilhar em outros sites

Está errado

 

Ponha

 

Response.write("INSERT INTO titular (nome, cidade, uf, endereco, cep, bairro, data_nascimento, cpf, rg, codestadocivil, pai, mae, naturalidade, nacionalidade, matricula, codentidade) VALUES ('"&replace(server.HTMLEncode(arrayLinha(1)),"'","")&"', '"&replace(server.HTMLEncode(arrayLinha(2)),"'","")&"', '"&replace(server.HTMLEncode(arrayLinha(3)),"'","")&"', '"&replace(server.HTMLEncode(arrayLinha(4)),"'","")&"', '"&replace(server.HTMLEncode(arrayLinha(5)),"'","")&"', '"&replace(server.HTMLEncode(arrayLinha(6)),"'","")&"', '"&replace(server.HTMLEncode(arrayLinha(7)),"'","")&"', '"&replace(server.HTMLEncode(arrayLinha(8)),"'","")&"', '"&replace(server.HTMLEncode(arrayLinha(9)),"'","")&"', "&replace(server.HTMLEncode(arrayLinha(10)),"'","")&", '"&replace(server.HTMLEncode(arrayLinha(11)),"'","")&"', '"&replace(server.HTMLEncode(arrayLinha(12)),"'","")&"', '"&replace(server.HTMLEncode(arrayLinha(13)),"'","")&"', '"&replace(server.HTMLEncode(arrayLinha(14)),"'","")&"', '"&replace(server.HTMLEncode(arrayLinha(15)),"'","")&"', "&replace(server.HTMLEncode(arrayLinha(16)),"'","")&")")

 

Mas repito é melhor tirar estes encodes todos neste momento pois lhe dará mais espaço usado no db a toa

Compartilhar este post


Link para o post
Compartilhar em outros sites

Está errado

 

Ponha

 

Response.write("INSERT INTO titular (nome, cidade, uf, endereco, cep, bairro, data_nascimento, cpf, rg, codestadocivil, pai, mae, naturalidade, nacionalidade, matricula, codentidade) VALUES ('"&replace(server.HTMLEncode(arrayLinha(1)),"'","")&"', '"&replace(server.HTMLEncode(arrayLinha(2)),"'","")&"', '"&replace(server.HTMLEncode(arrayLinha(3)),"'","")&"', '"&replace(server.HTMLEncode(arrayLinha(4)),"'","")&"', '"&replace(server.HTMLEncode(arrayLinha(5)),"'","")&"', '"&replace(server.HTMLEncode(arrayLinha(6)),"'","")&"', '"&replace(server.HTMLEncode(arrayLinha(7)),"'","")&"', '"&replace(server.HTMLEncode(arrayLinha(8)),"'","")&"', '"&replace(server.HTMLEncode(arrayLinha(9)),"'","")&"', "&replace(server.HTMLEncode(arrayLinha(10)),"'","")&", '"&replace(server.HTMLEncode(arrayLinha(11)),"'","")&"', '"&replace(server.HTMLEncode(arrayLinha(12)),"'","")&"', '"&replace(server.HTMLEncode(arrayLinha(13)),"'","")&"', '"&replace(server.HTMLEncode(arrayLinha(14)),"'","")&"', '"&replace(server.HTMLEncode(arrayLinha(15)),"'","")&"', "&replace(server.HTMLEncode(arrayLinha(16)),"'","")&")")

 

Mas repito é melhor tirar estes encodes todos neste momento pois lhe dará mais espaço usado no db a toa

 

 

Oh Mário, mil desculpas pelo meu amadorismo, rsrsrs não estava sabendo nem colocar o response.write na sql... rsrsrsr

 

Agora consegui visualizar os dados que estão sendo enviado no Insert..

 

E quanto ao Encode, retirei, e adivinha, agora gravou as acentuações certinho...

 

Então quando eu for visualizar os dados eu uso o encode (somente neste caso).

 

É... valeu mesmo. muito obrigado.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Então

 

Usando o encode na hora de visualizar você evita alguns tipos de ataques

 

É bom fazer, agora usar antes de enviar ao db não é bom

 

Resolvido?

Compartilhar este post


Link para o post
Compartilhar em outros sites

use também a funçãoabaixo para retirar qualquer caracter nao permitido antes de dar o INSERT

 

Function SafeSQL(sInput)
  TempString = sInput
  'sBadChars=array("select", "drop", ";", "--", "insert", "delete", "xp_", "#", "%", "&", "'", "(", ")", "/", "\", ":", ";", "<", ">", "=", "[", "]", "?", "`", "|") 
  sBadChars=array("select", "drop", ";", "--", "insert", "delete", "xp_", "#", "%", "&", "'", "(", ")", ":", ";", "<", ">", "=", "[", "]", "?", "`", "|") 
  For iCounter = 0 to uBound(sBadChars)
    TempString = replace(TempString,sBadChars(iCounter),"")
  Next
  SafeSQL = TempString
End function

Compartilhar este post


Link para o post
Compartilhar em outros sites

Vocês adoram usar essa função para "tenta" evitar sql injection, fico me perguntando se sabem realmente o que é um SQL INJECTION,

 

Com a função passada, caracteres como # param de ser gravados, logo uma simples <a href="#"> já não mais funcionaria.

Você também manda remover caracteres como : ou =, qual utilidade disso? e para que tantos danos as possiveis registros?

 

Eu não poderia mais escrever uma simples frase no DB?

 

uma simples frase "um doce é != de salgado" já estaria sendo gravada no DB como "um doce é ! de salgado"

 

 

desculpe se pareço meio "grosso" na mensagem não é a intenção, apenas tentei fazer uma "observação" importante.

 

 

use também a funçãoabaixo para retirar qualquer caracter nao permitido antes de dar o INSERT

 

Function SafeSQL(sInput)
  TempString = sInput
  'sBadChars=array("select", "drop", ";", "--", "insert", "delete", "xp_", "#", "%", "&", "'", "(", ")", "/", "\", ":", ";", "<", ">", "=", "[", "]", "?", "`", "|") 
  sBadChars=array("select", "drop", ";", "--", "insert", "delete", "xp_", "#", "%", "&", "'", "(", ")", ":", ";", "<", ">", "=", "[", "]", "?", "`", "|") 
  For iCounter = 0 to uBound(sBadChars)
    TempString = replace(TempString,sBadChars(iCounter),"")
  Next
  SafeSQL = TempString
End function

Compartilhar este post


Link para o post
Compartilhar em outros sites

Com a função passada, caracteres como # param de ser gravados, logo uma simples <a href="#">

para isso aconselhamos a usar uma função tipo BBCode, para quando for inserir caracteres HTML...

 

e se reparar direito na função o caracter ! é plenamente inserivel, ja uma simples frase "um doce é != de salgado" já estaria sendo gravada no DB como "um doce é ! de salgado", pode ser incluida , uma outra dica, para sites , que hoje não se deve usar simplificações de símbolos na lingua portuguesa, além de confundir o usuário, não fica estéticamente correto.

Compartilhar este post


Link para o post
Compartilhar em outros sites

Realmente fiz a troca na hora da escrita do ! pelo =, mas ainda afirmo é totalmente ridiculo a ideia de usar uma "função" generica de "filtros de palavras" para evitar SQL INJECTION é totalmente infundada, erronea e pode trazer sérios problemas para usuarios.

 

Não é nada pratica obrigar que os usuarios passem a usar "filtros NNCODE" principalmente em sistemas internos onde o usuario é leigo.

 

Volto afirmar o uso dessa função de forma "padrão" é totalmente irreal.

 

Com a função passada, caracteres como # param de ser gravados, logo uma simples <a href="#">

para isso aconselhamos a usar uma função tipo BBCode, para quando for inserir caracteres HTML...

 

e se reparar direito na função o caracter ! é plenamente inserivel, ja uma simples frase "um doce é != de salgado" já estaria sendo gravada no DB como "um doce é ! de salgado", pode ser incluida , uma outra dica, para sites , que hoje não se deve usar simplificações de símbolos na lingua portuguesa, além de confundir o usuário, não fica estéticamente correto.

 

Compartilhar este post


Link para o post
Compartilhar em outros sites

×

Informação importante

Ao usar o fórum, você concorda com nossos Termos e condições.