Alteração de Senha só funciona depois que fecha o navegador e abre novamente

PHP

PDO

18/02/2023

Colegas, boa tarde. Estou criando um sisteminha de login, e estou na parte de recuperação de senha. Escrevi o código para o usuário digitar o e-mail cadastrado e solicitar a redefinição. Então, ele recebe um link único no e-mail dele e, por meio desse link, abre a página de criar nova senha.

Tudo funciona. O cadastro, o login, e a alteração de senha. Exceto por um problema. Quando faço uma recuperação de senha, e retorno para a página de login, ele dá a nova senha como inválida. Aí, se eu fechar o navegador e abrir de novo, e digitar a nova senha, ele entra normalmente. E não funciona ctrl+F5. Tem que fechar e abrir.

Não faço ideia do que pode estar causando isso.

Vou postar meu código:

Página de Login:

<?php

include_once ''connect.php'';
?>

<!DOCTYPE html>
<html lang="pt-br">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content-"width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Login</title>
    <style>
        body{font-family: Arial, Helvetica, sans-serif}
        .content{display:flex;justify-content: center}
        .contato{width:100%; max-width: 500px;}
        .form{display: flex; flex-direction: column}
        .field{padding:10px; margin-bottom:15px; border:1px solid #DDD; border-radius: 5px; font-family: Arial, Helvetica, sans-serif; font-size: 16px}
        .field2{padding:10px; margin-bottom:15px; border:1px solid #ADD8E6; background-color:#ADD8E6; border-radius: 5px; font-family: Arial, Helvetica, sans-serif; font-size: 16px}
        .field2:hover{padding:10px; margin-bottom:15px; border:1px solid #87CEFA; background-color:#87CEFA;  border-radius: 5px; font-family: Arial, Helvetica, sans-serif; font-size: 16px; font-weight:bold;}
    </style>

</head>
<body>
<section class="content">
<div class="contato">
        <h2>Login</h2>
        Por favor, entre com o e-mail e a senha cadastrados.<br><br>
        <form name="cad_usu" class="form" method=post>
        <input class="field" type="email" name="email" 
               placeholder="E-mail" required>
        <input class="field" type="password" 
               name="senha" placeholder="Senha" required>
        <input class="field2" type="submit" name="SendLogin" 
               value="Entrar no Sistema">
        <input class="field2" type="reset" value="Limpar Formulário">
        <center><a href="recuperar_senha.php"><font size="2">Esqueci a senha</font></a></center>
        </form>
</div>
</section>
<?php
if(!isset($_POST[''SendLogin''])){exit;}
$dados = filter_input_array(INPUT_POST,FILTER_DEFAULT); 
$query_usuario = "SELECT * FROM usuario WHERE 
	email =:email LIMIT 1";  
$result_usuario = $conn->prepare($query_usuario);
$result_usuario->bindParam('':email'', $dados[''email'']);
$result_usuario->execute();

$row_usuario = $result_usuario->fetch(PDO::FETCH_ASSOC);
if($row_usuario && (password_verify($dados[''senha''], $row_usuario[''senha'']))) { 
        $_SESSION[''id''] = $row_usuario[''id''];
        $_SESSION[''nome''] = $row_usuario[''nome''];
        $_SESSION[''situacoe_id''] = $row_usuario[''situacoe_id''];
        $_SESSION[''niveis_acesso_id''] = $row_usuario[''niveis_acesso_id''];
        header("Location: painel.php");} else {
        echo "<div class=content><p style=''color: red''>
			Erro: Usuário e/ou senha inválidos!</p>";}      
?>
</body>
</html>


Página de Recuperação de Senha:

<?php
include_once ''connect.php'';
?>

<!DOCTYPE html>
<html lang="pt-br">
<head>
    <meta charset="UTF-8">
    <meta name="viewport" content-"width=device-width, initial-scale=1.0">
    <meta http-equiv="X-UA-Compatible" content="ie=edge">
    <title>Recuperação de Senha</title>
    <style>
        body{font-family: Arial, Helvetica, sans-serif}
        .content{display:flex;justify-content: center}
        .contato{width:100%; max-width: 500px;}
        .form{display: flex; flex-direction: column}
        .field{padding:10px; margin-bottom:15px; border:1px solid #DDD; border-radius: 5px; font-family: Arial, Helvetica, sans-serif; font-size: 16px}
        .field2{padding:10px; margin-bottom:15px; border:1px solid #ADD8E6; background-color:#ADD8E6; border-radius: 5px; font-family: Arial, Helvetica, sans-serif; font-size: 16px}
        .field2:hover{padding:10px; margin-bottom:15px; border:1px solid #87CEFA; background-color:#87CEFA;  border-radius: 5px; font-family: Arial, Helvetica, sans-serif; font-size: 16px; font-weight:bold;}
    </style>
<script>
 function confereSenha(){
     const senha = document.querySelector(''input[name=senha]'');
     const confirma_senha = document.querySelector(''input[name=confirma_senha'');
     
     if (confirma_senha.value === senha.value) {
         confirma_senha.setCustomValidity('''');
     } else {
         confirma_senha.setCustomValidity(''As senhas digitadas não conferem! Elas precisam ser iguais.'');
     }
     
 }
</script>

</head>
<body>
    
<section class="content">
<div class="contato">
        <center><h2>Recuperação de Senha</h2></center>
        <br><br>

<?php

$user = $_GET[''utilizador''];
$hash = $_GET[''confirmacao''];

$query_recupera = "SELECT * FROM recuperacao";  
$result_recupera = $conn->prepare($query_recupera);
$result_recupera->execute();
$row_recupera = $result_recupera->fetch(PDO::FETCH_ASSOC);
$user_cadastrado = $row_recupera[''email_usu''];
$hash_cadastrado = $row_recupera[''confirmacao''];

$query_usuario = "SELECT * FROM usuario WHERE email = ''$user''";
$result_usuario = $conn->prepare($query_usuario);
$result_usuario->execute();
$row_usuario = $result_usuario->fetch(PDO::FETCH_ASSOC);
$id_user = $row_usuario[''id''];
$modified = date(''Y-m-d H:i:s'');
echo $id_user;

if(!empty($_POST)){

    if($user == $user_cadastrado && $hash == $hash_cadastrado){
    
    $dados = filter_input_array(INPUT_POST, FILTER_DEFAULT);    
    $sql = "UPDATE usuario SET senha =:senha, modified =:modified WHERE id =:id";
    $statement = $conn->prepare($sql);
    $statement->bindParam('':senha'', password_hash($dados[''senha''], PASSWORD_DEFAULT));
    $statement->bindParam('':modified'', $modified);
    $statement->bindParam('':id'', $id_user);
        if($statement->execute()){
            echo "<p style=''color: green;''>Senha alterada com sucesso!</p>";
            echo "<p><a href=''login.php''>Voltar ao Login></a></p>";
            
        } else {
            
        echo "<p style=''color: red;''>Erro! Não foi possível alterar sua senha. Por favor, entre em contato com o administrador do sistema.</p>";
    
        }
    
    } else {
    echo "<p style=''color: red;''>Erro! Não foi possível alterar sua senha. Por favor, entre em contato com o administrador do sistema.</p>";
    }


} else {
    echo "";
}

    
    
  ?>
        
        
        
        <form name="cad_usu" class="form" method="POST" action="">
            <input class="field" type="password" name="senha" placeholder="Senha" required onchange=''confereSenha();''>
            <input class="field" type="password" name="confirma_senha" placeholder="Confirmar Senha" required onchange=''confereSenha();''>
            <input class="field2" type="submit" name="AlteraSenha" value="Alterar Senha">
            <input class="field2" type="reset" value="Limpar Formulário">
            
        </form>
        </div>
        
 
    </section>
     </div>  
   
</body>
</html>


E por fim, a página que abre quando clico no link recebido pelo e-mail (vou deixar o código na resposta, porque não cabe aqui):
Edilson Santiago

Edilson Santiago

Curtidas 0
POSTAR