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

Erro do header location

Nesta etapa do curso, dá a msg de erro de header, pesmo baixando os fontes do site da alura.

Warning: Cannot modify header information - headers already sent by (output started at C:\xampp\htdocs\testes\cabecalho.php:4) in C:\xampp\htdocs\testes\logica-usuario.php on line 11 Call Stack

Time Memory Function Location

1 0.0006 350648 {main}( ) ...\produto-formulario.php:0 2 0.0030 371376 verificaUsuario( ) ...\produto-formulario.php:6 3 0.0030 371600 header ( ) ...\logica-usuario.php:11

5 respostas

Oi Fernanda, cola o logica-usuario.php aqui pra gente ver por favor?

<?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();
}

```

Oi Fernanda, em que momento dá esse erro? Quando está cadastrando um novo produto? Cola aqui pra mim também o cabecalho.php e o produto-formulario.php por favor?

Desculpa a demora a retornar aqui.

Isso. Quando clica na opção adiciona produto. segue o cabeçalho e o produto-formulário

cabeçalho

<?php
error_reporting(E_ALL ^ E_NOTICE);
require_once("mostra-alerta.php"); ?>
<html>
<head>
    <meta charset="utf-8">
    <title>Minha Loja</title>
    <link href="css/bootstrap.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="contato.php">Contato</a></li>
                </ul>
            </div>
        </div>
    </div>

    <div class="container">
        <div class="principal">
            <?php  mostraAlerta("success"); ?>
            <?php mostraAlerta("danger"); ?>

formulário

<?php
require_once("cabecalho.php");
require_once("banco-categoria.php");
require_once("logica-usuario.php");
require_once("class/Produto.php");
require_once("class/Categoria.php");

verificaUsuario();

$categoria = new Categoria();
$categoria->id = 1;

$produto = new Produto();
$produto->categoria = $categoria;

$categorias = listaCategorias($conexao);

?>    

<h1>Formulário de produto</h1>
<form action="adiciona-produto.php" method="post">
    <table class="table">

        <?php include("produto-formulario-base.php"); ?>

        <tr>
            <td>
                <button class="btn btn-primary" type="submit">Cadastrar</button>
            </td>
        </tr>
    </table>
</form>

<?php include("rodape.php"); ?>
solução!

Oi Fernanda, no seu formulário, usa a função verificaUsuario antes de importar o cabeçalho que deve resolver tá bem?

Só pra te explicar o problema: no verifica usuário, você está fazendo um teste e redirecionando o usuário de acordo com uma lógica, certo? Acontece que esse redirecionamento está acontecendo depois de que você já deu uma resposta pro navegador. A resposta é o cabeçalho que já possui um html que será exibido.

De regra, a gente não pode redirecionar o usuário por que o usuário já recebeu a página html, entende? O redirecionamento precisa ser feito antes mesmo de qualquer html ir para a página.

Como ficará o código:

<?php
require_once("banco-categoria.php");
require_once("logica-usuario.php");
require_once("class/Produto.php");
require_once("class/Categoria.php");

verificaUsuario();

require_once("cabecalho.php");