Dziś będzie relatywnie krótki wpis – ale jak to często bywa, życie samo podrzuciło temat. Wczoraj konsultowałem pewien projekt, w którym “relatywnie nieistotny” fragment realizowany jest w PHP, i akurat pojawił się malutki problem (oczywiście nie przypadkowo – został niejako “sprowokowany” w trakcie analizowania dostępnych możliwości/rozwiązań ;-)), zapewne znany każdemu kto miał trochę więcej (choć niekoniecznie) do czynienia z PHP, czyli “Cannot modify header information”.
Spis treści w artykule
PHP i “Cannot modify header information”
Błąd pojawi się np. przy próbie ponownego wysłanie nagłówka (i/lub utworzenie ciasteczka (cookies)):
Cannot modify header information – headers already sent by…
W naszym przypadku było to polecenie przeładowania/przekierowania strony:
<?php header('Location: [ADRES URL]'); ?>
Sam kod jak i metoda przekierowania w PHP jest OK, ale akurat użyta w tym konkretnym momencie skutkowała takim właśnie błędem.
ob_start() i ob_end_flush()
Chyba najprostszym rozwiązaniem jest skorzystanie z 2 standardowych funkcji dostępnych w PHP, czyli:
- ob_start()
- ob_end_flush()
Pierwsza funkcja rozpoczyna zbieranie danych które mają być wysłane do przeglądarki (m.in. jako nagłówek), druga – co wydaje się oczywiste – kończy zbieranie i dopiero w tym momencie następuje przesłanie danych.
Całość może wyglądać np. tak:
<?php
ob_start();
[...]
if ( [WARUNEK] ) { header('Location: [ADRES URL]); }
[...]
ob_end_flush();
?>
Oczywiście już bez błędu…
- Mały dron, duże zamieszanie, czyli seria DJI Mini i zabawa w klasy (unijne klasy dla dronów) z EASA i użytkownikami - 1970-01-01
- Opcja “restore_from_flash”, czyli sposób na zapamiętywanie ustawień w ESPHome na układach ESP8266 - 1970-01-01
- Blokowe szablony powiadomień (block notice) w WooCommerce, nawet w klasycznych motywach - 1970-01-01