2
respostas

o uso de session me deixou confuso

Achei esse código uma bagunça. Como eu sei o que são cada uma dessas sessions se todas possuem o mesmo nome? Existe uma forma melhor de fazer isso?

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

            <h1>Bem vindo!</h1>

            <?php if(isset($_SESSION['success'])) {    ?>
                <p class="alert-success"><?= $_SESSION["success"] ?></p>
            <?php unset($_SESSION['success']);
            } ?>

            <?php if(isset($_SESSION['danger'])) { ?>
                <p class="alert-danger"><?= $_SESSION['danger'] ?></p>
            <?php } ?>

            <?php if(isset($_SESSION['danger'])) { ?>
                <p class="alert-danger"><?= $_SESSION['danger'] ?></p>
            <?php unset($_SESSION['danger']);
            } ?>

            <?php #deslogado com sucesso
            if(isset($_SESSION["success"])) { ?>
                <p class="alert-success"><?= $_SESSION["success"] ?></p>
            <?php } ?>

            <?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 type="submit" class="btn btn-primary">Login</button></td>
                        </tr>
                    </table>
                </form>

        <?php } ?>
<?php include("rodape.php"); ?>
//logica-usuario.php
<?php
session_start();
function usuarioEstaLogado() {
  return isset($_SESSION["usuario_logado"]);
}

function verificaUsuario()  {
  if(!usuarioEstaLogado()) {
    $_SESSION["danger"] = "Você não tem acesso a esta funcionalidade.";
    header("Location: index.php");
    die();
  }
}

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

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

function logout() {
  session_destroy();
  session_start();
}

?>

Tentei colocar uma dentro de uma função mas parece que não posso passar para a função isset() uma outra função como parâmetro. Algo como:

function chamaSessionDeslogado() {
    $_SESSION["success"] = "Deslogado com sucesso.";
}

//no index.php:
<?php #deslogado com sucesso
            if(isset(chamaSessionDeslogado())) { ?>
                <p class="alert-success"><?= $_SESSION["success"] ?></p>
            <?php } ?>
2 respostas

Bom dia Geovane, tudo bem? Existe uma duplicidade na primeira parte do código em relação a exibição das mensagens utilizando $_SESSION['success'] e ['danger']. Em ambos os casos estão exibindo as respectivas mensagens, porém duas delas existe o unset após a exibição, que teoricamente está correto em TER, você não vai querer guardar a mensagem de "Sucesso" ou "Algo está incorreto para sempre", correto?

Então, poderia manter somente o caso de Success e Danger com o unset logo em seguida.

Minha sugestão para melhorar esse código, seria essa: Essas mensagens de success, danger, enfim, podemos tratar como sendo "Notificações", certo? Então, podemos criar uma classe chamada Notificacao, onde podemos criar vários tipos de possibilidades de notificações, como, sucesso (success), erro (danger), warning, info. (Se você notar, essa são os 4 tipos de notificações existentes no Bootstrap, lembra disso?)

E ai você pode também trabalhar com $_SESSION dentro da classe de Notificacao para fazer essas notificações, e no seu código index.php faça somente um local que vai exibir essas notificações ao invés de fazer um para cada STATUS.

Poderia ser algo assim:

<?php if(Notificacao::exists()) {    ?>
<p class="alert-Notificacao::getStatus()"><?= Notificacao::getMensagem() ?></p>
<?php Notificacao::destroiMensagem()
} ?>

Pegou a ideia? Espero ter ajudado

Abraços

Eae, Marcelo. Cara não estou entendendo muito bem o código dessa aula. Vamos por partes: 1) Preciso entender o $_SESSION. Ele seria como uma chave (ou tag) que possui um valor genérico, (exemplo: "mensagem qualquer") ? 2) Você disse "você não vai querer guardar a mensagem de "Sucesso" ou "Algo está incorreto para sempre". O que exatamente significa essa linha unset($_SESSION['danger']) ? 3) estou colocando o código antes das alterações. Veja que eu tinha 4 ifs que verificava um parâmetro na minha requisição. Aí fiz a substituição pelas sessions e então virou uma bagunça.

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

<?php if(isset($_GET["logout"]) && $_GET["logout"]==true) { ?>
  <p class="alert-success">Deslogado com sucesso!</p>
<?php } ?>

<?php if(isset($_GET["login"]) && $_GET["login"]==true) { ?>
  <p class="alert-success">Logado com sucesso!</p>
<?php } ?>

<?php if(isset($_GET["login"]) && $_GET["login"]==false) { ?>
    <p class="alert-danger">Usuário ou senha inválida!</p>
<?php } ?>

<?php if(isset($_GET["falhaDeSeguranca"]) && $_GET["falhaDeSeguranca"]==true) { ?>
    <p class="alert-danger">Você não tem acesso a essa funcionalidade!</p>
<?php } ?>

4) Você disse que tem sessions sobrando, como conseguiu perceber se não viu todo o código?. É isso que não estou conseguindo pegar/entender. Não consigo entender qual session tem que valor... 5) Sobre ter sessions sobrando, bom você não está totalmente errado. A mensagem "Você não tem acesso a essa funcionalidade" está aparecendo duplicada, provavelmente porque devo ter duas session com o mesmo valor. 6) Esqueci de postar, mas existe um outro arquivo com session:

<?php
include 'logica-usuario.php';
logout();
$_SESSION["success"] = "Deslogado com sucesso.";
header("Location: index.php");
die();
 ?>

7) Obrigado por sua sugestão, talvez eu a implemente no fim do curso. Por enquanto vou seguir as aulas. Também dei uma zapeada na aula seguinte a esta e vi que é feito uma refatoração que deve deixar o código mais claro. Bom, o meu principal objetivo com esse post é tentar entender como identificar qual session tem que valor, e também como o navegador consegue identificar isso.