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

Warning: Cannot modify header information - headers already sent by (output started at /storage/ssd4/941/8409941/public_html/cabecalho.php:1) in /storage/ssd4/941/8409941/public_html/remove-produto.php on line 8

Alguem pode me ajudar por favor? Muito obrigado desde já. O mesmo erro ocorre quando subo a aplicação disponibilizada para download do proprio curso, ele deleta o produto, mas a mensagem continua aparecendo, tanto na minha aplicação como na que baixei para verificar se o erro era meu. Segue códigos:

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

<?php if (array_key_exists("removido", $_GET) && $_GET["removido"] == true) { ?>
    <p class="alert-success">Produto apagado com sucesso.</p>
<?php } ?>

<table class="table table-striped table-bordered">
    <?php
        $produtos = listaProdutos($conexao);
        foreach ($produtos as $produto) :
    ?>
    <tr>
        <td><?=$produto['nome']?></td>
        <td><?=$produto['preco']?></td>
        <td><?=substr($produto['descricao'], 0, 40)?></td>
        <td><?=$produto['categoria_nome']?></td>
        <td><a class="btn btn-primary" href="produto-altera-formulario.php?id=<?=$produto['id']?>">alterar</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
        endforeach
    ?>
</table>
<?php include("rodape.php"); ?>
-remove-produto
<?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();
?>
-banco-produto
<?php
function listaProdutos($conexao) {
    $produtos = array();
    $resultado = mysqli_query($conexao, "select p.*, c.nome as categoria_nome from produtos as p join categorias as c on c.id=p.categoria_id");

    while ($produto = mysqli_fetch_assoc($resultado)) {
        array_push($produtos, $produto);
    }
    return $produtos;
}

function insereProduto($conexao, $nome, $preco, $descricao, $categoria_id, $usado) {
    $query   = "insert into produtos (nome, preco, descricao, categoria_id, usado) values ('{$nome}', {$preco}, '{$descricao}', {$categoria_id}, {$usado})";
    $resultadoDaInsercao = mysqli_query($conexao, $query);
    return $resultadoDaInsercao;
}

function alteraProduto($conexao, $id, $nome, $preco, $descricao, $categoria_id, $usado) {
    $query   = "update produtos set nome = '{$nome}', preco = {$preco}, descricao = '{$descricao}', categoria_id = {$categoria_id}, usado = {$usado}) where id = {$id}";
    echo $query;
    return mysqli_query($conexao, $query);
}
function buscaProduto($conexao, $id) {
    $query   = "select * from produtos where id = {$id}";
    $resultado = mysqli_query($conexao, $query);
    return mysqli_fetch_assoc($resultado);
}

function removeProduto($conexao, $id) {
    $query = "delete from produtos where id = {$id}";
    return mysqli_query($conexao, $query);
}
3 respostas
solução!

Oi Thiago, tudo bom?

Pelo erro:

Cannot modify header information - headers already sent by (output started at /storage/ssd4/941/8409941/public_html/cabecalho.php:1) in /storage/ssd4/941/8409941/public_html/remove-produto.php on line 8

Temos um problema na reescrita do header. Que já começou a ser reescrito no cabecalho.php e o erro estora no produto.php na linha 8.

Isso acontece porque funções que enviam/modificam headers HTTP devem ser chamadas antes de que qualquer output seja feito.

Ou seja, a partir do momento que você cham a função header, você não pode imprimir nada, nem espaços em branco. Verifica se a função remove-produto não tem um espaço em branco após o die(); perto da linha 8 do arquivo remove-produto.php =)

Esse erro na verdade é bom comum e você encontra muitas discussões na internet sobre ele, se você quiser da uma olhada nesse post aqui aqui que tanto o posto quanto os comentários tem discussões bem parecidas sobre causas =)

Qualquer problema é só falar

Abraço

Muito obrigado, André. Eu tinha comentado o include do cabeçalho e resolveu, depois do exercício onde alteramos para require-once, voltei a chamar o cabeçalho e o erro não ocorreu mais. De qualquer forma, havia um "Enter" depois do fechamento do ?> não sei se pode ter sido isso?

Opa, o enter depois do fechamento da tag é um dos principais motivos haha

Fico feliz que tenha resolvido =)

Abraço!