3
respostas

O alert não exibe na tela

Já faz um tempo tentando resolver e não mostra o alert no meu projeto, toda vez que removo o produto a mensagem não aparece e não sei como resolver isso?

cabecalho.php

<?php
    error_reporting(E_ALL ^ E_NOTICE);#reporta todos os erros do php exceto os notices
    include("exibir-alerta.php");    
?>

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8">
    <title>Atacadão da construção</title>
    <link rel="stylesheet" type="text/css" href="bootstrap/css/bootstrap.css">
    <link rel="stylesheet" type="text/css" href="css/loja.css">
    <link rel="stylesheet" type="text/css" href="css/estilo.css">
</head>
<body>
    <div class="container">
        <div class="principal">
            <div class="navbar navbar-inverse navbar-fixed-top">
                <div class="container-fluid">
                    <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">Adicionar produto</a></li>
                            <li><a href="listar-produto.php">Produtos</a></li>
                            <li><a href="sobre.php">Sobre</a></li>
                        </ul>
                    </div>
                </div>
            </div>

            <?php  exibirAlerta("success"); ?>
            <?php exibirAlerta("danger"); ?>

listar-produto.php

<?php

    include_once "cabecalho.php";
    include_once "conexao.php";
    include_once "persistencia.php";
    include_once "banco-categoria.php";
    include_once "logica-usuario.php";

?>

    <h1>Produtos</h1><br><br>

    <table class="table table-striped table-bordered tabela">

    <?php

    $produtos = listarProdutos($conn);

    foreach ($produtos as $produto) {

    ?>

        <tr>
            <td><?= $produto['nome']?></td>
            <td><?= $produto['preco']?></td>
            <td><?= $produto['quantidade']?></td>
            <td><?= substr($produto['descricao'], 0, 15)?></td>
            <td><?= $produto['categoria_nome']?></td>
            <td><a class="btn btn-primary" href="editar-formulario.php?id=<?=$produto['id']?>">Editar</a></td>
            <td>
                <form action="remove-produto.php" method="POST">
                    <input type="hidden" name="id" value="<?= $produto['id']?>">
                    <button class="btn btn-danger">Remover</button>
                </form>
            </td>
        </tr>

<?php

    }    

?>

    </table>

    <a class="btn btn-default voltar" href="index.php">Voltar</a> 

<?php

    include_once "rodape.php";

?>

remove-produto.php

<?php

    include_once "cabecalho.php";
    include_once "conexao.php";
    include_once "persistencia.php";
    include_once "logica-usuario.php";

    $id = $_POST["id"];

    verificaUsuario();

    session_start();

    if(removerProduto($conn, $id)){
        $_SESSION["sucess"] = "Produto removido com sucesso.";
        header("Location: listar-produto.php");
        die();    
    }else{
        $_SESSION["danger"] = "Não é possível remover o produto.";
        header("Location: listar-produto.php");
        die();    
    }

?>

<?php

    include_once "rodape.php";
?>
3 respostas

Oi Grasiela, tudo bom?

Dei uma olhada aqui no seu código e realmente não parece ter nada estranho no que você compartilhou aqui com a gente.

Acredito que o problema possa estar na função exibirAlerta, já que é a única parte do código que você não compartilhou com a gente.

Manda pra gente ver como está essa função? =)

Se você quiser, pode subir seu projeto no git e compartilhar aqui que eu subo na minha máquina e faço os testes necessários.

Abraço!

Certo, perdão pela demora. Segue o link do projeto do Github https://github.com/GrasielaMach14/loja.git

Oi Grasiela, perdão pela demora no retorno.

Dei uma olhada no seu código. E, pela declaração da função exibeAlerta:

function exibirAlerta($tipo){ //Esta função mostrará na tela todos os alerts de diferentes tipos
        session_start();//sempre que carregar o arquivo, a sessão já existirá
        if(isset($_SESSION[$tipo])) {
            ?>
            <p class="alert-<?= $tipo ?>"><?= $_SESSION[$tipo]?></p>
            <?php
            unset($_SESSION[$tipo]);
        }
    }

Estamos verificando se o $_SESSION[$tipo] está definido. Se a mensagem não está sendo exibida é porque esse valor também está vazio.

Tenta verificar o que está sendo passado pra função exibirAlerta com um var_dump:

       var_dump($_SESSION);

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

Outra coisa, evitar inicializar a sessão diversas vezes na mesma requisição. O session_start, em versões mais novas do PHP, lança um erro ao ser chamado mais de uma vez por conta da inicialização dos headers.

Retira o session_start da sua função exibirAlerta e garanta que a sessão será inicializada antes da requisição chegar nessa função.

Se não me engano, o próprio cabecalho.php costuma fazer isso já que ele é chamado uma vez só por requisição =)

Outro ponto importante de ressaltar, o success/danger só são definidos na sessão após o envio do e-mail no envia-contato.php:

if ($mail->send()) {
    $_SESSION['success'] = "Mensagem enviada com sucesso.";
    header("Location: index.php");
}else{
    $_SESSION['danger'] = "Erro ao enviar mensagem" . $mail->ErrorInfo;
    header("Location: contato.php");
}

Tenta verificar se sua requisição realmente passa por aqui, adicionando um var_dump antes do if. Algo como:

$enviou = $mail->send();
var_dump("Enviou o e-mail");
var_dump($enviou);
if($enviou) {
    $_SESSION['success'] = "Mensagem enviada com sucesso.";
    header("Location: index.php");
}else{
    $_SESSION['danger'] = "Erro ao enviar mensagem" . $mail->ErrorInfo;
    header("Location: contato.php");
}

Compartilha aqui com a gente os resultados =)

Abraço!

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software