Solucionado (ver solução)

Importante

Você está vendo a versão anterior da nova experiência da Alura que estamos preparando para você. Em breve, ela ganha uma identidade visual novinha totalmente pensada em potencializar seus estudos!

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!