php – – header – Cannot modify header information – headers already sent by
[17-Sep-2014 13:47:34 Europe/Berlin] PHP Warning: Cannot modify header information – headers already sent by (output started at C:\inetpub\wwwroot\systemtest\dev\vp_test_header_2.php:11) in C:\inetpub\wwwroot\systemtest\dev\vp_test_header_2.php on line 21
Tohle je zdůvodnění. Problém se dá částečně eliminovat, viz dále níže.
Z PHP.NET:
- Remember that header() must be called before any actual output is sent, either by normal HTML tags, blank lines in a file, or from PHP. It is a very common error to read code with include, or require, functions, or another file access function, and have spaces or empty lines that are output before header() is called. The same problem exists when using a single PHP/HTML file.
Z Jakpsatweb.cz:
- headers already sent…
Pokud už byl generovaný nějaký výstup, tak už nelze používat funkce header(), setcookie() ani session_start(). Jejich volání skončí chybou.
Přesvědčete se, že před začátkem <?php ?> není žádný text (ani mezera) a že nebylo nic odesláno třeba funkcemi jako echo nebo print.
Jestliže se ve skriptu volá session_start(), je obvykle rozumné volání dát hned jako první příkaz, případně nejblíže začátku skriptu jak je možné.
Pokud je text v UTF-8, tím výstupem může být i tzv. BOM signatura, vizte výše zmíněný Divný znak (čtvereček). - Divný znak (čtvereček) na začátku includovaného souboru v UTF-8
Soubor v kódování UTF-8 a UTF-16 může začínat takzvanou BOM signaturou. V případě UTF-8 je sice zcela zbytečná, přesto ji některé editory vkládají.
Řešením je ve svém editoru nastavit, aby BOM nevkládal (v PSPadu Nastavení » Nastavení Programu » Program 2), nebo to nějakým způsobem odmazat. V některých editorech to nelze.
Jak eliminovat:
- V php.ini nastavit: output_buffering = 4096.
- Skripty začínat funkcí ob_start(); – zkoušel jsem to u i bez ní, také to fungovalo.