Košík je prázdný

Chybová zpráva "Warning: Cannot modify header information - headers already sent by (output started at /path/file.php:line)" je jedním z běžných problémů, se kterými se mohou vývojáři v PHP setkat. Tato chyba obvykle nastává, když skript pokusí poslat HTTP hlavičky po tom, co byl již výstup (včetně bílých znaků, HTML tagů, echo statements atd.) odeslán klientovi. V PHP musí být všechny hlavičky odeslány před jakýmkoliv výstupem, který je odeslán na klienta. Tento článek poskytuje krok za krokem návod, jak tento problém vyřešit.

1. Identifikace problému

Prvním krokem je identifikace místa, kde došlo k odeslání výstupu. Chybová zpráva explicitně uvádí soubor a číslo řádku, kde k tomu došlo. Například, pokud chybová zpráva uvádí "/path/file.php:line", prvním krokem je otevření daného souboru a přesunutí na uvedený řádek.

2. Odstranění nechtěného výstupu

Po identifikaci problematického místa je nutné odstranit jakýkoliv výstup před voláním hlaviček. To může zahrnovat:

  • Bílé znaky: Zkontrolujte, zda před otevírací <?php tagem nebo po uzavíracím ?> tagu nejsou žádné bílé znaky, včetně mezer a nových řádků.
  • Echo, print, a další výstupní funkce: Ujistěte se, že před voláním hlaviček nepoužíváte funkce pro výstup.
  • BOM (Byte Order Mark): Pokud je váš soubor uložen s BOM, může to způsobit, že se výstup pošle před hlavičkami. Uložení souboru bez BOM může problém vyřešit.

3. Předcházení problémům

  • Vyhněte se uzavíracím PHP tagům ?> na konci souborů: Pokud PHP kód je poslední v souboru, uzavírací tag ?> není nutný a jeho vynechání zabrání náhodnému vložení bílých znaků.
  • Obalení výstupu do výstupního bufferu: Použití ob_start() na začátku skriptu a ob_end_flush() na jeho konci může zabránit nechtěným chybám tím, že se všechny hlavičky a výstupy obalí do bufferu, dokud nebudou explicitně odeslány.

4. Použití výstupního bufferování

V některých situacích, kde je potřeba flexibilita při odesílání hlaviček a výstupu, může být výstupní bufferování (ob_start(), ob_end_clean(), ob_flush(), ob_end_flush()) užitečným nástrojem. Toto umožňuje "odložit" odeslání výstupu na klienta, což dává vývojáři kontrolu nad tím, kdy jsou hlavičky a výstup skutečně odeslány.

 

Chyba "Cannot modify header information" v PHP je často způsobena nechtěným výstupem před odesláním hlaviček. Její oprava vyžaduje pečlivou revizi kódu a správné načasování odesílání hlaviček. Výstupní bufferování může poskytnout dodatečnou flexibilitu a je silným nástrojem pro zvládání komplexních situací, které vyžadují odeslání hlaviček a výstupu ve specifickém pořadí.