Створення сайтів Львів067 607 57 84
МЕНЮ

Помилка PHP: Can not add header information - headers already sent

Помилку цю виправити нескладно.
Часто таке ж повідомлення з'являється при старті сесій, в трохи іншому формулюванні:
Warning: Cannot send session cookie - headers already sent
Warning: Cannot send session cache limiter - headers already sent

Для початку дізнаємося, як взагалі спілкується браузер з сервером. Відбувається це за спеціальним протоколом HTTP. Наприклад, коли ти набрав адресу, або натискаєш на посилання, браузер посилає HTTP запит серверу. Сервер відповідає. Першими у відповіді ЗАВЖДИ йдуть HTTP заголовки. Хоч один. І тільки потім вже сервер посилає, а браузер приймає, текст, або картинку, або файл - в загальному, що було запрошено. Власне, через це правило - спочатку заголовок, а потім інформація, і відбувається дана помилка. РНР, для твоєї зручності, посилає заголовки автоматично, як тільки скрипт починає видавати браузеру інформацію. Відповідно, якщо хоч один пробіл був уже переданий користувачеві, заголовки вже пішли, і знову їх послати вже ніяк неможна. А, як ти вже, напевно, здогадався, команди header (), setcookie, session_start (), посилають HTTP заголовки.

Розберемо тепер це попередження.
Warning: Cannot add header information – headers already sent by (output started at /artkiev.com/index.php:44) on line 60

Cannot add header information – headers already sent. Все ясно написано. "Не можу послати заголовок, поїзд вже пішов" - пише нам РНР. Далі РНР повідомляє, в якому скрипті і в якому його рядку (output started at /artkiev.com/index.php:44) стався вивід інформації, який викликав автоматичну посилку заголовків. Дуже легко знайти і виправити. Може бути, там html теги, може бути, echo, а може і просто непоміченим порожній рядок або пробіл перед першим тегом.
Дуже часто таку помилку викликає файл, що підключається через include, в якому або є якийсь висновок, або порожній рядок після закриваючого PHP тега - виявити її дуже важко.

Для вирішення цієї проблеми потрібно функцію header() (або session_start(), setcookie) і всю логіку, яка її викликає, помістити ДО будь-якого виведення в браузері. Просто перенести вище в скрипті.
Адже ви все одно перенаправляєте браузер. Тобто, ніякий текст все одно не буде виведений! Значить, і виводити щось одночасно з заголовком Location немає сенсу. Правильно плануйте структуру свого скрипта: блок, який обробляє POST, не повинен нічого виводити в браузер.

Іноді ви перевірили ВСЕ - ніде нічого немає. Змініть редактор. Подивіться свій файл в іншій програмі. Наприклад, Windows Блокнот при використанні кодування Unicode додає в початок вашого файлу службовий символ Byte Order Mark, ніяк при цьому не ставлячи до відома. Відкрийте скрипт в іншому редакторі і видаліть сторонні символи. І змініть Блокнот на інший редактор.

Численні питання на форумі змушують нас зробити тут важливе зауваження:
Ця помилка з'являється не від того, що у вас в скрипті "щось написано вище". А від того, що РНР виводить щось в браузер. Це не обов'язково код. Це може бути повідомлення про помилку, може бути пробіл або html тег. Для найталановитіших: мова йде про будь-який символ, відправлений в браузер, а не тільки про ті, які браузер відображає недосвідченому користувачу. У HTML сторінок є вихідний текст. І саме він є результатом роботи PHP скрипта, а не красиві літери з картиночками, як думає дуже велика кількість людей.