Inquiridor
UPDATE com MYSQL e ASP

Discussão Geral
-
Olá, boa tarde!
Tenho um código que se comunica normalmente com a base MYSQL e carrega os valores em string's e em um determinando momento do código, e deve atualizar a base de dados com + 1 para um contador de visitas. Acontece que na hora em que ele vai efetivamente atualizar, dá o seguinte erro abaixo:
Microsoft OLE DB Provider for ODBC Drivers error '80040e09'
[TCX][MyODBC]You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '2 = 1 where ano = 2017' at line 1
E e está carregando os valores certinhos, veja: onde está ..."near '2 é que ele está carregando o mês 2 e o = significa que ele vai somar + 1 ao mês do ano de 2017.
abaixo segue o código:
totalMes = RsTotalMes(vMes) + 1 cnnDB.execute = "update db_mes set "& vMes &" = "& totalMes &" where ano = "& RsTotalMes("ano") &"" set RsMes = cnnDB.execute(altera_mes)
alguém pode me ajudar em como fazer essa atualização?
abs
Carlos Henrique
Todas as Respostas
-
Parece que a variável vMes está armazenando o número 2 ao invés do nome da coluna no banco de dados. Faça o teste abaixo para comprovar.
totalMes = RsTotalMes(vMes) + 1 Response.Write "update db_mes set "& vMes &" = "& totalMes &" where ano = "& RsTotalMes("ano") &"" cnnDB.execute = "update db_mes set "& vMes &" = "& totalMes &" where ano = "& RsTotalMes("ano") &"" set RsMes = cnnDB.execute(altera_mes)
João Paulo Gomes
-
Olá João,
Obrigado por responder!
Então, vamos lá!
A variável vMes pega o número do mês atual e compara com o banco que são números também, assim: janeiro = 1, fevereiro = 2,...
a variável total mês recebe o valor total da coluna 2 que no caso é fevereiro e está vazia, ou seja, 0 e então recebe um incremento de + 1. Feito isso, ele continua e busca o ano e a variável RsTotalMes("ano") vai carregar exatamente o ano atual vigente automaticamente e atualizar o dado.
Eu coloquei a instrução que você me deu acima e retornou o seguinte erro:
update db_mes set 2 = 1 where ano = 2017Microsoft OLE DB Provider for ODBC Drivers error '80040e09'
[TCX][MyODBC]You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near '2 = 1 where ano = 2017' at line 1
/combo1/contador/conta1.asp, line 43
Abaixo, vou colocar toda a página para que entenda melhor e construção do raciocínio do conteúdo.
<!--#include file="conexao.asp" --> <% Session.LCID = 1046 dim RsRevisitas, RsVisitas, RsMes, RsDia, RsTotalMes, RsTotalDia, RsIn, vSQL dim vData, aData, vDia, vMes, vAno, totalMes, totalDia, totalAno, x vData = FormatDateTime(Date(), 2) aData = Split(vData, "/") vDia = Trim(aData(0)) vMes = Trim(aData(1)) vAno = Trim(aData(2)) %> <% '1.2 - aqui estes selects pegarão a quantidade de visitantes por mês e dia respectivamente. vSQL = "select * from db_mes order by ano desc" set RsTotalMes = cnnDB.execute(vSQL) totalAno = RsTotalMes(1) + RsTotalMes(2) + RsTotalMes(3) + RsTotalMes(4) + RsTotalMes(5) + RsTotalMes(6) +_ RsTotalMes(7) + RsTotalMes(8) + RsTotalMes(9) + RsTotalMes(10) + RsTotalMes(11) + RsTotalMes(12) vSQL = "select * from db_dia where "& vDia &" = "& vDia &" and mes = "& vMes & " and ano = '" & vAno &"' " set RsTotalDia = cnnDB.execute(vSQL) '1.3 se o ano atual for maior que o ano que está sendo selecionado, inserimos mais um conjunto de 12 meses no banco. até aqui funciona tudo certinho. if vAno > RsTotalMes("ano") then for x = 1 to 12 vSQL = "Insert into db_dia (mes,ano) values ("& x &", "& vAno &")" set RsIn = cnnDB.execute(vSQL) set RsIn = nothing next vSQL = "insert into db_mes (ano) values("& vAno &")" set RsIn = cnnDB.execute(vSQL) end if 'ate aqui vai bem, daqui pra baixo não atualiza o banco. dá o erro descrito na mensagem. 'aqui ele pegaria os valores das tabelas de acordo com o mês vigente e o dia e o ano, veria qual o registro atual, faria o incremento de 'mais um e atualizaria. Só que não rola. totalMes = RsTotalMes(vMes) + 1 Response.Write "update db_mes set "& vMes &" = "& totalMes &" where ano = "& RsTotalMes("ano") &"" cnnDB.execute = "update db_mes set "& vMes &" = "& totalMes &" where ano = "& RsTotalMes("ano") &"" set RsMes = cnnDB.execute(altera_mes) 'totalMes = RsTotalMes(vMes) + 1 'cnnDB.execute = "update db_mes set "& vMes &" = "& totalMes &" where ano = "& RsTotalMes("ano") &"" 'set RsMes = cnnDB.execute(altera_mes) 'totalDia = RsTotalDia(vDia) + 1 'altera_dia = "update db_dia set "& vDia &" = "& totalDia &" where mes = "& vMes &" and ano = '"& vAno &"' " 'set RsDia = cnnDB.execute(altera_dia) %>
-
Pela sua descrição, provavelmente o correto seria:
update db_mes set total_mes = 2 where ano = 2017 and mes = 1
Mas ao invés disso você está tentando atribuir o valor 2 para o valor 1.
update db_mes set 2 = 1 where ano = 2017
No lugar de 2= 1, deveria ser o nome da coluna igual ao valor, exemplo: total_mes = 1
João Paulo Gomes
-
Então João, no caso não!
Veja: a variável "totalmes" vai carregar o valor atual da coluna "2" que é igual a fevereiro do ano de 2017 e vai incrementar +1. Então digamos que neste mês já tivéssemos 535 visitas, agora ele somaria mais 1 e passaria a ter o valor de 536. Vou anexar um print do banco para que entenda melhor.
abs
-
Entendi cara, você usou números nos nomes das tabelas. Essa não é uma boa prática, você tem duas opções:
1. Renomear as colunas para m1, m2, etc
2. Alterar a query para ficar assim:
update db_mes set "2" = 1 where ano = 2017
Se não funcionar dessa forma, tente assim:
update db_mes set `2` = 1 where ano = 2017
João Paulo Gomes
- Editado John Owl quinta-feira, 16 de fevereiro de 2017 12:25
-
Olá João, boa tarde!
Irmão, seguindo sua sugestão, alterei os nomes das tabelas no banco para m1, m2, m3.... e alterei também as dos dias no banco para d1, d2, d3,...
Peguei os valores da data, concatenei e foi.
Graças a Deus e a você pela boa vontade em me ajudar. Vou colocar abaixo o código como ficou para futuras pesquisas. Mais uma vez, obrigado!
<!--#include file="conexao.asp" --> <% Session.LCID = 1046 dim RsRevisitas, RsVisitas, RsMes, RsDia, RsTotalMes, RsTotalDia, RsIn, vSQL dim vData, aData, vDia, vMes, vAno, totalMes, totalDia, totalAno, x vData = FormatDateTime(Date(), 2) aData = Split(vData, "/") vDia = Trim(aData(0)) vMes = Trim(aData(1)) vAno = Trim(aData(2)) %> <% vSQL = "select * from db_mes order by ano desc" set RsTotalMes = cnnDB.execute(vSQL) totalano = 0 totalAno = totalAno + RsTotalMes("m1") + RsTotalMes("m2") + RsTotalMes("m3") + RsTotalMes("m4") + RsTotalMes("m5") + RsTotalMes("m6") +_ RsTotalMes("m7") + RsTotalMes("m8") + RsTotalMes("m9") + RsTotalMes("m10") + RsTotalMes("m11") + RsTotalMes("m12") vSQL = "select * from db_dia where "& vDia &" = "& vDia &" and mes = "& vMes & " and ano = '" & vAno &"' " set RsTotalDia = cnnDB.execute(vSQL) if vAno > RsTotalMes("ano") then for x = 1 to 12 vSQL = "Insert into db_dia (mes,ano) values ("& x &", "& vAno &")" set RsIn = cnnDB.execute(vSQL) set RsIn = nothing next vSQL = "insert into db_mes (ano) values("& vAno &")" set RsIn = cnnDB.execute(vSQL) end if 'aqui entra uma consulta de cookies para contabilizar apenas um acesso por IP if Request.Cookies("IP")("UsuarioIP") = request.servervariables("REMOTE_ADDR") then else 'aqui atualiza a tabela mensal a=vmes b="m" mes=b&a totalMes = RsTotalMes(mes) + 1 cnnDB.execute = "update db_mes set "&mes&" = "& totalMes &" where ano = "& RsTotalMes("ano") &"" 'aqui atualiza a diaria c=vdia d="d" dia=d&c totalDia = RsTotalDia(dia) + 1 cnnDB.execute = "update db_dia set "&dia&" = "& totalDia &" where mes = "& vMes &" and ano = '"& vAno &"' " Response.Cookies("IP")("UsuarioIP") = request.servervariables("REMOTE_ADDR") end if %>
-