Solucionado (ver solução)
Solucionado
(ver solução)
14
respostas

Aula 4 - Formulário de login continua aparecendo após logar

O erro começou a aparecer após utilizar a SESSION e a função usuarioEstaLogado() na estrutura IF antes do formulário de login.

O login não é realizado. Continua voltando para o formulário de login, porém o cookie aparece. Seguem os códigos da página 'index.php' e da página 'logica-usuario.php'.

LOGICA-USUARIO.PHP

<?php
session_start();
function usuarioEstaLogado() {
    return isset($_SESSION["usuario_logado"]);
}

function verificaUsuario() {
    if(!usuarioEstaLogado()) {
        header("Location: index.php?falhaDeSeguranca=true");
        die();
    }
}

function usuarioLogado() {
    return $_SESSION["usuario_logado"];
}

function logaUsuario($email) {
    $_SESSION["usuario_logado"] = $email;
}

function logout() {
    session_destroy();
}

INDEX.PHP

<?php include("cabecalho.php");
include("logica-usuario.php");
?>


<?php if(isset($_GET["logout"]) && $_GET["logout"]==true) { ?>
    <p class="alert-success">Deslogado com sucesso!</a>
<?php }?>
<?php if(isset($_GET["login"]) && $_GET["login"]==true) { ?>
    <p class="alert-success">Logado com sucesso!</a>
<?php }?>
<?php if(isset($_GET["login"]) && $_GET["login"]==false) { ?>
    <p class="alert-danger">Usuário ou senha inválida!</a>
<?php }?>
<?php if(isset($_GET["falhaDeSeguranca"]) && $_GET["falhaDeSeguranca"]==true) { ?>
    <p class="alert-danger">Você não tem acesso a essa funcionalidade!</a>
<?php }?>

            <h1>Bem vindo!</h1>

<?php if(usuarioEstaLogado()) { ?>
    <p class="text-success">Você está logado como <?= usuarioLogado() ?>. <a href="logout.php">Deslogar</a></p>
<?php } else {?>

            <h2>Login</h2>
            <form action="login.php" method="post">
            <table class="table">
                <tr>
                    <td>Email</td>
                    <td><input class="form-control" type="email" name="email"></td>
                </tr>
                <tr>
                    <td>Senha</td>
                    <td><input class="form-control" type="password" name="senha"></td>
                </tr>
                <tr>
                    <td><button class="btn btn-primary">Login</button></td>
                </tr>
            </table>
            </form>

<?php } ?> 

<?php include("rodape.php");?>
14 respostas

Fábio,

antes de colocar um código, clica em "< > INSERIR CÓDIGO", ele abre uns sinais e você deve colocar seu código entre os dois grupos de três sinais. Daí seu código aparece formatado. Se deixar assim, a plataforma vai tentar renderizar seu código, como o botão Login, que está aparecendo como botão e não o seu código... hehe. Você pode editar o mesmo post, pra facilitar.

Abraço.

Alguém poderia me ajudar? Esse erro que ainda não encontrei está impedindo o meu progresso no curso.

Fábio, Boa tarde!

Para que eu possa te ajudar melhor, preciso ver o código de 'cabecalho.php', 'rodape.php' e principalmente 'login.php'.

Apenas olhando o seu código, sem esses arquivos acima, percebi que o seu form não tem botão de submit, pois o botão 'Login' não faz nada. Apenas existe em tela, mas sem event listener.

Fico à disposição.

CABECALHO.PHP

<html>
<head>
    <meta charset="utf-8">
    <title>Minha Loja</title>
    <link href="css/bootstrap.css" rel="stylesheet">
    <link href="css/bootstrap-theme.css" rel="stylesheet">
    <link href="css/bootstrap-theme.min.css" rel="stylesheet">
    <link href="css/bootstrap-theme.css" rel="stylesheet">
    <link href="css/bootstrap.min.css" rel="stylesheet">
    <link href="css/loja.css" rel="stylesheet">
</head>
<body>

    <div class="navbar navbar-inverse navbar-fixed-top">
        <div class="container">
            <div class="navbar-header">
                <a class="navbar-brand" href="index.php">Minha Loja</a>
            </div>
            <div>
                <ul class="nav navbar-nav">
                    <li><a href="produto-formulario.php">Adiciona Produto</a></li>
                    <li><a href="produto-lista.php">Produtos</a></li>
                    <li><a href="sobre.php">Sobre</a></li>
                </ul>
            </div>
        </div>
    </div>

    <div class="container">
        <div class="principal">

