Jump to content


Photo

Como Dar Feedback Ao Usuário Em Script De Esqueci A Senha


  • Faça o login para participar
7 replies to this topic

#1 marcosbin

marcosbin

    Turista

  • Usuários
  • 36 posts
  • Sexo:Não informado

Posted 09/03/2010, 11:22

Olá amigos

Desenvolvi um script para que o usuário receba, por e-mail, a senha cadastrada em um formulário, caso a tenha esquecido. A recuperação dos dados e o envio do e-mail funcionam perfeitamente, pelo menos no meu servidor. Mas não consigo deixar a mensagem de feedback para o usuário. Quando ele clica no botão de submit, a página é redirecionada para o index automaticamente sem aparecer a msg de erro ou acerto. Já tentei corrigir isso usando âncora (HTML), header (PHP), window.location (javascript), e nada. Em resumo, quero o seguinte:

1 – Depois que o usuário clicar em enviar, não redirecionar a página para o index, mas ficar em “senha.php” (página do form), onde deverá aparecer a msg de erro ou acerto.
2 – Surgir uma msg de erro se o campo email estiver vazio (com validação em PHP, não em javascript) ou se o email não estiver cadastrado no banco de dados.
3 – Surgir uma msg de acerto se o email estiver cadastrado e se a senha for enviada corretamente.

Alguém pode me ajudar? Segue o código comentado:

senha.php

<?php include("recuperasenha.php"); // onde fica o código para recuperar os campos email e senha ?>
<html>
<head>...</head>
<body>
<form name="senha" action="<?php $_SERVER['PHP_SELF'];?>" method="post">
E-mail:<br />
<input type="text" name="email " size="40" /><br />
<br />
<input type="submit" name="submit" value="OK" />
</form>
<?php $erro ?> //aqui, quero que apareça a msg de feedback
</body>
</html>

recuperasenha.php

<?php include("conexao.php"); // arquivo de conexão com o banco de dados. Está funcionando, então não vou detalhá-lo
$email = $_POST['email'];$query = mysql_query("SELECT * FROM minhatabela WHERE email = '".$email."'", $conexao); // aqui e nas duas linhas abaixo, eu consulto o banco pra saber se o email existe e se a senha é equivalente ao email
if ($rs = mysql_fetch_array($query)){
$senha_banco = $rs["senha"];
}else{
$erro = "Seu e-mail não consta em nossa base de dados! "; // aqui eu quero definir a mensagem que vai aparecer se o email não estiver no banco. Mas acho que está errado, pois desta forma a msg já aparece qdo a pessoa entra na página, não precisa nem digitar o email
}
$msg = "<font face='Verdana' size='2'>Recuperação de senha</font><br /><br />";
$msg .= "<font face='Verdana' size='2'><strong>Sua senha é:</strong> $senha_banco</font><br /><br />"; // este código funciona perfeitamente, mesmo sem o ponto antes da variável
$mensagem = $msg;
$destinatario = $email;
$assunto = "Recuperação de senha";
$headers = "Content-type: text/html; charset=iso-8859-1";
$headers .= "Bcc: meuemail@meudominio.com";
if($submit){
ini_set('sendmail_from', 'postmaster@meudominio.com); // este código é exigido pelo meu servidor
mail($destinatario, $assunto, $mensagem, $headers);
$erro = "Mensagem enviada com sucesso"; // mensagem de feedback para acerto, que não funciona. Além disso, a partir daqui a página é direcionada automaticamente para o index.php, embora eu tenha tentado alguns comandos para ficar em senha.php
}
?>

#2 digo

digo

    24 Horas

  • Usuários
  • 435 posts
  • Sexo:Masculino

Posted 09/03/2010, 11:48

Fala Marcos,

Faltou o echo pra exibir o erro

senha.php
<?php 

if(isset($_POST["enviar_senha"]));

include("recuperasenha.php"); // onde fica o código para recuperar os campos email e senha 

}

?>
<html>
<head>...</head>
<body>
<form name="senha" action="<?php $_SERVER['PHP_SELF'];?>" method="post">
E-mail:<br />
<input type="text" name="email " size="40" /><br />
<br />
<input type="submit" name="enviar_senha" value="OK" />
</form>
<?php echo $erro; ?> //aqui, quero que apareça a msg de feedback
</body>
</html>

Fiz umas modificações

[]'s

Edição feita por: digo, 09/03/2010, 11:48.


#3 marcosbin

marcosbin

    Turista

  • Usuários
  • 36 posts
  • Sexo:Não informado

Posted 09/03/2010, 14:37

Oi digo, blz? Valeu pela resposta rápida. Eu não coloquei o echo no erro pq, dessa forma, a msg aparecia mesmo sem o cara digitar o e-mail e clicar em enviar. Vou testar suas correções e darei resposta. Obrigado de novo. Abs

Oi digo

