Olá amigos(as). Peguei esse script aqui no Script Brasil "Cadastro com ativação por e-mail" com CDONTS e o adaptei para utilizar CDOSYS. Ele cadastrA os dados do usuário e envia o e-mail de confirmação normalmente, ou seja, está tudo funcionando ok, porém, se o usuário resolve colocar um login que já existe na base de dados (access), ocorre o seguinte erro:
The changes you requested to the table were not successful because they would create duplicate values in the index, primary key, or relationship. Change the data in the field or fields that contain duplicate data, remove the index, or redefine the index to permit duplicate entries and try again.
Não sei porque quando ele verifique que o login já existe o "If err.number <>0" não é capturado e redirecionado para "Response.redirect("aviso.asp")" ou, nem mesmo o Call Erro("Já existe um usuário cadastrado com esse nome",Err.description), recupera a página.
O banco de dados tem a chave primária como "AutoNumerica" e a coluna login não permite duplicação de dados.
Seria preciso criar uma regra de validação no banco de dados que é em access?
Se for preciso? Como faria essa regra?
Ou o código está incorreto?
Há outra forma de fazer isso, para que a mensagem de "login já existente" apareça?
site = "www.meusite.com.br" 'aqui vem o nome do seu site
seumail = "faleconosco@meusite.com.br" 'aqui o e-mail de quem está enviando a chave de ativação para o usuário
'abaixo as variáveis criadas para cara requisição dos formulários da página cadastro.asp
Login = Request.form("txtLogin")
Senha = Request.form("txtSenha")
email = Request.form("txtMail")
Ende = Request.form("txtEnd")
Num = Request.form("txtNum")
Endereco = Ende&", "&Num 'aqui é uma montagem do endereço, "Ende" é o endereço seguido de vírgula ", " e acrescentado o número "Num".
Cep1 = Request.form("txtCep1")
Cep2 = Request.form("txtCep2")
Cep = Cep1&"-"&Cep2 'mesmo idéia de cima
Cidade = Request.form("txtCidade")
Estado = Request.form("txtEstado")
Tel = Request.form("txtDDD") &"-"& Request.form("txtFone")
DDD = Request.form("txtFone")
Nome = Request.form("txtNome")
codigo = day(date)&month(date)&year(date)&"abc"&Login&month(date)&year(date)&minute(date) 'aqui é o código que irá ser enviando para o usuário, poderia ser qualquer coisa, desde de que respeite um diferencial dos demais, teria ques er randômico, ou ter algo que o diferendcie dos demais...como no exemplo, tem o "Login" mais algumas datas e umas letras abc só para enrolar, poderia por um código para cada tempo, se quiser incrementar...
não = "não" 'esse não é que vai decidir se o usuário está livre para navegar nas páginas restritas... quando ele terminar de cadastar ativando seu cadastro pelo e-mail, aí ele terá uma atualização para 'sim'.
data = day(date)&"/"&month(date)&"/"&year(date) 'aqui a data que foi efetuado o cadastro
IP = Request.ServerVariables("REMOTE_ADDR") 'aqui é o IP da máquina de quem efetuou o cadastro
if Request.form("txtNome") = "" then 'caso a pessoa não coloque o nome, a mensagem de boas vindas no e-mail, irá ser para o login do usuário
user = Login
else
user = Nome
end if
corpo = "Olá "&user&","& vbcrlf
corpo = corpo & vbcrlf
corpo = corpo & vbcrlf
corpo = corpo & "Agora só precisa ativar seu cadastro, clique no link abaixo para fazê-lo:"& vbcrlf
corpo = corpo & "Caso o link não esteja ativo, copie o link acima utilizando o comando Ctrl+C para copiar e Ctrl+V para colar em seu navegador." & vbcrlf
corpo = corpo & vbcrlf
corpo = corpo & "Para ter acesso ao conteúdo exclusivo dos participantes, guarde as informações baixo." & vbcrlf
Response.redirect("enviado_cadastro.asp") 'redireciona para uma página que avise que a chave de ativação foi enviada no e-mail do destinatário.
on error resume next
if Err.number <> 0 then
Call Erro("Já existe um usuário cadastrado com esse nome",Err.description)
end if
'no caso de haver um erro, pode se fazer uma página "aviso.asp" avisando do erro com um "meta refresh redirect de 8 segundos, mais ou menos", logo em seguida redirecionando para o cadastro.asp
Pergunta
Guest Carlito
Olá amigos(as). Peguei esse script aqui no Script Brasil "Cadastro com ativação por e-mail" com CDONTS e o adaptei para utilizar CDOSYS. Ele cadastrA os dados do usuário e envia o e-mail de confirmação normalmente, ou seja, está tudo funcionando ok, porém, se o usuário resolve colocar um login que já existe na base de dados (access), ocorre o seguinte erro:
------------------- erro-----------------------------------------------------
Microsoft JET Database Engine error '80004005'
The changes you requested to the table were not successful because they would create duplicate values in the index, primary key, or relationship. Change the data in the field or fields that contain duplicate data, remove the index, or redefine the index to permit duplicate entries and try again.
/cadastro/cadastrar.asp, line 144
--------------------fim erro-------------------------------------------------
-------------------código parcial--------------------------------------------
'é aberta a conexao
Call abreConexao
Set rsInsert = conexao.Execute(strInsert) <------------ Line 144
'é fechada
Call fechaConexao
Set rsInsert = Nothing
Response.redirect("enviado_cadastro.asp") 'redireciona para uma página que avise que a chave de ativação foi enviada no e-mail do destinatário.
On Error Resume Next
If err.number <> 0 then
Response.redirect("aviso.asp")
end if
----------------fim código parcial-------------------------------------
Não sei porque quando ele verifique que o login já existe o "If err.number <>0" não é capturado e redirecionado para "Response.redirect("aviso.asp")" ou, nem mesmo o Call Erro("Já existe um usuário cadastrado com esse nome",Err.description), recupera a página.
O banco de dados tem a chave primária como "AutoNumerica" e a coluna login não permite duplicação de dados.
Seria preciso criar uma regra de validação no banco de dados que é em access?
Se for preciso? Como faria essa regra?
Ou o código está incorreto?
Há outra forma de fazer isso, para que a mensagem de "login já existente" apareça?
AGRADEÇO QUEM PUDER ME AJUDAR.
-------------Código completo-----------------------------------------
<!--#include file="conexao.asp"-->
<%
Dim conexao
site = "www.meusite.com.br" 'aqui vem o nome do seu site
seumail = "faleconosco@meusite.com.br" 'aqui o e-mail de quem está enviando a chave de ativação para o usuário
'abaixo as variáveis criadas para cara requisição dos formulários da página cadastro.asp
Login = Request.form("txtLogin")
Senha = Request.form("txtSenha")
email = Request.form("txtMail")
Ende = Request.form("txtEnd")
Num = Request.form("txtNum")
Endereco = Ende&", "&Num 'aqui é uma montagem do endereço, "Ende" é o endereço seguido de vírgula ", " e acrescentado o número "Num".
Cep1 = Request.form("txtCep1")
Cep2 = Request.form("txtCep2")
Cep = Cep1&"-"&Cep2 'mesmo idéia de cima
Cidade = Request.form("txtCidade")
Estado = Request.form("txtEstado")
Tel = Request.form("txtDDD") &"-"& Request.form("txtFone")
DDD = Request.form("txtFone")
Nome = Request.form("txtNome")
codigo = day(date)&month(date)&year(date)&"abc"&Login&month(date)&year(date)&minute(date) 'aqui é o código que irá ser enviando para o usuário, poderia ser qualquer coisa, desde de que respeite um diferencial dos demais, teria ques er randômico, ou ter algo que o diferendcie dos demais...como no exemplo, tem o "Login" mais algumas datas e umas letras abc só para enrolar, poderia por um código para cada tempo, se quiser incrementar...
não = "não" 'esse não é que vai decidir se o usuário está livre para navegar nas páginas restritas... quando ele terminar de cadastar ativando seu cadastro pelo e-mail, aí ele terá uma atualização para 'sim'.
data = day(date)&"/"&month(date)&"/"&year(date) 'aqui a data que foi efetuado o cadastro
IP = Request.ServerVariables("REMOTE_ADDR") 'aqui é o IP da máquina de quem efetuou o cadastro
if Request.form("txtNome") = "" then 'caso a pessoa não coloque o nome, a mensagem de boas vindas no e-mail, irá ser para o login do usuário
user = Login
else
user = Nome
end if
corpo = "Olá "&user&","& vbcrlf
corpo = corpo & vbcrlf
corpo = corpo & vbcrlf
corpo = corpo & "Agora só precisa ativar seu cadastro, clique no link abaixo para fazê-lo:"& vbcrlf
corpo = corpo & "http://"&site&"/cadastro/cadastrar1.asp?id="&codigo& vbcrlf
corpo = corpo & vbcrlf
corpo = corpo & "Caso o link não esteja ativo, copie o link acima utilizando o comando Ctrl+C para copiar e Ctrl+V para colar em seu navegador." & vbcrlf
corpo = corpo & vbcrlf
corpo = corpo & "Para ter acesso ao conteúdo exclusivo dos participantes, guarde as informações baixo." & vbcrlf
corpo = corpo & vbcrlf
corpo = corpo & "Login: "& Login & vbcrlf
corpo = corpo & "Senha: "& Senha & vbcrlf
corpo = corpo & vbcrlf
corpo = corpo & "Para se logar visite o site através de http://"&site&"/cadastro/cadastro.asp" & vbcrlf
corpo = corpo & vbcrlf
corpo = corpo & "Obrigado por fazer parte da Vital Ritmus." & vbcrlf
corpo = corpo & vbcrlf
corpo = corpo & site & vbcrlf
'aqui irá enviar para o e-mail do usuário
'cria o objeto para o envio de e-mail
Set objCDOSYSMail = Server.CreateObject("CDO.Message")
'cria o objeto para configuração do SMTP
Set objCDOSYSCon = Server.CreateObject ("CDO.Configuration")
'SMTP
objCDOSYSCon.Fields("http://schemas.microsoft.com/cdo/configuration/smtpserver") = "mail.meusite.com.br"
'porta do SMTP
objCDOSYSCon.Fields("http://schemas.microsoft.com/cdo/configuration/smtpserverport") = 25
'porta do CDO
objCDOSYSCon.Fields("http://schemas.microsoft.com/cdo/configuration/sendusing") = 2
'timeout
objCDOSYSCon.Fields("http://schemas.microsoft.com/cdo/configuration/smtpconnectiontimeout") = 30
objCDOSYSCon.Fields.update
'atualiza a configuração do CDOSYS para o envio do e-mail
Set objCDOSYSMail.Configuration = objCDOSYSCon
'e-mail do remetente
objCDOSYSMail.From = seumail
'e-mail do destinatário
objCDOSYSMail.To = email
'assunto da mensagem
objCDOSYSMail.Subject = site&" - Chave para ativação de cadastro"
'conteúdo da mensagem
objCDOSYSMail.TextBody = corpo
'objCDOSYSMail.fields.update
'envia o e-mail
objCDOSYSMail.Send
'destrói os objetos
Set objCDOSYSMail = Nothing
Set objCDOSYSCon = Nothing
'aqui são preenchimentos dos espaços vazios, no caso do usuário não colocar tudo corretamente
if Endereco = ", " then
Endereco = "Sem endereço"
end if
if Cep = "-" then
Cep = "sem cep"
end if
if Cidade = "" then
Cidade = "sem cidade"
end if
if Estado = "" then
Estado = "sem estado"
end if
if Tel = "-" then
Tel = "sem telefone"
end if
if Nome = "" then
Nome = "sem nome"
end if
'aqui é inserido tudo na base
strInsert = " INSERT into usuarios "
strInsert = strInsert & "(nome, login, senha, email, cidade, estado, cep, endereco, telefone, data, libera, IP, codigo)"
strInsert = strInsert + "VALUES ('" + Nome + "',"
strInsert = strInsert + "'" + Login + "',"
strInsert = strInsert + "'" + Senha + "',"
strInsert = strInsert + "'" + email + "',"
strInsert = strInsert + "'" + Cidade + "',"
strInsert = strInsert + "'" + Estado + "',"
strInsert = strInsert + "'" + Cep + "',"
strInsert = strInsert + "'" + Endereco + "',"
strInsert = strInsert + "'" + Tel + "',"
strInsert = strInsert + "'" + data + "',"
strInsert = strInsert + "'" + não + "',"
strInsert = strInsert + "'" + IP + "',"
strInsert = strInsert + "'" + codigo + "')"
'é aberta a conexao
Call abreConexao
Set rsInsert = conexao.Execute(strInsert)
'é fechada
Call fechaConexao
Set rsInsert = Nothing
Response.redirect("enviado_cadastro.asp") 'redireciona para uma página que avise que a chave de ativação foi enviada no e-mail do destinatário.
on error resume next
if Err.number <> 0 then
Call Erro("Já existe um usuário cadastrado com esse nome",Err.description)
end if
'no caso de haver um erro, pode se fazer uma página "aviso.asp" avisando do erro com um "meta refresh redirect de 8 segundos, mais ou menos", logo em seguida redirecionando para o cadastro.asp
'If err.number <> 0 then
'Response.redirect("aviso.asp")
'end if
%>
Link para o comentário
Compartilhar em outros sites
1 resposta a esta questão
Posts Recomendados
Participe da discussão
Você pode postar agora e se registrar depois. Se você já tem uma conta, acesse agora para postar com sua conta.