Suas ideias em realidade digital!
O erro Cannot modify header information - headers already sent acontece quando o PHP tenta enviar um header
(como header("Location: ..."), cookies ou sessão), mas o servidor já começou a enviar conteúdo para o navegador.
Em outras palavras: saída (output) aconteceu antes do header.
no início do arquivo.
- Espaços/linhas após o
?> no final do arquivo (ideal: nem use ?> em PHP puro).
- Echo/print/var_dump antes do
header().
- Includes/require que “soltam” HTML ou espaços sem você perceber.
- BOM (UTF-8 BOM) no começo do arquivo (muito comum no Windows/editores).
- Mensagens de warning/notice exibidas antes do header (ex: undefined variable/index).
Exemplo clássico do erro
✅ Correto
Como descobrir quem “enviou saída” primeiro
A mensagem geralmente mostra algo como:
output started at /caminho/arquivo.php:12.
Esse é o ponto onde começou a saída.
Abra esse arquivo e verifique:
- se existe HTML “solto” antes do PHP
- se tem espaços/linhas antes do
- se existe
?> no final com espaços depois
1) Remova o fechamento ?> (boa prática)
Se o arquivo é só PHP, prefira terminar sem ?>. Isso evita espaços acidentais no final.
2) Atenção ao BOM (UTF-8 BOM)
O BOM é um “marcador invisível” que alguns editores colocam no começo do arquivo.
Isso conta como saída e quebra o header().
- No VS Code: salve como UTF-8 (sem BOM).
- Se estiver em Windows/Notepad++: procure por “UTF-8 BOM” e converta.
3) Includes: o vilão silencioso
Se você faz include de um arquivo que tem HTML/echo antes, ele pode causar o erro.
Exemplo:
Solução: faça redirecionamento antes, ou reorganize a ordem:
4) “Output buffering” (quando você precisa salvar tempo)
Se seu projeto é grande e você não consegue corrigir tudo agora, dá pra usar buffer:
Observação: isso é um “band-aid”. O ideal é corrigir a origem (BOM/echo/espaços).
5) Sessão e cookies também geram “headers”
Funções como session_start() e setcookie() precisam rodar antes de qualquer saída.
Sempre coloque no topo:
Checklist rápido (copiar e colar)
- [ ] Não existe nada antes do
- [ ] Arquivo salvo em UTF-8 sem BOM
- [ ] Removi
?> no final (arquivos PHP puros)
- [ ] Não tem
echo/print/var_dump antes de header()
- [ ]
session_start() está no topo
- [ ] Includes não estão imprimindo saída antes do redirecionamento