11
respostas

Problema com header - "Warning: Cannot modify header information"

Meu header: Location só funciona quando eu seto antes de tudo. No código da aula ele é setado depois de cabecalho.php e funciona normalmente. Em pesquisas na internet eu achei informações de que não pode setar headers depois de qualquer instrução HTML, mas no código da aula funciona. Por quê?

11 respostas

Não assisti as aulas, mas, um header http só pode ser enviado antes de qualquer conteúdo ser enviado. No curso, o arquivo cabecalho.php exibe algum conteúdo, ou só define dados?

Caso algo seja exibido antes de enviar um header(""), você receberá um erro.

Então, o cabechalho. php tem sim conteúdo HTML e na vídeo-aula o header vem depois e redirecionou normalmente.

Bom, muito estranho. Isso não é possível em PHP. Caso este fórum ainda esteja aberto quando eu fizer o curso, comento aqui.

Nilson, consegue compartilhar seu código?

É o código da aula (PHP, Mysql e Fundamentos da Web). Mais precisamente na posição 6m16s da vídeo-aula que ele cria o header no remove-produto.php.

cabecalho.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="sobre.php">Sobre</a></li>
                </ul>
            </div>
        </div>
    </div>


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

remove-produto.php

<?php include("cabecalho.php");         
 include("conecta.php");            
 include("banco-produto.php"); 

 $id = $_POST['id'];
 removeProduto($conexao, $id);
 header("Location: produto-lista.php?removido=true");
 die();
 ?>

Ops... Curso: PHP, Mysql e Fundamentos da Web Aula: 6 (Deletando produtos).

Estranho, seu código não está errado, o que está acontecendo? Ele apenas não redireciona? Nenhuma mensagem de erro? Se possível compartilha o seu banco-produto e o seu produto-lista.php para eu dar uma olhada também.

Felipe, esse código é o da aula e funciona. O meu também funciona, porém sem o "include (cabecalho.php);" - que também nem faz sentido neste código. A estranheza está neste código da aula funcionar. Achei que pudesse ser algum configuração de server ou versão de PHP, pois na net encontrei respostas de que não é possível HTML antes do header e o da aula funciona com HTML antes - que é o arquivo cabecalho.php O erro que dá está no titulo do fórum.

Se ainda está com o problema testa colocar o include("conecta.php"); antes do include("cabecalho.php"); . Já tive problemas que foram resolvidos colocando a conexão em primeiro. Não sei bem o motivo, mas isso já aconteceu em alguns pequenos projetos que fiz.

Boa noite, Nilson pode compartilhar o código que você fez para analisarmos aqui, por que quando fiz essa aula que você mencionou funcionou sem problemas.

Você pode usar o @ antes do header também para ocultar a mensagem, @header("location: ...");

O @ tem a função de ocultar o erro, não é a melhor opção, mas resolve por enquanto.