Não funcionou. Não acontece nenhuma das 3 coisas que eu queria.

#4 Crab

Crab

    Da paz, mas preparado para Guerra

  • Ex-Admins
  • 2521 posts
  • Sexo:Masculino
  • Localidade:Florianópolis - SC
  • Interesses:Desenvolvimento Gráfico e Web.

Posted 09/03/2010, 15:01

A intenção do Digo foi boa e estava no caminho certo, mas marcos, teu cod tem muitos erros de lógica.

Tente assim que se eu não esqueci de nada vai funcionar:

senha.php

<html>
<head>...</head>
<body>

<?php 

if (isset($_POST['submit'])){

    include("recuperasenha.php");

}

?>

<form name="senha" action="<?php $_SERVER['PHP_SELF'];?>" method="post">

    E-mail:<br />
    <input type="text" name="email " size="40" /><br /><br />

    <input type="submit" name="submit" value="OK" />

</form>

</body>
</html>


recuperasenha.php

<?php

include "conexao.php";

$email = $_POST['email'];

$query = mysql_query("SELECT * FROM minhatabela WHERE email = '".$email."'");

if (mysql_num_rows($query) > 0){

    $senha_banco = $rs['senha'];

    $msg = "<font face=\"Verdana\" size=\"2\">Recuperação de senha</font><br /><br />";
    $msg .= "<font face=\"Verdana\" size=\"2\"><strong>Sua senha é:</strong>".$senha_banco."</font><br /><br />";

    $destinatario = $email;
    $assunto = "Recuperação de senha";
    $headers = "Content-type: text/html; charset=iso-8859-1";
    $headers .= "Bcc: meuemail@meudominio.com";

    ini_set('sendmail_from', 'postmaster@meudominio.com');

    mail($destinatario, $assunto, $mensagem, $headers);

    $erro = "Mensagem enviada com sucesso";
}
else{

    $erro = "Seu e-mail não consta em nossa base de dados!";

}

?>


Analise bem o que eu fiz e como estava o seu e tente entender a lógica, que na verdade foi onde mais errou no seu código, lógica.

(y)Até mais

#5 marcosbin

marcosbin

    Turista

  • Usuários
  • 36 posts
  • Sexo:Não informado

Posted 09/03/2010, 17:12

E aí, Crab, blz?

Cara, valeu. Entendi bem seu script e vc tinha toda razão. É que a gente vai juntando pedaços de código aqui e ali e acaba com um produto final todo remendado (e errado).

Seu código estava quase perfeito. A senha não estava mais chegando no e-mail, pq faltou definir o "$rs", fazendo o comando mysql_fetch_array. Além disso, vc tirou o trecho em que eu definia $mensagem como igual a $msg, no arquivo recuperarsenha.php, e faltou o echo $erro no senha.php.

Já o meu código tinha um erro no HTML, que eu não publiquei aqui - em outra página, para forçar o encerramento da sessão ao fechar o browser, pus um comando no body que me levava para o arquivo sair.php (de logout). Eu aproveitei esse código e, por isso, era redirecionado para a index.

Para quem estiver lendo esta página e for ainda mais iniciante do que eu, vale lembrar que estou definindo o charset como iso-8859-1. Então, para funcionar corretamente em todos os webmails, é preciso trocar os acentos pelos caracteres especiais.

Ao final, ficam assim os arquivos corretos:

senha.php

<html>
<head>...</head>
<body>
<?php if (isset($_POST['submit'])){
	include("recuperasenha.php");
}
?>
<form name="senha" action="<?php $_SERVER['PHP_SELF'];?>" method="post">
E-mail:<br />
<input type="text" name="email " size="40" /><br /><br />
<input type="submit" name="submit" value="OK" />
</form>
<?php echo $erro ?>
</body>
</html>

recuperasenha.php

<?php

include("conexao.php");

$email = $_POST['email'];

$query = mysql_query("SELECT * FROM minhatabela WHERE email = '".$email."'");

if(mysql_num_rows($query) > 0){
	
	$rs = mysql_fetch_array($query);

	$senha_banco = $rs["senha"];
	
	$msg = "<font face=\"Verdana\" size=\"2\">Recuperação de senha</font><br /><br />";
    $msg .= "<font face=\"Verdana\" size=\"2\"><strong>Sua senha é:</strong>".$senha_banco."</font><br /><br />";

	$mensagem = $msg;
	$destinatario = $email;
	$assunto = "Recuperação de senha";
	$headers = "Content-type: text/html; charset=iso-8859-1";
	$headers .= "Bcc: meuemail@meudominio.com";
	
	ini_set('sendmail_from', 'postmaster@meudominio.com');
	mail($destinatario, $assunto, $mensagem, $headers);
	
	$erro = "Mensagem enviada com sucesso!";
}
else{
	$erro = "Seu e-mail não consta em nossa base de dados!";
}