RODAPE.PHP

        </div>
    </div>
</body>



</html>

LOGIN.PHP

<?php include("conecta.php");
include ("banco-usuario.php");
include ("logica-usuario.php");

$usuario = buscaUsuario($conexao, $_POST["email"], $_POST["senha"]);

if($usuario == null) {
    header("Location: index.php?login=0");
} else {
    logaUsuario();
    header("Location: index.php?login=true");
}
die();

Fábio, você está terminando o script sempre no arquivo login.php. Essa sua função die(); é executada toda vez.

Faz um teste: comenta a chamada da função die(); no arquivo login.php e testa.

Dá um retorno.

Abraço.

Fala Manoel. Fiz o que me sugeriu mas não funcionou.

Fábio, Boa tarde!

Considerando que seus arquivos conecta.php, banco-usuario.php e a funcao buscaUsuario() estão todos corretos e retornando o usuario, basta acrescentar o $email do usuário na chamada do método logaUsuario() que resolve.

A assinatura do método é "function logaUsuario($email) ", mas você está invocando o método apenas assim "logaUsuario();".

Ajustei aqui e deu certo.

Fábio, boa tarde!

Funcionou a solução proposta? Caso não, só avisar para tentar ajudar.

Caso sim, você pode marcar como solucionado para somar à minha XP.

Obrigado!

Boa tarde Juliano. Fiz e não funcionou.

Estou impressionado como até o presente momento nenhum instrutor ou orientador da Alura se prontificou a me ajudar. Apenas os colegas de curso tentaram me auxiliar até o presente momento, o que me faz grato aos colegas, e insatisfeito com a atenção do curso.

Bom dia Fábio!

Quase esgotei minhas tentativas, pois aqui funcionou. Repliquei o seu código e deu certo. Pode ser que tenha algo 'escondido' em conecta.php ou banco-usuario.php causando os problemas.

Podes compartilhar o código desses dois arquivos para que eu possa analisar novamente?

Obrigado!

CONECTA.PHP

<?php
$conexao = mysqli_connect("localhost", "root", "", "loja");

BANCO-USUARIO.PHP

<?php
function buscaUsuario($conexao, $email, $senha) {
    $senhaMD5 = md5($senha);
    $query = "select * from usuarios where email='{$email}' and senha='{$senhaMD5}'";
    $resultado = mysqli_query($conexao, $query);
    $usuario = mysqli_fetch_assoc($resultado);

    return $usuario;
}

Lembrando que estou com o curso parado por conta desse erro. Peço que os moderadores e instrutores da Alura se prontifiquem a ajudar.

Juliano, obrigado por estar tentando me ajudar.

solução!

Fábio,

Analisei aqui o seu código e verifiquei algumas possibilidades para ser o ponto de falha. Aqui funcionou certinho, mas claro, como eu não tenho o código completo, ao clicar nos menus, após logado, as coisas não funcionam, mas o sistema logou e meu usuário ficou ativo na seção.

Nesse caso, vamos aos detalhes que eu revisaria para deixar funcionando:

1 - A função 'buscaUsuario" do arquivo banco-usuario.php está retornando o usuário quando você preenche os dados de login e senha corretamente? Em outras palavras, o seu usuário está sendo encontrado no banco de dados?

2 - Para que a sessão seja mantida ativa, é importante que o session_start() seja chamado sempre antes de verificar se o usuário está logado. Verifiquei que está sendo chamado em 'logica-usuario.php' que por sua vez é chamado no 'index.php', mas está sendo incluido 'logica-usuario' nos demais casos de uso, de forma a garantir que a sessão sempre está inicializada?

3 - Em login.php, você tem '$usuario = buscaUsuario(...)' e tem na sequência 'logaUsuario()', a qual você precisa passar como parametro $usuario['email'].

4 - Feito isso tudo, deveria funcionar. Deconfio que buscaUsuario não está trazendo usuário da base de dados, mas você precisaria confirmar isso. Se for isso, verifique se não tem algo a ver com o MD5 da senha.

Espero ter ajudado.

Abraço!