?>

Valeu!!! Abs

Edição feita por: marcosbin, 09/03/2010, 17:26.


#6 Crab

Crab

    Da paz, mas preparado para Guerra

  • Ex-Admins
  • 2521 posts
  • Sexo:Masculino
  • Localidade:Florianópolis - SC
  • Interesses:Desenvolvimento Gráfico e Web.

Posted 09/03/2010, 17:27

Marcos eu realmente esqueci o $rs, e de alterar lá na função mail() de $mensagem pra $msg... mas foi só isso.
O resto vc está equivocado.

Pra que atribuir $msg pra $mensagem.

Use $msg direto...

E quanto à isso...

<?php echo $erro ?>

... desta forma, está errado, pois veja bem...

Entenda que usando o isset($_POST['submit]) a variável $erro só estará definida quando o form for enviado... pois o arquivo que define a var $erro só é executado se o form é enviado.

Então para exibir a mensagem de erro ali abaixo do form, no mínimo também deve fazer a verificação se a var $erro está definida , senão atribua NULL.
De outra forma irá gerar NOTICES ou até WARNINGS se não me engano, mas acho que apenas NOTICES.

Então ficaria assim corrigido:

senha.php

<html>
<head>...</head>
<body>

<?php 

if (isset($_POST['submit'])){

    include("recuperasenha.php");

}

?>

<form name="senha" action="<?php $_SERVER['PHP_SELF'];?>" method="post">

    E-mail:<br />
    <input type="text" name="email " size="40" /><br /><br />

    <input type="submit" name="submit" value="OK" />

</form>

<?php echo (isset($erro)) ? $erro : NULL; ?>

</body>
</html>



recuperasenha.php

<?php

include "conexao.php";

$email = $_POST['email'];

$query = mysql_query("SELECT * FROM minhatabela WHERE email = '".$email."'");

if (mysql_num_rows($query) > 0){

    $rs = mysql_fetch_array($query);

    $senha_banco = $rs['senha'];

    $msg = "<font face=\"Verdana\" size=\"2\">Recuperação de senha</font><br /><br />";
    $msg .= "<font face=\"Verdana\" size=\"2\"><strong>Sua senha é:</strong>".$senha_banco."</font><br /><br />";

    $destinatario = $email;
    $assunto = "Recuperação de senha";
    $headers = "Content-type: text/html; charset=iso-8859-1";
    $headers .= "Bcc: meuemail@meudominio.com";

    ini_set('sendmail_from', 'postmaster@meudominio.com');

    mail($destinatario, $assunto, $msg, $headers);

    $erro = "Mensagem enviada com sucesso";
}
else{

    $erro = "Seu e-mail não consta em nossa base de dados!";

}

?>
Até mais

#7 marcosbin

marcosbin

    Turista

  • Usuários
  • 36 posts
  • Sexo:Não informado

Posted 09/03/2010, 22:19

Oi Crab

Mais uma vez, muito obrigado pela força. Quem sou eu pra dar pitaco, só queria mostrar pra quem achar esta página pelos Googles da vida como ficou o código final.

O $rs realmente era necessário, pois a senha não estava mais chegando ao e-mail. $msg = $mensagem não era, mas no código que vc postou inicialmente o $msg estava definido e o $mensagem era chamado na função mail. Veja lá. Aí, eu igualei tudo como $mensagem, mas realmente poderia ter sido $msg.

Com o $erro aconteceu algo parecido. No código do arquivo senha.php que vc postou, não havia menção a ele. A mensagem era definida para acerto ou erro no recuperasenha.php, mas não era chamada no senha.php. Eu usei echo $senha e funcionou. Mas se o isset($erro) com NULL é o mais correto, vou mudar agora mesmo.

Como falei, ainda estou iniciando em PHP e aprendendo muito aqui no fórum com vcs. Valeu pela ajuda. Abs

Edição feita por: marcosbin, 09/03/2010, 22:21.


#8 Crab

Crab

    Da paz, mas preparado para Guerra

  • Ex-Admins
  • 2521 posts
  • Sexo:Masculino
  • Localidade:Florianópolis - SC
  • Interesses:Desenvolvimento Gráfico e Web.

Posted 10/03/2010, 00:24

é... quanto à $msg e $mensagem eu mesmo mencionei no meu último post acima, que esqueci de mudar na função mail()... veja lá tbm.
Mas postei correto depois.

Na correria esqueci alguns pontos... mas é falta de atenção... acontece nas melhores famílias kkkkkkkkkkk
Legal que tu estava ligado... sinal que tá afim de aprender mesmo e não ficar no copy and paste

Mas se ajudou, considere apertar o botão verde kkkkkkkkk

Abraço Até mais




1 user(s) are reading this topic

0 membro(s), 1 visitante(s) e 0 membros anônimo(s)

IPB Skin By Virteq